Docker镜像详解

 

前面讲到docker包括image,container.....等组件

docker image包含启动容器所需的文件系统及内容,所以它才能用于创建并启动docker容器

docker镜像采用分层构建机制,至少包含两层,底层是bootfs,其上是rootfs。

我们通过交互式命令进入docker容器时,看起来就像一个操作系统。这有赖于bootfs来引导系统,包括bootloader和kernel,容器启动完成后它就会被卸载以节约内存资源;

rootfs 位于bootfs之上,它表现为docker容器的根文件系统;

在传统的系统启动模式中,内核挂载rootfs时会先将其挂载为“只读”模式,等到完整性检查完成后在将其挂载为读写模式;而在docker中,rootfs由内核挂载为“只读”模式,然后通过“联合挂载”技术再挂载一个“可写”层,这就是container。

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统

container层作为可写层,那必定是构建在一个文件系统基础上,现在新版本的docker中,container是通过overlay2来实现的,并且其底层是xfs格式。通过docker info可以查看到

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_02

早期版本docker使用的是aufs或dm等其它存储驱动(文件系统)

 

docker镜像从哪里获取?Registry 仓库,即repository。(就像yum仓库一样,可以自己搭建也可以使用互联网上的仓库,这个后续再讲解。docker默认使用的互联网仓库是docker hub)

docker容器启动时会从本地下载镜像中找指定名字的镜像,如果没找到就会直接从网上下载并运行。并且docker service程序docer daemon是通过https从registry仓库中获取镜像的。关于repository需要知道的一些知识:

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker将多个镜像打成一个压缩包_03

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_04

 

镜像生成途径

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_05

这里测试基于容器制作的方式来生成镜像

1> 创建容器,并做出一些修改。这里使用busybox镜像,并在它的基础上启用httpd服务,配置好httpd的工作目录并写入主页。

#docker run --name bboxhttp -it busybox:latest

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_06

2> 确认容器分配到的IP

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_07

 

3> 新开一个会话终端并测试http服务可访问

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_08

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_09

 

4> 在新终端上使用docker container commit命令创建镜像

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_推送_10

注意,生成镜像的瞬间container在-p参数的作用下暂停了,但是镜像制作完成后container还是会继续运行的,不用手动去unpause

 

5> 如果对仓库名和标签进行二次修改,可使用docker tag命令

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_11

注意:当同一个image有多个repository:tag时,使用docker image rm只是删除标签。如果只有一个repository:tag时,此时再删除repository:tag会连同镜像一起被删掉

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_12

 

6> 验证生成的镜像。通过新镜像启动的container包含之前创建的httpd服务的家目录及主页

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_13

 

7> 在以上步骤基础上,再进一步制作出让容器一启动即运行httpd服务的镜像,而不是启动后运行sh。使用docker commit -c 参数实现。

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_14

 

8> 测试验证。

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_推送_15

 

完成镜像制作后,就可以将镜像推送到共有或者自己的私人镜像仓库中。这里使用阿里云自建的仓库测试,登录阿里云容器镜像仓库中创建镜像唱K,并获取公共地址:

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_16

然后修改生成的镜像仓库

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker将多个镜像打成一个压缩包_17

在仓库管理界面找到推送镜像的说明(这里每个人都不一样一定要根据自己的情况做):

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_18

实际操作:

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker将多个镜像打成一个压缩包_19

推送:

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_推送_20

 

回到阿里云镜像仓库查看:

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_21

 

 

镜像导入导出。不通过网络上的镜像仓库,而直接通过文件传输来分发镜像。使用docker save命令实现。

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_docker_22

到mini8服务器上导入镜像

docker将多个镜像打成一个压缩包 docker 多个镜像放到一个container_文件系统_23

 

 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">