zoukankan      html  css  js  c++  java
  • 5、docker容器数据卷: -v添加共享传递容器数据卷

    1、是什么

    1、docker理念

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

    2、保存数据用卷

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

    为了能保存数据在docker中我们使用卷。

    3、数据持久化

    一句话:有点类似我们Redis里面的rdb和aof文件

    容器中的数据持久化,比如保存到硬盘,保存到mysql

    容器数据卷--类似硬盘,做数据持久化的

    2、能干嘛

    1、卷 

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

    2、特点

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

    3、数据持久化、共享

    容器的持久化
    容器间继承+共享数据

        也可完成主机到容器,容器到主机

    3、添加数据卷:直接命令

    容器内添加

    1、直接命令添加

    docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

    docker ps
    dccker run -it -v /rootVolume:/dockerVolumen centos
    
    # 解释
    docker run -it 镜像名
        -v volumen 容器卷
    
    docker run -it -v /  :/ 
    两边都没有

    刷新,两边都生成了

    虚拟机

    docker

     

     

    2、查看数据卷是否挂载成功

    docker inspect 容器ID

    # test
    docker ps
    docker inspect 3434kjl
    已经挂载成功
    绑定成功

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

    docker创建docker.txt

     root可以看到docker.txt,再创建root.txt

     docker也可以看到root.txt

    4、容器停止退出后,主机修改后数据是否同步

    退出容器,关闭容器

    虚拟机,创建roottest

     启动容器,查看是否存在roottest

     

    6、命令(带权限)

    docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    # ro    readonly

    问题1: 哪边只读、???

     

    问题2:上一个docker是true,如果是False呢

    删除2个目录失败,详细见下节。

    关闭docker,重新run一个

    root,创建文件,写入内容

     docker,不能写入,不能创建

     所以:只允许主机单侧的读写,不允许容器 写

     

    7、--privilege=true

    备注:

    Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
    解决办法:在挂载目录后多加一个--privileged=true参数即可

    docker run -it -v /rootVolume:/dockerVolume:ro --privileged=true centos

    问题3:遇到的问题: 删除两边目录

     

    error:rm: cannot remove 'dockerVolume/': Device or resource busy

    umount: /dockerVolume: must be superuser to unmount.

     

     

     原因:

           在docker run 的时候默认是"unprivileged“的,只能删除该容器,重新做。

        下次再在docker run 的时候必须加上 --privileged,才能进行上面的操作

     参考:

      https://stackoverflow.com/questions/24614513/can-not-unmount-a-device-using-umount-in-docker

    4、添加数据卷:DockerFile

    1、DockerFile是什么

    tomcat的DockerFIle

    https://github.com/docker-library/tomcat/blob/8438be7c4c8434b617903ea5a478441ae04572c1/8.5/jdk8/openjdk/Dockerfile

    Docker镜像的描述脚本

     2、mkdir /mydocker

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

    本地机器

     mkdir /mydocker

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

    VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
     
    说明:
    出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
    由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

    有时候这个目录,在别的机器不存在

    2、vim DockerFile

    File构建

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

    解释

    # 解释
      centos镜像
      两个容器卷
      打印success
      shell  /bin/bash 

    等价于 

    docker run -it -v /host:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash

    3、build后生成镜像

    获得一个新镜像zzyy/centos

     

    docker build -f /mydocker/Dockerfile -t zzyy/centos .
    # 重点
    最后有个. 当前目录

    分成很多层

    docker images
    docker images zzyy/centos

    4、run容器

    docker run -it zzyy/centos /bin/bash
    pwd
    ls
    存在

    5、 主机对应默认地址

    通过上述步骤,容器内的卷目录地址已经知道 对应的主机目录地址哪??

    没有指定宿主机的

    默认路径

         /dataVolument: /var/lib/docerk/volumen/433524324234234234324324

     # 容器
    cd dataVolument
    touch docker.txt
    
     # 宿主机
    docker ps
    docker inspect 3443kdfg

    [root@localhost ~]# cd /var/lib/docker/volumes/7820ff68d42d62ccb1db0b16b82cb82f28348b43f80d1a106aac15364ac09be8/_data
    [root@localhost _data]# ls
    docker.txt

    [root@localhost _data]#
    [root@localhost _data]# touch root.txt

    # 容器

    [root@6f1b82355834 dataVolumeContainer1]# ls
    docker.txt root.txt

     

    4、数据卷容器

    1、是什么

    (1)数据卷,持久化的东西 

    (2)一条绳子上的蚂蚱
    命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

    (3)活动硬盘上挂活动硬盘,实现数据的传递依赖

    (4)通俗的说

    班长的活动硬盘,挂载在我这。实现主机到容器,容器到主机

    1组2组的活动硬盘挂载在班上上

     实现传递共享

    2、总体介绍

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

    3、容器间传递共享(--volumes-from)

    (1)先启动一个父容器dc01
    在dataVolumeContainer2新增内容

    docker ps
    None
    docker run -it --name dc01 zzyy/centos   # 指定NAMES
    ll
    cd dataVolument
    touch dc01add.txt
    crl + q+ p

     

    (2)dc02/dc03继承自dc01

        --volumes-from
    dc02/dc03分别在dataVolumeContainer2各自新增内容

    docker run -it --name dc02 --volumes-from dc01 zzyy/centos
    #--volumes-from 继承与dc01
    
    cd /datavolume
    ll 存在 dc01add
    touch dc02add
    ctrl +  q+ p

    # dc03 同理

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

    docker attach dc01
    cd DataVolument 
    ll
    
    # 都存在
    # 父到子,子到父,传递共享

     

    (4)删除dc01,dc02修改后dc03可否访问

    docker ps
    docker rm -f dc01   
    # 干掉父
    
    docker ps
    docker attach dc02
    pwd
    ll
    #3个都存在
    
    touch dc02update
    ll
    ctrl + q +p
    
    # 现在没有1了,在2上修改,3能看到吗
    
    docker ps
    docker attach dc03
    pwd
    ll
    # 4个都存在

    (5)删除dc02后dc03可否访问

    (6)再进一步,新建dc04继承dc03后再删除dc03

     

    4、结论:一条绳上的蚂蚱 

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

  • 相关阅读:
    ros 编译指定包
    TCP_IP Sockets编程C语言实现第2版 源码下载
    python 文件,文件夹,路径操作
    python 导入包
    ImportError: No module named rospy
    python安装simplejson
    EditPlus 中添加 Win32 ASM 语法支持
    程序设计学习与试验系统下载
    masm for windows2015 下载安装
    dosbox+masm汇编环境的安装和使用
  • 原文地址:https://www.cnblogs.com/venicid/p/11879403.html
Copyright © 2011-2022 走看看