Docker入门(不用入土)
了解Docker
概述
- 啥是Docker:
- Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
- Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
- Docker的优点有啥:
- Docker容器虚拟化,意味着:
1.环境隔离:
通过cgroups和namespace进行实现资源的隔离,实现一个机器运行多个容器互不影响。
2.更快速的交付部署:
利用Docker,开发人员可以使用镜像快速构建一套标准的开发环境;开发完成后,测试运维人员可以直接使用相同的环境部署代码。Docker可以快速创建和删除容器,节省大量部署时间。
3.资源利用高效:
Docker容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能。
4.移迁移扩展:
docker的容器几乎可以在任意的平台下运行。
- Docker容器虚拟化,意味着:
- 虽然现在看的云里雾里,但随着我们的后续学习,会对这些优势有一点程度上的理解
安装Docker
- 略,详见网上的各种教程
- 笔者的docker安装在centos7服务端
虚拟化与Docker
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
概念 | 描述 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API与Docker 的守护进程通信 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。DockerHub 提供了庞大的镜像集合供使用 |
使用Docker
镜像操作
1.获取镜像
docker pull<域名> / <namespace> / <repo>;<tag>
镜像是Docker运行容器的前提
用户可以从网络上下载镜像,若不指定tag,则会默认选择lastest的标签,即下载最新版(和git pull;git tag有点相似)
默认从docker官方下载,不需指定命名空间
[root@VM_0_4_centos docker]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6abc03819f3e: Pull complete
05731e63f211: Pull complete
0bd67c50d6be: Pull complete
Digest:sha256:f08638ec7ddc90065187e7eabdfac3c9
6e5ff0f6b2f1762cf31a4f49b53000a5
Status: Downloaded newer image for ubuntu:latest
2.查看镜像列表
docker images
列出本地主机上的已有镜像
表格信息含义为:来自于哪个仓库,镜像标签信息,镜像id(唯一),创建时间,大小
[root@VM_0_4_centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7698f282e524 2 weeks ago 69.9MB
hello-world latest fce289e99eb9 5 months ago 1.84kB
3.查看镜像信息
docker inspect<image_id>
返回json格式的信息,如果我们只看一项,使用-f指定
[root@VM_0_4_centos docker]# docker inspect fce289e99eb9
[
{
“Id”: “sha256:fce289e99eb9bca977dae136fbe2a82b6b7d
4c372474c9235adc1741675f587e”,
“RepoTags”: [
“hello-world:latest”
],
“RepoDigests”: [
“hello-world@sha256:0e11c388b664df8a27a901dce21eb89f1
1d8292f7fca1b3e3c4321bf7897bffe”
],
“Parent”: “”,
…
[root@VM_0_4_centos docker]# docker inspect -f{{.Id}} fce289e99eb9
sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4
c372474c9235adc1741675f587e
注意我们指定时用的是**{{.xx}}**, 点不要漏了
4.查找镜像
docker search <image_name>
可以搜索远端仓库中的共享镜像,默认搜索Docker hub官方仓库的镜像
5.删除镜像
docker rmi <image>; <tag>
img可以指定为标签或id
当一个镜像有多个标签时,只是删除其中的一个指定标签,不影响镜像文件
当只有一个tag时,删tag就是删镜像本身
当有该镜像的容器存在时,镜像文件无法被删除
[root@VM_0_4_centos docker]# docker tag fce289e99eb9 cyx:hello-world
[root@VM_0_4_centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7698f282e524 2 weeks ago 69.9MB
cyx hello-world fce289e99eb9 5 months ago 1.84kB
hello-world latest fce289e99eb9 5 months ago 1.84kB
[root@VM_0_4_centos docker]# docker rmi cyx:hello-world
Untagged: cyx:hello-world
[root@VM_0_4_centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7698f282e524 2 weeks ago 69.9MB
hello-world latest fce289e99eb9 5 months ago 1.84kB
试图删除hello-world
[root@VM_0_4_centos docker]# docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference “hello-world” (must force) - container 16aafe3a6ff9 is using its referenced image fce289e99eb9
错误,仍有容器在运行这个镜像,不建议-f,会让你的容器找不到镜像,导致混乱
6.创建镜像
docker commit <options> <container_id> <repository:tag>
-a, --auther:作者信息
-m, --message:提交信息
-p, --pause=true: 提交时暂停容器运行
(炒鸡像git)
[root@VM_0_4_centos docker]# docker run -ti ubuntu bash
root@8da371140128:/# touch test.txt
root@8da371140128:/# vi test.txt
bash: vi: command not found
root@8da371140128:/# echoroot@8da371140128:/# echo “test” > test.txt
root@8da371140128:/# cat test.txt
test
root@8da371140128:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test.txt tmp usr var
root@8da371140128:/# exit
exit
运行Ubuntu,-ti把容器内标准绑定到终端并运行bash,发现这个操作系统里很多命令都没有,只保留了很少系统运行的参数
[root@VM_0_4_centos docker]# docker commit -a"cyx" -m “add test.txt” 8da371140128 cyx/test
sha256:036f85781fd0c78066f957d3fe809d8c48
19f9cad5979d832a8f130e6cbb8c74
[root@VM_0_4_centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cyx/test latest 036f85781fd0 4 seconds ago 69.9MB
ubuntu latest 7698f282e524 2 weeks ago 69.9MB
hello-world latest fce289e99eb9 5 months ago 1.84kB
7.迁出镜像
docker save -o <image>.tar<image>:<tag>
-o为设置存储压缩后的文件名称
image可以为标签或id
8.载入镜像
docker load --input<image>.tar 或 docker load < <image>.tar
会导入镜像的相关数据信息,包括标签
9.上传镜像
docker push <域名>/<namespace>/<repo>:<tag>
可能会需要登陆
使用docker login
[root@VM_0_4_centos docker]# docker save -o test.tar 036f85781fd0
[root@VM_0_4_centos docker]# docker rmi 036f85781fd0
Untagged: cyx/test:latest
Deleted: sha256:036f85781fd0c78066f957d3fe8
09d8c4819f9cad5979d832a8f130e6cbb8c74
Deleted: sha256:8978e7051b78201de4a5fff1b3
e1a45ef22947123424c471ac3c701b8653f005
[root@VM_0_4_centos docker]# docker load < test.tar
bb370513b24b: Loading layer [==================================================>] 3.584kB/3.584kB
Loaded image ID: sha256:036f85781fd0c78066f957d3fe809d8c4819f9
cad5979d832a8f130e6cbb8c74
[root@VM_0_4_centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 036f85781fd0 10 minutes ago 69.9MB
ubuntu latest 7698f282e524 2 weeks ago 69.9MB
hello-world latest fce289e99eb9 5 months ago 1.84kB
[root@VM_0_4_centos docker]# docker tag 036f85781fd0 “cyx/test”
[root@VM_0_4_centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cyx/test latest 036f85781fd0 11 minutes ago 69.9MB
ubuntu latest 7698f282e524 2 weeks ago 69.9MB
hello-world latest fce289e99eb9 5 months ago 1.84kB
导入是没有设定库和tag,这时我们重新命名一下就好
[root@VM_0_4_centos docker]# docker tag 036f85781fd0 “cyxfree/test”
[root@VM_0_4_centos docker]# docker push cyxfree/test
The push refers to repository [docker.io/cyxfree/test]
bb370513b24b: Pushed
8d267010480f: Pushed
270f934787ed: Pushed
02571d034293: Pushed
latest: digest: sha256:92bcfc7a5946eccc845c88491ca
250b6957e099872af320e1ae4de3941ab004b
size: 1150
注意,push后面跟的cyxfree/test是你的仓库名,如果没有这个远程仓库,则会创建一个
正常情况下为push (username)/(repository):tagname, 默认是最新的
PS:
- makedown < 需要转义为< 再加个;
- hexo 有个bug “}}”不在代码块要添加你的内容, 不然会出错(是解释成模板了吗,不懂)
Docker入门(不用入土)