zoukankan      html  css  js  c++  java
  • Docker详解(三)— 镜像和容器卷

    序言:前两章我们主要介绍了Docker的概念和体系,以及Docker的镜像和容器命令,这一章我们将深入Docker镜像以及熟悉Docker的容器数据卷。OK,我们开始第三章的学习吧。

    Docker详解(一)
    Docker详解(二)
     
      

    Docker镜像

    镜像存储

    要了解 Docker镜像的存储首先务必得了解联合文件系统 UnionFS(Union File System).

    UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,并且可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

    Docker镜像加载原理:

    Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

    bootfs(boot file system):主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

    rootfs (root file system) :在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

    base镜像

    在了解base镜像之前,我们先说一下dockerFile,之前我们把镜像比作、容器比作实例,如果有人不理解dockerFile的话,那么横向对比,你可以把它看作是 .class 文件

    那么base镜像就是 没有 FROM 或者 FROM scratch开头的 DockerFile所构建出来的镜像

    base镜像通常都是各种 Linux发行版的镜像,如 Centos,Ubuntu,Debian 等

    且base 镜像提供的是最小安装的Linux发行版,此外 Docker Hub上 99% 的镜像都是通过在base镜像中安装和配置需要的软件构建而来

    下图是 官方 Centos 镜像 的 DockerFile内容

    镜像Commit

    docker commit 提交容器副本使之成为一个新的镜像

    docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

    案例演示

    1. 从Hub 上下载tomcat镜像到本地并成功运行 (也可采用阿里云加速下载)

    docker pull tomcat
    

    2. 故意删除上一步镜像生产tomcat的文档

    注:如果不想新开窗口,可以 后台启动 tomcat ( docker run -d -p 8888:8080 tomcat )

    docker exec -it 088c813ad8ca /bin/bash
    

    3. 提交删除文档的 tomcat容器副本 作为一个新的镜像

    docker commit -a="coke" -m="del tomcat docs" 088c813ad8ca coke/tomcat02:1.2
    

    4. 运行我们上传成功的测试镜像

    docker run -it  -p 8888:8080 coke/tomcat02:1.2
    

    Docker容器数据卷

    基本介绍

    Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,

    那么当容器删除后,数据自然也就没有了。

    为了保存数据,使容器之间可以进行数据共享,在Docker 中我们使用容器数据卷。

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

    主要用途: 1. 容器的持久化 2. 容器间继承 + 共享数据

    特点:

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

    数据卷

    我们接下来进行操作,尝试在容器 或者 DockerFile中 添加数据卷

    直接命令添加

    1、 命令添加

    docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash

    2、查看容器卷是否挂载成功

    docker inspect 容器ID

    3、容器和宿主机之间数据共享

    ①. 尝试在Docker 容器内进行写入,主机查看是否实时更新

    ②. 尝试在主机进行文件修改,在Docker容器进行查看是否实时更新

    注意:容器停止退出,主机修改文件,容器再次重启进入,主机修改的文件依然会同步到容器哦,有兴趣的可以试试。

    DockerFile 添加 (此处我们只要学会使用Dockerfile添加容器卷就行,Dockerfile后面会介绍)

    1、在主机根目录下 新建mydocker 文件夹,并进入

    mkdir mydocker 新建一个mydocker文件夹

    2、构建一个DockerFile

    vim DockFile vim编辑器 编辑DockerFile文件

    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished,--------success1"
    CMD /bin/bash
    

    docker build -f /mydocker/Dockerfile -t coke/centos . 在centos基础上构建自己的Dockfile

    3、run 容器

    docker run -it coke/centos 运行我们刚刚构建的镜像的实例容器

    4、获取主机的默认目录,后面 容器卷同步数据操作 同直接命令添加

    docker inspect 容器ID

    数据卷容器

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

    • 我们以上一步新建的镜像 coke/centos 为模板运行容器 dc01/dc02/dc03
    • 它们已经具有的容器卷:/dataVolumeContainer1、/dataVolumeContainer2

    1、先启动一个父容器dc01,在dataVolumeContainer2新增内容

    cd dataVolumeContainer2
    touch doc01_add.txt
    

    2、dc02/dc03继承自dc01,分别在dataVolumeContainer2中新增内容

    docker run -it --name dc02 --volumes-from dc01 coke/centos dc02继承dc01

    说明:doc02继承doc01后,容器卷中的文件做到了共享

    docker run -it --name dc03 --volumes-from dc01 coke/centos dc03继承dc02

    3、回到dc01可以看到02/03各自添加的数据都能共享了

    4、删除dc01,dc02修改后打dc03可否访问

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

  • 相关阅读:
    UE4 ios环境搭建备忘
    我所理解的打击感 逐帧分析过几十款游戏的开发者经验分享
    可重入锁和不可重入锁
    Java中JDK和JRE的区别是什么?它们的作用分别是什么?
    Java开发岗位面试题
    详解手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
    docker:轻量级图形页面管理工具Portainer
    Docker整合dockerfly实现UI界面管理(单机版)
    docker for mac的JSON配置文件中的hosts项修改后无法生效
    Maven [ERROR] 不再支持源选项 5。请使用 6 或更高版本
  • 原文地址:https://www.cnblogs.com/dwlovelife/p/11568124.html
Copyright © 2011-2022 走看看