Docker 镜像加载原理
Docker 镜像实际上有一层一层的文件系统组成,这种层级文件系统就是UnionFS(联合文件系统)。
镜像:是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS:联合文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker 容器数据卷Tomcat为例:
问:为什么Tomcat镜像的size达到680MB?
答:Tomcat镜像内部包含了所有搭建环境所需的基础文件,最终暴露出来的只有Tomcat镜像文件。
问:为什么采用这种分层结构?
答:共享资源。例如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需家在一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
简介: Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。 卷就是目录或者文件,存在于一个或多个容器中,由docker挂载到容器,但不属于UnionFS,因此能够绕过UnionFS提供一些用于持续存储或者共享数据的特征。
设计目的: 数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可以在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
具体实现:
一、直接命令添加
- 执行前查看目录下文件:
- 执行命令 docker run -it -v /宿主机绝对路径目录:/容器内目录 IMAGES
- 添加并修改宿主机下的文件,查看容器内文件也同步更改
- 添加并修改容器内的文件,查看宿主机下文件也同步更改
- 当容器关闭后,修改宿主机下文件,当再次运行容器时,容器内文件也会同步更新。
- 也可以使用该命令 :ro 表示容器内只允许读:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro IMAGES
- 若出现 cannot open directory.:Permission denied,在挂载目录后多加 --privileged=true 参数即可。
二、DockerFile 添加
(DockerFile 具体内容见 Docker 入门基础(四))
- 根目录下新建mydocker 文件并进入
- 新建DockerFile,并使用VOLUM指令给镜像添加一个或多个数据卷
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。所以出于可移植性和分享的考虑,用 -v 主机目录:容器目录 这种方法不能够直接在DockerFile中实现。
DockerFile 中实现使用 VOLUM指令
# volume test FROM centos VOLUME ["/dataVolumContainer1","/dataVolumContainer2"] CMD echo "finished,-------success" CMD /bin/bash
- 使用 docker build -f /mydocker/Dockerfile -t hhh/centos . 生成新的镜像文件hhh/centos
- 使用 docker run 新生成的镜像
- 使用docker inspert 容器ID查看对应宿主机路径
对应的宿主机路径:
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器。
容器间传递共享:--volumes-from
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
-
启动父容器 dc01 并在 dataVolumContainer1 中新增内容:
[root@MiWiFi-RA69-srv ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hhh/centos latest f6b32092bf97 13 hours ago 231MB [root@MiWiFi-RA69-srv ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@MiWiFi-RA69-srv ~]# docker run -it --name dc01 hhh/centos [root@44847a5eb241 /]# ls bin dataVolumContainer2 etc lib lost+found mnt proc run srv tmp var dataVolumContainer1 dev home lib64 media opt root sbin sys usr [root@44847a5eb241 /]# cd dataVolumContainer1 [root@44847a5eb241 dataVolumContainer1]# ls [root@44847a5eb241 dataVolumContainer1]# touch dc01-add.txt [root@44847a5eb241 dataVolumContainer1]# ls dc01-add.txt
-
启动容器 dc02 和 dc03 并挂载父容器 dc01:docker run -it --name 子容器 --volumes-from 父容器 IMAGES
[root@MiWiFi-RA69-srv ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 44847a5eb241 hhh/centos "/bin/sh -c /bin/bash" 8 minutes ago Up 8 minutes dc01 [root@MiWiFi-RA69-srv ~]# docker run -it --name dc02 --volumes-from dc01 hhh/centos [root@bc133e323141 /]# ls bin dataVolumContainer2 etc lib lost+found mnt proc run srv tmp var dataVolumContainer1 dev home lib64 media opt root sbin sys usr [root@bc133e323141 /]# cd dataVolumContainer1 [root@bc133e323141 dataVolumContainer1]# ls dc01-add.txt [root@bc133e323141 dataVolumContainer1]# touch dc02-add.txt [root@bc133e323141 dataVolumContainer1]# ls dc01-add.txt dc02-add.txt
[root@MiWiFi-RA69-srv ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc133e323141 hhh/centos "/bin/sh -c /bin/bash" 14 minutes ago Up 14 minutes dc02 44847a5eb241 hhh/centos "/bin/sh -c /bin/bash" 24 minutes ago Up 23 minutes dc01 [root@MiWiFi-RA69-srv ~]# docker run -it --name dc03 --volumes-from doc01 hhh/centos [root@fac652a4d8ab /]# cd dataVolumContainer1 [root@fac652a4d8ab dataVolumContainer1]# ls dc01-add.txt dc02-add.txt [root@fac652a4d8ab dataVolumContainer1]# touch dc03-add.txt [root@fac652a4d8ab dataVolumContainer1]# ls dc01-add.txt dc02-add.txt dc03-add.txt
-
回到 dc01 查看到dc02 和 dc03 各自添加的都能共享
[root@MiWiFi-RA69-srv ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fac652a4d8ab hhh/centos "/bin/sh -c /bin/bash" 36 seconds ago Up 35 seconds dc03 bc133e323141 hhh/centos "/bin/sh -c /bin/bash" 15 minutes ago Up 14 minutes dc02 44847a5eb241 hhh/centos "/bin/sh -c /bin/bash" 24 minutes ago Up 24 minutes dc01 [root@MiWiFi-RA69-srv ~]# docker attach dc01 [root@44847a5eb241 dataVolumContainer1]# ls dc01-add.txt dc02-add.txt dc03-add.txt
-
删除父容器 dc01 后,若 dc02 更新 dc03 也同步更新
[root@MiWiFi-RA69-srv ~]# docker rm -f dc01 dc01 [root@MiWiFi-RA69-srv ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fac652a4d8ab hhh/centos "/bin/sh -c /bin/bash" about a minute ago Up about a minute dc03 bc133e323141 hhh/centos "/bin/sh -c /bin/bash" 16 minutes ago Up 16 minutes dc02 [root@MiWiFi-RA69-srv ~]# docker attach dc02 [root@bc133e323141 dataVolumContainer1]# ls dc01-add.txt dc02-add.txt dc03-add.txt [root@bc133e323141 dataVolumContainer1]# touch dc02-add-after-doc01-remove.txt [root@bc133e323141 dataVolumContainer1]# ls dc01-add.txt dc02-add-after-doc01-remove.txt dc02-add.txt dc03-add.txt [root@bc133e323141 dataVolumContainer1]# read escape sequence(这一步是 *** 作Ctrl+p+q) [root@MiWiFi-RA69-srv ~]# docker attach dc03 [root@fac652a4d8ab dataVolumContainer1]# ls dc01-add.txt dc02-add-after-doc01-remove.txt dc02-add.txt dc03-add.txt [root@fac652a4d8ab dataVolumContainer1]#
-
同理,删除 dc02 后,dc03 也能继续访问;若新建 dc04 继承 dc03 后再删除 dc03 , dc04数据也能继续访问。
-
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)