Docker 镜像管理

一、概念

        Docker所宣称的用户可以随心所欲地“Build、Ship and Run”应用的能力,其核心是由Docker image来支撑的。Docker通过把应用运行时的环境和应用打包在一起,解决了环境部署依赖的问题,通过引入分层文件系统的概念,解决了空间利用的问题。

       Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

1.1、docker镜像文件系统

       image Docker镜像含有启动容器所需要的文件系统及其内容,Docker采用分层构建机制,最底层为bootfs,其之为rootfs。

        bootfs:用于系统引导的文件系统,包括BootLoader和kernel,容器启动完成后会被卸载以节约内存资源

        rootfs:位于bootfs之上,表现为Docker容器的根文件系统。传统模式中,系统启动时内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检后将其重新挂载为读写模式。Docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层。

1.2、Docker Repository

         仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库的名字通常由两部分组成,中间以斜线分开,斜线之前是用户名,斜线之后是镜像名。

         仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云 和时速云等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。image

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/进行查看。

image

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、联合挂载

        联合文件系统这种思想由来已久,这类文件系统会把多个目录(可能对应不同的文件image系统—)挂载到同一个目录,对外呈现这些目录的联合。

        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:最早支持的文件系统,对Debian/Ubuntu支持好,虽然没有合并到Linux内核中,但成熟度很高;
  • OverlayFS:类似于AUFS,性能更好一些,已经合并到内核,未来会取代AUFS,但成熟度有待提高;
  • Device Mapper:Redhat公司和Docker团队一起开发用于支持RHEL的文件系统,内核支持,性能略慢,成熟度高;
  • btrfs:参考zfs等特性设计的文件系统,由Linux社区开发,试图未来取代Device Mapper,成熟度有待提高;
  • vfs:基于普通文件系统(ext、nfs等)的中间层抽象,性能差,比较占用空间,成熟度也一般。
  • zfs:最初设计为Solaris 10上的写时文件系统,拥有不少好的特性,但对Linux支持还不够成熟。
  • 总结一下,AUFS和Device Mapper的应用最为广泛,支持也相对成熟,推荐生产环境考虑。长期来看,OverlayFS将可能具有更好的特性。

    3.2、写时复制(COW)

      写时复制docker 镜像使用了写时复制(copy-on-write)的策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。




    posted @ 2018-09-20 16:21  Saviorsyang  阅读(1487)  评论(0编辑  收藏  举报