• Docker容器数据卷(七)


    Docker致力于:

    • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
    • 容器之间希望有可能共享数据

    Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。

    一、容器数据卷能做什么

    卷(volume)就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

    特点:

    1:数据卷可在容器之间共享或重用数据

    2:卷中的更改可以直接生效

    3:数据卷中的更改不会包含在镜像的更新中

    4:数据卷的生命周期一直持续到没有容器使用它为止

    二、容器内添加数据卷

    1. 直接命令添加

    # docker run -it -v /宿主机绝对路径目录:/容器内目录  镜像名
    # myDataVolume和dataValumeContainer由Docker自建
    docker run -it -v /myDataVolume:/dataValumeContainer centos
    # 如果想要创建多个容器卷, 则 -v /宿主机绝对路径目录:/容器内目录 这个选项多添加多个
    # 查看数据卷是否挂载成功 
    # docker inspect 容器ID
    # "Binds": [ # "/myDataVolume:/dataValumeContainer" # ]

    (1) 容器和宿主机之间数据共享

    在容器中创建一个文件:

    在宿主机器中查看,发现同样存在一个文件:

    (2) 容器停止退出后,主机修改后数据是否同步

    • 现在容器终端中输入停止且退出命令:exit
    • 在宿主机器终端中修改文件内容
    • 重新启动容器
    • 查看数据卷的内容

    (3) 带权限的数据卷

    # docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    # 以下这个命令表示容器卷的内容只读不可写
    docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos

    在容器中创建文件,提示没有权限:

    修改主机同步到容器的文件,提示:

    2. Dockerfile添加

    在 公共仓库 https://hub.docker.com/ 搜索镜像,可以找到Dockerfile,方便借鉴。

    (1) 根目录下新建mydocker文件夹并进入

    (2) Dockerfile构建,可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

    # 第一步:编写Dockerfile
    # filename Dockerfile
    # volume test # 相当于从centos镜像继承 FROM centos # 在容器内创建两个数据卷 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] # 执行 输出命令 CMD echo "finished,--------success1" # 执行 进入终端 CMD /bin/bash
    # 第二步:build后生成镜像
    # docker build [-f Dockerfile Path] -t 镜像名 .
    # 最后有一个.,表示当前目录
    docker build -f /mydocker/Dockerfile -t linhw/centos .

    出现上面的信息,则docker build成功,使用docker images可以查看我们刚才构建的镜像。

    (3) docker run容器

    可以发现一启动容器,就在容器创建了两个数据卷。

    那这两个数据卷对应的宿主机器的目录是什么呢?可以使用 docker inspect 镜像ID 查看。

    备注:

    若Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

    解决办法:在挂载目录后多加一个--privileged=true参数即可

    docker run -it -v /myDataVolume:/dataValumeContainer --privileged=true centos

    三、数据卷容器

    1. 数据卷容器是什么

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

    2. 演示步骤

    以之前新建的镜像linhw/centos为模板并运行容器dc01/dc02/dc03,它们已经具有两个容器卷dataVolumeContainer1和/dataVolumeContainer2

    (1) 运行容器dc01,并在/dataVolumeContainer2创建一个dc01-add.txt文件

    docker run -it --name dc01 linhw/centos
    cd dataVolumeContainer2
    touch dc01-add.txt

    (2) 以继承dc01的方式启动容器dc02

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

    查看容器dc02下的/dataVolumeContainer2,发现存在dc01-add.txt文件。

    在/dataVolumeContainer2添加dc02-add.txt。

    (3) 以继承dc01的方式启动容器dc03

    # --volumes-from dc01 继承dc01
    docker run -it --name dc03 --volumes-from dc01 linhw/centos

    查看容器dc03下的/dataVolumeContainer2,发现存在dc01-add.txt和dc02-add.txt文件。

    在/dataVolumeContainer2添加dc03-add.txt。

    (4) 回到dc01可以看到dc02/dc03各自添加的都能共享了,在dc02或dc03也能看到添加的文件都在,即每个容器的数据是所有容器数据的总和。

    (5) 删除dc01后,dc02和dc03的文件都还存在,可以访问。

    (6) 删除dc01后,修改dc02,dc03也可以实现数据共享和传递。

    (7) 删除dc02后,dc03依然可以访问。

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

  • 相关阅读:
    23种设计模式(转载)
    RabbitMQ JAVA客户端调用
    JavaScript中的this
    RedisDesktopManager 踩坑之旅
    webmagic使用手册
    Maven 手动添加本地jar包
    根据端口号查询 进程 并杀掉进程
    从经典面试题看java中类的加载机制
    Java线程的5种状态及切换(透彻讲解)
    JVM 类加载机制详解
  • 原文地址:https://www.cnblogs.com/myitnews/p/11512075.html
Copyright © 2020-2023  润新知