Docker 入门基础(三)

Docker 入门基础(三),第1张

Docker 入门基础(三) Docker 入门基础(三) Docker 镜像

Docker 镜像加载原理
Docker 镜像实际上有一层一层的文件系统组成,这种层级文件系统就是UnionFS(联合文件系统)

镜像:是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

UnionFS:联合文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Tomcat为例:
问:为什么Tomcat镜像的size达到680MB?
答:Tomcat镜像内部包含了所有搭建环境所需的基础文件,最终暴露出来的只有Tomcat镜像文件。
问:为什么采用这种分层结构?
答:共享资源。例如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需家在一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

Docker 容器数据

简介: Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。 卷就是目录或者文件,存在于一个或多个容器中,由docker挂载到容器,但不属于UnionFS,因此能够绕过UnionFS提供一些用于持续存储或者共享数据的特征。

设计目的: 数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

  1. 数据卷可以在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

具体实现:

一、直接命令添加

  1. 执行前查看目录下文件:
  2. 执行命令 docker run -it -v /宿主机绝对路径目录:/容器内目录 IMAGES
  3. 添加并修改宿主机下的文件,查看容器内文件也同步更改
  4. 添加并修改容器内的文件,查看宿主机下文件也同步更改
  5. 当容器关闭后,修改宿主机下文件,当再次运行容器时,容器内文件也会同步更新。
  6. 也可以使用该命令 :ro 表示容器内只允许读:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro IMAGES
  7. 若出现 cannot open directory.:Permission denied,在挂载目录后多加 --privileged=true 参数即可。

二、DockerFile 添加
(DockerFile 具体内容见 Docker 入门基础(四))

  1. 根目录下新建mydocker 文件并进入
  2. 新建DockerFile,并使用VOLUM指令给镜像添加一个或多个数据卷

由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。所以出于可移植性和分享的考虑,用 -v 主机目录:容器目录 这种方法不能够直接在DockerFile中实现。
DockerFile 中实现使用 VOLUM指令

# volume test
FROM centos
VOLUME ["/dataVolumContainer1","/dataVolumContainer2"]
CMD echo "finished,-------success"
CMD /bin/bash
  1. 使用 docker build -f /mydocker/Dockerfile -t hhh/centos . 生成新的镜像文件hhh/centos
  2. 使用 docker run 新生成的镜像
  3. 使用docker inspert 容器ID查看对应宿主机路径

    对应的宿主机路径:
数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器

容器间传递共享:--volumes-from
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

  1. 启动父容器 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
    
  2. 启动容器 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
    
  3. 回到 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
    
  4. 删除父容器 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]# 
    
  5. 同理,删除 dc02 后,dc03 也能继续访问;若新建 dc04 继承 dc03 后再删除 dc03 , dc04数据也能继续访问。

  6. 结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5426751.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存