Docker 镜像管理
一、概念
Docker所宣称的用户可以随心所欲地“Build、Ship and Run”应用的能力,其核心是由Docker image来支撑的。Docker通过把应用运行时的环境和应用打包在一起,解决了环境部署依赖的问题,通过引入分层文件系统的概念,解决了空间利用的问题。
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
1.1、docker镜像文件系统
Docker镜像含有启动容器所需要的文件系统及其内容,Docker采用分层构建机制,最底层为bootfs,其之为rootfs。
bootfs:用于系统引导的文件系统,包括BootLoader和kernel,容器启动完成后会被卸载以节约内存资源
rootfs:位于bootfs之上,表现为Docker容器的根文件系统。传统模式中,系统启动时内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检后将其重新挂载为读写模式。Docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层。
1.2、Docker Repository
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库的名字通常由两部分组成,中间以斜线分开,斜线之前是用户名,斜线之后是镜像名。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云 和时速云等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。
Docker Registry 拉取镜像
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载镜像并保持到本地。
二、Docker image操作
2.1、列出本机的镜像
[root@node101 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yxr877431436/httpd v0.2 bf9bf96e4572 25 hours ago 1.16MB yxr877431436/httpd v0.1 a257de8b352a 25 hours ago 1.16MB nginx 1.14-alpine 14d4a58e0d2e 6 days ago 17.4MB redis latest e1a73233e3be 13 days ago 83.4MB nginx latest 06144b287844 13 days ago 109MB busybox latest e1ddd7948a1c 6 weeks ago 1.16MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 7 months ago 44.6MB
2.2、创建一个镜像
[root@node101 ~]# docker pull nginx #可以直接pull镜像,默认pull的版本是latest版本 Using default tag: latest latest: Pulling from library/nginx 802b00ed6f79: Already exists e9d0e0ea682b: Pull complete d8b7092b9221: Pull complete Digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3 Status: Downloaded newer image for nginx:latest [root@node101 ~]# docker pull nginx:1.14-alpine 1.14-alpine: Pulling from library/nginx c67f3896b22c: Pull complete 428de5b8d58a: Pull complete 7efd417f3e28: Pull complete 61a56b170416: Pull complete Digest: sha256:f87de4bf7449cd23fd484a130e5b1b329ae75dd736576550f9bdff0d70bc3dcb Status: Downloaded newer image for nginx:1.14-alpine
2.3、删除一个镜像
[root@node101 ~]# docker image rm nginx Untagged: nginx:latest Untagged: nginx@sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3 Deleted: sha256:06144b2878448774e55577ae7d66b5f43a87c2e44322b3884e4e6c70d070b262 Deleted: sha256:824a442ee3c96744d75be3737a22cc6a47aebad1b30be67f3c2f8f29cb0aa879 Deleted: sha256:8e3d1e9e4945f930c93c30617512998437f6edafd86676770d29b1581f2520bb [root@node101 ~]# docker image rm nginx:1.14-alpine Untagged: nginx:1.14-alpine Untagged: nginx@sha256:f87de4bf7449cd23fd484a130e5b1b329ae75dd736576550f9bdff0d70bc3dcb Deleted: sha256:14d4a58e0d2e63431ccac050e4294bd92df76aba8864f5f201ee293797febf79 Deleted: sha256:e14286135e32e2b62ac9781215a212834d212e3c106c5b2afd28a099448e5ae6 Deleted: sha256:e6b2d19e9d67586b7562c319716029b04d5817bbd2716031e99a1147e6a9cb56 Deleted: sha256:6298dc8d140a4afb31b20b40e5f39955986aae3b744b3f372d1bd2c8a724954a Deleted: sha256:ebf12965380b39889c99a9c02e82ba465f887b45975b6e389d42e9e6a3857888
2.4、创建一个容器
[root@node101 ~]# docker run --name b2 –it –d --rm busybox / # ls bin dev etc home proc root sys tmp usr var
命令注释:
- -it : 进行交互式操作
- -d : 等同于 -d=true,容器将会在后台运行,不然执行一次命令后,退出后,便是exit状态了。
- --name : 容器启动后的名字,默认不指定,将会随机产生一个名字。或者使用 -name="containers_name"
- --rm:退出删除容器
- busybox:使用的镜像名称
2.5、基于容器制作镜像
[root@node101 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.14-alpine 14d4a58e0d2e 5 days ago 17.4MB redis latest e1a73233e3be 12 days ago 83.4MB nginx latest 06144b287844 12 days ago 109MB busybox latest e1ddd7948a1c 6 weeks ago 1.16MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 7 months ago 44.6MB [root@node101 ~]# docker run --name b1 -it busybox / # mkdir /data/html -p / # vi data/html/index.html bin data dev etc home proc root sys tmp usr var / # read escape sequence [root@node101 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fb101638ecd7 busybox "sh" 5 minutes ago Up 5 minutes b1 [root@node101 ~]# docker commit -p b1 yxr877431436/httpd:v0.1 sha256:a257de8b352a1cb7f42232360ccc1ae93b5149d5e0320b95b7cef9e28ec0e05e [root@node101 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yxr877431436/httpd v0.1 a257de8b352a 10 seconds ago 1.16MB nginx 1.14-alpine 14d4a58e0d2e 5 days ago 17.4MB redis latest e1a73233e3be 12 days ago 83.4MB nginx latest 06144b287844 12 days ago 109MB busybox latest e1ddd7948a1c 6 weeks ago 1.16MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 7 months ago 44.6MB [root@node101 ~]# docker commit -a "Saviorsyang <Saviorsyang@Gmail.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 yxr877431436/httpd:v0.2 sha256:bf9bf96e457276b504151736b59356a9355e606840c5d978e88342f5ce0f6aa1 [root@node101 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yxr877431436/httpd v0.2 bf9bf96e4572 4 seconds ago 1.16MB yxr877431436/httpd v0.1 a257de8b352a 12 minutes ago 1.16MB nginx 1.14-alpine 14d4a58e0d2e 5 days ago 17.4MB redis latest e1a73233e3be 12 days ago 83.4MB nginx latest 06144b287844 12 days ago 109MB busybox latest e1ddd7948a1c 6 weeks ago 1.16MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 7 months ago 44.6MB [root@node101 ~]# docker run --name t1 yxr877431436/httpd:v0.2 [root@node101 ~]# docker inspect t1 [root@node101 ~]# curl 172.17.0.3 <h1>Welcome to busybox...</h1>
命令注释:
- -a :提交的镜像作者;
- -c :使用Dockerfile指令来创建镜像;
- -m :提交时的说明文字;
- -p :在commit时,将容器暂停。
2.6、镜像上传至docker hub
[root@node101 ~]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: yxr877431436 Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@node101 ~]# docker push yxr877431436/httpd:v0.2 The push refers to repository [docker.io/yxr877431436/httpd] 7a6545b4aa0f: Pushed f9d9e4e6e2f0: Mounted from library/busybox v0.2: digest: sha256:6aedc15d85442cb7b054d582a1518d22bd95c5a4716dfce88271c300b010df51 size: 734
上传成功之后,可以登录https://hub.docker.com/进行查看。
2.7、镜像导入和导出
[root@node101 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yxr877431436/httpd v0.2 bf9bf96e4572 25 hours ago 1.16MB yxr877431436/httpd v0.1 a257de8b352a 25 hours ago 1.16MB redis latest e1a73233e3be 13 days ago 83.4MB busybox latest e1ddd7948a1c 6 weeks ago 1.16MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 7 months ago 44.6MB [root@node101 ~]# docker save -o redis.gz redis [root@node101 ~]# ls anaconda-ks.cfg redis.gz [root@node101 ~]# docker image rm redis Untagged: redis:latest Untagged: redis@sha256:b77926b30ca2f126431e4c2055efcf2891ebd4b4c4a86a53cf85ec3d4c98a4c9 Deleted: sha256:e1a73233e3beffea70442fc2cfae2c2bab0f657c3eebb3bdec1e84b6cc778b75 Deleted: sha256:f9db21ff8c82fc37f90caf90a7aee8155217522ad8c59fbfe370a3e3875e3ba8 Deleted: sha256:e8237a63680e91814c2187d36bf877b77bcdbe32f039e3830b971899ba3d9066 Deleted: sha256:ee3e8a7f98978d885f024af810e81c5111010a5ad04a506e108b8164c14ecc53 Deleted: sha256:19261f688dac95e95c456e918a4374328ce0f6e3fbccd8b8bf2aaf7fa64caf8f Deleted: sha256:8a43eb91122ffb8c673e3c1c8191ef02af80d23b14758d3be28a09631bb8ec14 Deleted: sha256:8b15606a9e3e430cb7ba739fde2fbb3734a19f8a59a825ffa877f9be49059817 [root@node101 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yxr877431436/httpd v0.2 bf9bf96e4572 25 hours ago 1.16MB yxr877431436/httpd v0.1 a257de8b352a 25 hours ago 1.16MB busybox latest e1ddd7948a1c 6 weeks ago 1.16MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 7 months ago 44.6MB [root@node101 ~]# docker load -i redis.gz 8b15606a9e3e: Loading layer [==================================================>] 58.44MB/58.44MB d98fb630fb3b: Loading layer [==================================================>] 338.4kB/338.4kB 714e32c05337: Loading layer [==================================================>] 3.033MB/3.033MB a3514b4102be: Loading layer [==================================================>] 24.84MB/24.84MB 21497520b817: Loading layer [==================================================>] 1.536kB/1.536kB 685379d1594c: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: redis:latest [root@node101 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yxr877431436/httpd v0.2 bf9bf96e4572 25 hours ago 1.16MB yxr877431436/httpd v0.1 a257de8b352a 25 hours ago 1.16MB redis latest e1a73233e3be 13 days ago 83.4MB busybox latest e1ddd7948a1c 6 weeks ago 1.16MB quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 7 months ago 44.6MB
三、Docker image扩展知识
3.1、联合挂载
联合文件系统这种思想由来已久,这类文件系统会把多个目录(可能对应不同的文件系统—)挂载到同一个目录,对外呈现这些目录的联合。
Docker联合文件系统Union File System,它是实现Docker镜像的技术基础,是一种轻量级的高性能分层文件系统,支持将文件系统中的修改进行提交和层层叠加,这个特性使得镜像可以通过分层实现和继承。同时支持将不同目录挂载到同一个虚拟文件系统下。在Docker镜像分为基础镜像和父镜像,没有父镜像的镜像被称为基础镜像。用户是基于基础镜像来制作各种不同的应用镜像。这些应用镜像共享同一个基础镜像层,提高了存储效率。
Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker目前支持的联合文件系统种类包括AUFS、OverlayFS、btrfs、vfs、zfs和Device Mapper等。
总结一下,AUFS和Device Mapper的应用最为广泛,支持也相对成熟,推荐生产环境考虑。长期来看,OverlayFS将可能具有更好的特性。
3.2、写时复制(COW)
写时复制docker 镜像使用了写时复制(copy-on-write)的策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。