Docker镜像管理基础篇
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Docker Images
Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器。
1>.采用分层构建机制,最底层为bootfs,向上为rootfs
bootfs:
用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源。
rootfs:
如上图所示,rootfs位于bootfs之上,表现为docker容器的根文件系统。
传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为"只读"模式,完整性自检完成后将其重新挂载为读写模式。
docker中,rootfs由内核挂载为"只读"模式,而后通过"联合挂载"技术额外挂载一个"可写"层。
2>.Docker Image Layer
如上图所示,位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image)。 最上层为"可读写"层,其下的均为"只读"层。
二.Docker的分层镜像所支持的文件系统
1>.auFS
镜像的分层构建和联合挂载依赖于转有的文件系统。
advanced multi-layered unification filesystem(高级多层统一文件系统,简称Aufs),用于为Linux文件系统实现"联合挂载"。
aufs是之前UnionFS的重新实现,2006年由Junjiro Okajima开发。(据说aufs源代码有3w多行,而ext文件系统也才5k多行左右,作者曾4次申请向Linux内核合并都被拒,因此我们要使用这种文件系统需要自己给内核打补丁。)
Docker最初使用aufs作为容器文件系统层,它目前仍作为存储后端之一来支持。
aufs的竞争产品是overlayfs,后者自从3.18版本开始被合并到Linux内核。
docker的分层镜像,除了aufs,docker还支持btrfs,devicemapper和vfs等(在Ubantu系统下,docker默认Ubuntu的aufs;而在CentOS 7上,用的是devicemapper)。
2>.Devicemapper
Device Mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
在内核中它通过一个一个模块化的target driver(如上图中的linear,mirror,snapshot,multipath)插件实现对IO请求的过滤或者重新定向等工作,当前已经实现的target driver插件包括软raid,软加密,逻辑卷条带,多路径,镜像,快照等。
如下图所示,在这诸多"插件"中,有一种叫Thin Provisioning Snapshot,Docker正是使用了Thin Provisioning的Snapshot的技术实现了类似auFS的分层镜像。
由于Devicemapper并不太稳定,性能很差,我们了解即可,无需深入了解,感兴趣的小伙伴可自行查阅资料。
3>.overlay2
我们知道Devicemapper并不太稳定,性能极差,在最新版本安装中的docker中,我们使用"docker info"命令可以看到"Storage Driver"为"overlay2"。 overlay2是一种抽象的二级文件系统,它需要建构在本地文件系统(CentOS 7.x版本中使用"docker info"命令可以看到"Backing FileSystem"为"xfs")之上,CentOS 7默认是xfs文件系统,因此overlay2是默认是建立在xfs之上的,了解即可。
三.Registry
1>.什么是Registry
我们去构建镜像时,镜像做好之后应该有一个统一存放位置,我们称之为Docker仓库,Registry是存放Docker镜像的仓库(官方默认仓库在"https://hub.docker.com"),Registry分私有和公有两种。Images和Registry之间默认使用的时https协议,当然如果你非要指定为http协议也是可以的。
启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地。
Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可自建Registry,也可使用官方的Docker Hub。
2>.Docker Registry分类
Sponsor Registry:
第三方的registry,供客户端和Docker社区使用。
Mirror Registry:
第三方的registry,只让客户使用。
Vendor Registry:
由发布Docker镜像的供应商提供的registry。
Private Registry:
通过设有防火墙和额外的安全层的私有实体提供的registry。
3>.Registry包括Repository和Index
Repository: 由某特定的docker镜像的所有迭代版本组成的镜像仓库; 一个Registry中可以存在多个Repository: Repository可分为"顶层仓库"和"用户仓库"; 用户仓库名称格式为"用户名/仓库名"。 每个仓库可以包含多个Tag(标签),每个标签对应一个镜像;
Index: 维护用户账户,镜像的校验以及公共命名空间的信息; 相当于为Registry提供了一个完成用户认证等功能的检索接口。
如下图所示,Docker Registry中的镜像通常由开发人员制作,而后推送至"公共"或"私有"Registry上保存,供其它人员使用,例如"部署"到生产环境。
四.Docker Hub功能概述
Docker Hub是Docker官方默认镜像服务器,如果有需要的小伙伴可以自行去官方注册,链接地址:https://hub.docker.com。除了官方默认的镜像服务还有一个著名的镜像地址:https://quay.io,除此之外,国内也有很多优秀的镜像地址,比如阿里源,清华源等。 接下来我们简单对Docker Hub的功能做一个简单描述: Image Repositories(镜像仓库): 存放自己的镜像仓库。 Automated builds(自动构建): 当仓库的源代码发生改变时它可以自动创建新的镜像。 Webhooks(web钩子): 和Automated builds有关,当代码被成功push到repository后会触发的动作称为webhooks。 Organization(组织): 创建工作组来协同工作。 GitHub and Bitbucket Integration: 可以与GitHub或者Bitbucket进行整合。
五.镜像相关的操作
1>.镜像的生成途径
目前有三者中途径可以制作镜像:
1>.Dockerfile
2>.基于容器制作
3>.Docker Hub automated builds(其实还是基于Dockerfile实现的)
2>.基于容器做镜像
[root@node101.yinzhengjie.org.cn ~]# docker commit --help #查看该命令的帮助信息 Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] Create a new image from a container's changes Options: -a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") -c, --change list Apply Dockerfile instruction to the created image -m, --message string Commit message -p, --pause Pause container during commit (default true) [root@node101.yinzhengjie.org.cn ~]#