Docker镜像含有启动容器所须要的文件系统及其内容,所以,其用于建立并启动docker容器。docker镜像采用分层构建机制,这种分层可大致分为两部分,第一部分最低层为bootfs,向上真正来构建用户空间运行容器的称之为rootfs。
(1)镜像构成
其中bootfs用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源,而rootfs位于bootfs之上,表现为docker容器的根文件系统。
须要注意的是在传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其从新挂载为读写模式。
而在docker中,rootfs由内核挂载为“只读”模式,然后经过“联合挂载”技术额外挂载一个“可写”层。位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image),最上层为“可读写”层,其下的均为“只读”层。例如bootfs文件系统之上的基础镜像是一层Debian操做系统,用来供给系统的基础构成,提供bin、sbin、usr等目录,接着若是咱们要用到一个额外的应用工具的话,在上面直接安装一层镜像例如emacs编辑器,再向上安装一层镜像好比Apache,随后咱们要启动Apache的时候须要把3层都启动起来,先启动最底层,在最底层的基础之上挂载第二层,而后再挂载第三层,它们是叠加在一块儿挂载的,这就是咱们所谓的联合挂载,这三层都是只读的,容器启动完以后若是某一进城须要建立临时文件类的,会放在/tmp目录下,事实上/tmp目录所在的底层是不容许编辑的,要想可以编辑,是在最顶层建立一个可写层,这一层才是容器自有的,下面的层都是可供多个基于同一个镜像启动的容器所共享的层次。对于容器来讲全部的写操做都是在最上层writable层实现,若是删除容器这个writable层也会一并被删除。
(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
(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到服务器上部署并启动。
(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
(5)镜像相关的操做
通常镜像的生成途径有以下的三种方式,第一种是使用Dockerfile并使用docker build命令进行制做;第二种是基于容器进行制做,在已有作好的容器基础上进行制做;第三种是使用Docker Hub automated builds进行自动构建,其实这种方式也是和第一种的方式一致,也是基于Dockerfile来实现的。
(6)基于容器制做镜像
(6.1)
# docker image ls
查看当前全部的镜像文件
# docker run --name b1 -it busybox
# docker commit -p b1
基于已经建立的容器b1制做一个镜像,使用p选项表示将容器暂停
# docker tag 3ddbb184105a wanggeedu/httpd:v0.1-1
针对b1建立的镜像文件,咱们使用IMAGE ID来惟必定位镜像,并为其用tag打一个标签
# 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 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 commit -a "WanggeEdu <1342697644@qq.com>" -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 container ls
查看容器运行的状态
# docker inspect t2
查看建立的t2容器运行的详细信息
# curl 172.17.0.3
使用命令行链接t2容器的web服务
(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)使用阿里云构建镜像仓库
国内访问比较快的镜像服务器平台,通常使用阿里云的就比较好
而后咱们新建一个镜像仓库,并填上相关的配置信息,点击下一步便可
而后咱们点击建立一个本地仓库
建立完后咱们点击管理后,咱们发现咱们应该使用“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 login --username=王翔宇食神 registry.cn-shenzhen.aliyuncs.com
咱们使用上面的仓库登陆地址,并输入登陆密码等信息
# docker push registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1
咱们将建立好的镜像推送到阿里云的仓库中
此时咱们发现制做的httpd服务的镜像已经正常的推送到了阿里云的仓库中了
(8)咱们能够在一台主机上将已有的镜像文件打包
# docker save --help
查看docker save命令的使用帮助
# docker save -o mymage.gz wanggeedu/httpd:latest wanggeedu/httpd:v0.1-1
咱们将建立的2个镜像文件进行打包并保存为mymage.gz文件
# 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文件进行下载html
—————— 本文至此结束,感谢阅读 ——————前端