【讲清楚,说明白!】Docker镜像管理基础

Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器。docker镜像采用分层构建机制,这种分层可大体分为两部分,第一部分最低层为bootfs,向上真正来构建用户空间运行容器的称之为rootfs。
(1)镜像构成
其中bootfs用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源,而rootfs位于bootfs之上,表现为docker容器的根文件系统。
需要注意的是在传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式。
【讲清楚,说明白!】Docker镜像管理基础
而在docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层。位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image),最上层为“可读写”层,其下的均为“只读”层。例如bootfs文件系统之上的基础镜像是一层Debian操作系统,用来供给系统的基础构成,提供bin、sbin、usr等目录,接着如果我们要用到一个额外的应用工具的话,在上面直接安装一层镜像例如emacs编辑器,再向上安装一层镜像比如Apache,随后我们要启动Apache的时候需要把3层都启动起来,先启动最底层,在最底层的基础之上挂载第二层,然后再挂载第三层,它们是叠加在一起挂载的,这就是我们所谓的联合挂载,这三层都是只读的,容器启动完之后如果某一进城需要创建临时文件类的,会放在/tmp目录下,事实上/tmp目录所在的底层是不允许编辑的,要想能够编辑,是在最顶层创建一个可写层,这一层才是容器自有的,下面的层都是可供多个基于同一个镜像启动的容器所共享的层次。对于容器来说所有的写操作都是在最上层writable层实现,如果删除容器这个writable层也会一并被删除。
【讲清楚,说明白!】Docker镜像管理基础
(2)docker镜像文件系统
Docker最早使用的是Aufs文件系统,即advanced multi-layered unification filesystem高级多层次统一文件系统,用于为Linux文件系统实现“联合挂载”;aufs是之前的UnionFS的重新实现,2006年由Junjiro Okajima开发;Docker最初使用aufs作为容器文件系统层,它目前仍作为存储后端之一来支持;aufs竞争产品是overlayfs,后者自从3.18版本开始被合并到Linux内核;docker的分层镜像除了aufs,docker还支持btrfs,devicemapper和vfs等;在Ubuntu系统下,docker默认Ubuntu使用的是aufs文件系统,而在CentOS 7上,用的是devicemapper。
而在CentOS 7系统中我们可以看到docker使用的后端是xfs文件系统,前端使用的是overlay2文件系统。
# docker info
【讲清楚,说明白!】Docker镜像管理基础
(3)Docker Registry概述
启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载该镜像并保存到本地。
Registry用于保存docker镜像,包括镜像的层次结构和元数据,用户可自建Registry,也可使用官方的Docker Hub。
其中Registry的分类主要有四种:Sponsor Registry,即第三方的registry,供客户和Docker社区使用;Mirror Registry,即第三方的registry,只让客户使用;Vendor Registry,即由发布Docker镜像的供应商提供的registry;第四种Private Registry,即通过设有防火墙和额外的安全层的私有实体提供的registry
一个Registry通常会有两部分组成,Repository和Index。其中Repository是由特定的docker镜像的所有迭代版本组成的镜像仓库,一个Registry中可以存在多个Repository,而Repository可分为“顶层仓库”和“用户仓库”;用户仓库名称格式为“用户名/仓库名”。每个仓库可以包含多个Tag(标签),每个标签对应一个镜像。第二个Index的作用在于维护用户账户、镜像的校验以及公共命名空间的信息;相当于为Registry提供了一个完成用户认证等功能的检索接口。
Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境。首先Developer开发人员可以到Docker public registry上将镜像Pull到本地,在原有镜像的基础上做额外的修改生成一个新的层次,就做出了一个新的镜像了,把新镜像推送到自己的私有仓库Docker private registry中,然后就可以由我们的运维人员将新的镜像Pull到服务器上部署并启动。
【讲清楚,说明白!】Docker镜像管理基础
(4)Docker Hub概述
A.Image Repositories
B.Automated Builds
C.Webhooks
D.Organizations
E.GitHub and Bitbucket Integration
在docker hub中有如下的几类标签,其中第一个Image Repositories,即镜像仓库,我们创建了一个nginx,把我们自己做的nginx镜像上传上去,如果我们制作了redis镜像,再上传我们制作的redis镜像,以此类推,每一个就是一个镜像仓库;第二个Automated Builds即自动构建,一般我们有两种方式,一种是用docker build基于Dockerfile来做,另一种是基于容器来制作,容器启动起来后上面有一层可写层,这个可写层可能做了很多改变,我们可以把可写层固定下来做成一个镜像就可以了,当我们使用Dockerfile来制作镜像的时候,可以把Dockerfile文件推送到GitHub的仓库中,这个仓库可以与docker hub的仓库建立起关联关系,docker hub可以持续的监控GitHub仓库,一旦Dockerfile文件发生改变,docker hub就会自动把Dockerfile拖下来做成docker镜像,并将镜像存放在仓库中;第三个Webhooks即web钩子,是我们自动构建的一种特征,它可以触发一种行为,当本地的Dockerfile推送到GitHub上后,而GitHub的变动会通知到docker hub,此时docker hub会把Dockerfile文件pull下来自动构建镜像的过程;第四个Organizations即组织,我们可以创建一个工作组,大家可以协同起来工作;第五个GitHub and Bitbucket Integration表示可以与Bitbucket进行整合
备注:
如果我们想下载镜像,常用的镜像站点还有:https://quay.io/ ,例如我们需要下载flannel插件,我们可以按照如下的方式找到合适的版本并进行下载
# docker pull quay.io/coreos/flannel:v0.13.0-amd64
【讲清楚,说明白!】Docker镜像管理基础
【讲清楚,说明白!】Docker镜像管理基础
(5)镜像相关的操作
一般镜像的生成途径有如下的三种方式,第一种是使用Dockerfile并使用docker build命令进行制作;第二种是基于容器进行制作,在已有做好的容器基础上进行制作;第三种是使用Docker Hub automated builds进行自动构建,其实这种方式也是和第一种的方式一致,也是基于Dockerfile来实现的。
【讲清楚,说明白!】Docker镜像管理基础
(6)基于容器制作镜像
(6.1)
# docker image ls
查看当前所有的镜像文件
# docker run --name b1 -it busybox
【讲清楚,说明白!】Docker镜像管理基础
【讲清楚,说明白!】Docker镜像管理基础
# docker commit -p b1
基于已经创建的容器b1制作一个镜像,使用p选项表示将容器暂停
# docker tag 3ddbb184105a wanggeedu/httpd:v0.1-1
针对b1创建的镜像文件,我们使用IMAGE ID来唯一定位镜像,并为其用tag打一个标签
【讲清楚,说明白!】Docker镜像管理基础
# docker tag wanggeedu/httpd:v0.1-1 wanggeedu/httpd:latest
我们可以为已经创建的wanggeedu/httpd:v0.1-1版本的镜像创建一个新的tag标签latest
# docker inspect busybox
查看镜像文件的busybox的默认配置,在Cmd中有标明其默认会运行/bin/sh命令(图3-11)
【讲清楚,说明白!】Docker镜像管理基础
# docker run --name t1 -it wanggeedu/httpd:v0.1-1
基于我们创建的新的镜像wanggeedu/httpd:v0.1-1启动一个容器
(6.2)需求:我们希望现在基础busybox镜像上创建的新的镜像使用的默认命令不在是原有的/bin/sh,而是运行httpd服务。
# docker commit -h
查看命令的用法和使用参数
# httpd -h
查看httpd服务的帮助
【讲清楚,说明白!】Docker镜像管理基础
# docker commit -a "WanggeEdu <[email protected]>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 wanggeedu/httpd:v0.2-1
基于已有的容器b1创建一个镜像,其中使用的标注是a参数,使用c参数表示修改原有基础镜像所使用的命令,具体修改为启动httpd进程的命令,使用p参数表示将容器暂停,制作的镜像名为wanggeedu/httpd:v0.2-1
# docker run --name t2 wanggeedu/httpd:v0.2-1
运行一个基于新创建的镜像启动的容器并且命名为t2
【讲清楚,说明白!】Docker镜像管理基础
# docker container ls
查看容器运行的状态
# docker inspect t2
查看创建的t2容器运行的详细信息
# curl 172.17.0.3
使用命令行连接t2容器的web服务
【讲清楚,说明白!】Docker镜像管理基础
(6.3)使用示例
# docker run --rm -it --name bbox1 busybox
启动容器,执行需要的修改操作
# docker logs bbox1
查看修改
# docker commit bbox1 wanggeedu/busybox/httpd:latest
制作镜像
# docker commit --change=’CMD [“httpd”,”-h /data/httpd/htdocs”,”-f”]’ -c “EXPOSE 80” bbox1 wanggeedu/busybox/httpd:v0.1
提交镜像,修改默认运行的命令
# docker tag 3ddbb184105a wanggeedu/busybox/httpd:latest
基于ID打标
# docker wanggeedu/busybox/httpd:v0.1 wanggeedu/busybox/httpd:latest
基于名称和标签打标
# docker push wanggeedu/busybox/httpd:latest
将镜像push到Docker Hub上
(7)使用阿里云构建镜像仓库
国内访问比较快的镜像服务器平台,一般使用阿里云的就比较好
【讲清楚,说明白!】Docker镜像管理基础
【讲清楚,说明白!】Docker镜像管理基础
然后我们新建一个镜像仓库,并填上相关的配置信息,点击下一步即可
【讲清楚,说明白!】Docker镜像管理基础
然后我们点击创建一个本地仓库
【讲清楚,说明白!】Docker镜像管理基础
创建完后我们点击管理后,我们发现我们应该使用“registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd” 这样的标签前缀
# docker tag wanggeedu/httpd:v0.2-1 registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1
【讲清楚,说明白!】Docker镜像管理基础
【讲清楚,说明白!】Docker镜像管理基础
# docker login --username=王翔宇食神 registry.cn-shenzhen.aliyuncs.com
我们使用上面的仓库登录地址,并输入登录密码等信息
# docker push registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1
我们将创建好的镜像推送到阿里云的仓库中
【讲清楚,说明白!】Docker镜像管理基础
此时我们发现制作的httpd服务的镜像已经正常的推送到了阿里云的仓库中了
【讲清楚,说明白!】Docker镜像管理基础
(8)我们可以在一台主机上将已有的镜像文件打包
# docker save --help
查看docker save命令的使用帮助
# docker save -o mymage.gz wanggeedu/httpd:latest wanggeedu/httpd:v0.1-1
我们将创建的2个镜像文件进行打包并保存为mymage.gz文件
【讲清楚,说明白!】Docker镜像管理基础
# scp mymage.gz 192.168.26.133:/root/
将创建的压缩文件通过scp传输到133的主机上
# scp docker-ce.repo 192.168.26.133:/etc/yum.repos.d/
将本机服务器中的repo文件传送到133主机上
# mkdir /etc/docker
在133服务器上创建/etc/docker目录
# scp /etc/docker/daemon.json 192.168.26.133:/etc/docker/
在本机128服务器上将daemon.json文件拷贝到133主机上
# yum install docker-ce -y
在133主机上安装docker
# systemctl start docker
在133主机上启动docker
# docker load -i mymage.gz
在133主机上将docker镜像下载下来并指定是从mymage.gz文件进行下载
【讲清楚,说明白!】Docker镜像管理基础




























































































































—————— 本文至此结束,感谢阅读 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章