Docker 学习(五)

一、容器数据卷是什么

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

二、容器数据卷能干嘛

  1. 卷就是目录或文件,存在于一个或多个容器中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供的一些用于持续存储或共享数据的特性,卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷
  2. 特点:
    (1) 数据卷可在容器之间共享或重用数据
    (2) 卷中的更改可以直接生效
    (3) 数据卷中的更改不会包含在镜像的更新中
    (4) 数据卷的生命周期一直持续到没有容器使用它为止

三、数据卷

1、直接命令添加

  1. 命令

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

    eg:

    docker run -it -v /myHostData:/myContainerData centos:6.8
    
  2. 查看数据卷是否挂载成功

    docker inspect 容器ID
    

    查看容器内部细节,会显示如下内容:
    在这里插入图片描述

  3. 容器和宿主机之间数据共享:在主机这边目录下创建一个 hello.txt 文件,写上 host first update,然后在容器这边可以看得到该文件,且内容也是 host first update

  4. 当容器停止退出后,主机修改数据之后,容器重新启动,内容会同步更新

  5. 命令(带权限)

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

    eg:

    docker run -it -v /myHostData:/myContainerData:ro centos:6.8
    

    再次查看内部细节显示如下,此处的 false 表示只读,不可写,此时只能由宿主机来进行写操作,容器只有读的权限
    在这里插入图片描述

2、DockerFile 添加

  1. 根目录下新建 mydocker 文件夹并进入
    mkdir mydocker
    cd mydocker
    
  2. 可在 DockerFile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷
    VOLUME["/myContainerData1","/myContainerData2","/myContainerData3"]
    
    由于可移植性和分享的考虑,用 -v 主机目录:容器目录这种方法不能直接在 DockerFile 助攻实现。因为宿主机目录是依赖于特定宿主机的,并不能够保证所有的宿主机都存在这样的特定目录
  3. File 构建
    vim dockerfile
    # 添加如下内容
    #volume test
    FROM centos:6.8
    VOLUME ["/myContainerData1","/myContainerData2","/myContainerData3"]
    CMD echo "finished,-------success1"
    CMD /bin/bash
    
  4. build 后生成镜像,获得一个新镜像(注意最后的空格和点)
    docker build -f /mydocker/dockerfile -t vip/centos:6.8 .
    
    # 查看镜像,会发现有一个新镜像 vip/centos:6.8
    docker images
    
  5. run 容器
    docker run -it vip/centos:6.8
    
    # ls 查看,会发现已经有 myContainerData、myContainerData2、myContainerData3 三个文件夹(或容器卷)
    ls
    
  6. 通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址在哪?
    # 获得 vip/centos:6.8 的容器 ID
    docker ps 
    # 查出宿主机默认的地址
    docker inspect 容器 ID
    
    在这里插入图片描述

3、可能出现的问题

  1. Docker 挂载主机目录 Docker 访问出现 cannot open directory .: Permission denied
  2. 解决办法:在挂载目录后多加一个 --privileged=true 参数即可,eg:
    docker run -it -v /myHostData:/myContainerData --privileged=true 镜像名
    

四、数据卷容器

  1. 是什么
    命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
  2. 容器间传递共享(–volumes-from)
    # 创建一个容器 dc01 并运行
    docker run -it --name dc01 vip/centos:6.8
    # 进入该共享文件夹
    cd myContainerData2
    # 新建文件
    touch dc01_add.txt
    
    # 容器 dc02 继承自 dc01
    docker run -it --name dc02 --volumes-from dc01 vip/centos:6.8
    # 查看该共享文件夹,存在文件 dc01_add.txt
    ls myContainerData2
    
  3. 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值