Docker镜像详解
前面讲到docker包括image,container.....等组件
docker image包含启动容器所需的文件系统及内容,所以它才能用于创建并启动docker容器
docker镜像采用分层构建机制,至少包含两层,底层是bootfs,其上是rootfs。
我们通过交互式命令进入docker容器时,看起来就像一个操作系统。这有赖于bootfs来引导系统,包括bootloader和kernel,容器启动完成后它就会被卸载以节约内存资源;
rootfs 位于bootfs之上,它表现为docker容器的根文件系统;
在传统的系统启动模式中,内核挂载rootfs时会先将其挂载为“只读”模式,等到完整性检查完成后在将其挂载为读写模式;而在docker中,rootfs由内核挂载为“只读”模式,然后通过“联合挂载”技术再挂载一个“可写”层,这就是container。
container层作为可写层,那必定是构建在一个文件系统基础上,现在新版本的docker中,container是通过overlay2来实现的,并且其底层是xfs格式。通过docker info可以查看到
早期版本docker使用的是aufs或dm等其它存储驱动(文件系统)
docker镜像从哪里获取?Registry 仓库,即repository。(就像yum仓库一样,可以自己搭建也可以使用互联网上的仓库,这个后续再讲解。docker默认使用的互联网仓库是docker hub)
docker容器启动时会从本地下载镜像中找指定名字的镜像,如果没找到就会直接从网上下载并运行。并且docker service程序docer daemon是通过https从registry仓库中获取镜像的。关于repository需要知道的一些知识:
镜像生成途径
这里测试基于容器制作的方式来生成镜像
1> 创建容器,并做出一些修改。这里使用busybox镜像,并在它的基础上启用httpd服务,配置好httpd的工作目录并写入主页。
#docker run --name bboxhttp -it busybox:latest
2> 确认容器分配到的IP
3> 新开一个会话终端并测试http服务可访问
4> 在新终端上使用docker container commit命令创建镜像
注意,生成镜像的瞬间container在-p参数的作用下暂停了,但是镜像制作完成后container还是会继续运行的,不用手动去unpause
5> 如果对仓库名和标签进行二次修改,可使用docker tag命令
注意:当同一个image有多个repository:tag时,使用docker image rm只是删除标签。如果只有一个repository:tag时,此时再删除repository:tag会连同镜像一起被删掉
6> 验证生成的镜像。通过新镜像启动的container包含之前创建的httpd服务的家目录及主页
7> 在以上步骤基础上,再进一步制作出让容器一启动即运行httpd服务的镜像,而不是启动后运行sh。使用docker commit -c 参数实现。
8> 测试验证。
完成镜像制作后,就可以将镜像推送到共有或者自己的私人镜像仓库中。这里使用阿里云自建的仓库测试,登录阿里云容器镜像仓库中创建镜像唱K,并获取公共地址:
然后修改生成的镜像仓库
在仓库管理界面找到推送镜像的说明(这里每个人都不一样一定要根据自己的情况做):
实际操作:
推送:
回到阿里云镜像仓库查看:
镜像导入导出。不通过网络上的镜像仓库,而直接通过文件传输来分发镜像。使用docker save命令实现。
到mini8服务器上导入镜像
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">