• Docker之数据卷Volume(七)


    一、简介
     
    Docker数据卷(volume)机制。volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利。
    1)volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件
    2)volume能在不同的容器之间共享和重用
    3)对volume中数据的操作会马上生效
    4)对volume中数据的操作不会影响到镜像本身
    5)volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被删除
     
     
    二、使用
     
    1、创建volume
     
    1)创建colume,命名为volume_first
     
    docker volume create --name volume_first

    2)在容器启动docker run或者创建新容器docker create时,也可以使用-v标签为容器添加volume

    如:docker在启动时随机命名创建一个volume,并挂载在容器的/data下
     
    docker run -d -v /docker/data docker.io/centos /bin/bash

     
    Docker在创建volume的时候会在宿主机/var/lib/docker/volume/中创建一个以volume ID为名的目录,并将volume中的内容存储在名为_data的目录下
     
     
     
    3)创建一个指定名字的volume,test_volume挂载到容器的/docker/data目录下
     
    docker run -d -v test_volume:/docker/data docker.io/centos /bin/bash

     
     
     
    4)查看本地的volume,可以看到我们刚刚创建的,第一个是以容器命名,第二个是以指定命名的方式命名
     
     
     
     
    2、挂载volume
     
    在使用docker run或docker create创建新容器时,可以使用-v标签为容器添加volume。用户可以将自行创建或由Docker创建的volume挂载到容器中,也可以将宿主机上的目录或者文件作为volume挂载到容器中
     
    总结一下几种方式:上面已经用到了
    1)第一种方式
    docker volume create --name volume_first
    docker run -d -v volume_first:/data docker.io/centos /bin/bash
     
    2)第二种方式
    docker run -d -v /data docker.io/centos /bin/bash
     
    3)第三种方式,将宿主机上的目录挂载到容器中
    docker run -d -v /docker/data:/data docker.io/centos
     
    将宿主机的/docker/data文件夹作为一个volume挂载到容器中的/data。目录必须使用绝对路径,如果宿主机中不存在/docker/data目录,将创建一个新的目录。在/docker/data目录中的所有文件或文件夹可以在容器的/data目录下被访问。如果镜像中原本存在/data文件夹,该目录下的所有内容将被隐藏,以保持与宿主机中的目录一致。
     
    4)在volume挂载时,还可以指定volume的权限,如只读ro,也可以在volume挂载时使用z和Z来指定该volume是否可以共享。Docekr中默认的是z,及共享volume;使用Z表示私有该数据卷;使用多个-v标签为容器添加多个volume
     
    docker run -d -v /docker/data:/data:ro -v /docker/data2:/data2:z docker.io/centos
     
     
    3、使用Dockerfile添加volume
     
    1)vim Dockerfile
    FROM docker.io/centos
    VOLUME /test_data
     
    2)制作成镜像
    docker build -t volume_test .

     
    3)启动镜像得到容器
    docker run -d 7a5efba9248c

     
    4)查看该容器的volume信息
    docker inspect 972d67800f6130406290 |grep -A 11 Mounts

     
    可以看到是挂载成功的
     
    5)使用VOLUME指令添加多个volume
     
    VOLUME ["/data1","/data2"]
     
    6)与使用docker run -v不同的是,VOLUME指令不能挂载主机中指定的文件夹,这是为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的文件夹
     
     
    7、Dockerfile的使用Volume的注意事项
     
    如:vim Dockerfile
    FROM docker.io/centos
    RUN useradd lile
    VOLUME /data
    RUN mkdir /data && touch /data/file
    RUN chown -R lile:lile /data
     
    构建镜像:
    docker build -t volume_test .
     
    启动容器:
    docker run -d 833a592f9d3f
     
    查看该容器的卷信息:
    docker inspect 95b3bf6ef72b15304f |grep -A 11 Mounts
     
     
    查看挂载出来的文件是否授权并创建了一个文件,发现并没有
     
     
    这是因为在Dockerfile中使用VOLUME指令之后的代码,如果尝试对这个volume进行更改,这些修改都不会生效。这是因为Dockerfile中除了From指令的每一行都是基于上一行生成的临时镜像运行一个容器,执行一条指令并执行类似docker commit的命令得到一个新的镜像,这条类似docker commit
    命令不会对挂载的volumn进行保存
     
    解决办法:
    vim Dockerfile文件改为如下
    FROM docker.io/centos
    RUN useradd lile
    VOLUME /data
    CMD touch /data/file && chown -R lile:lile /data
     
    CMD指令和ENTRYPOINT指令是在容器启动时执行。
     
    8、共享volume
     
    在使用docker run或docker create创建新容器时,可以使用--volumes-from标签使得容器与已有的容器共享volume
     
    实验:
     
    1)基于docker.io/centos镜像启动一个名叫container1的容器,并在这个容器上创建名为test1的数据卷挂载在容器的/data目录
     
    docker run -d --name container1 -v test1:/data docker.io/centos
     
     
     
    2)创建容器2,此容器与容器1共享数据卷test1,可以从该容器考到挂载信息确实是容器一的
     
    docker run -d --name container2 --volumes-from container1 docker.io/centos

    3)与多个容器共享volumn
     
    docker run -d --name container1 -v test2:/data docker.io/centos
    docker run -d --name container2 -v test2:/log docker.io/centos
    docker run -d --name container3 --volumes-from container1 --volumes-from container2 docker.io/centos
     
    得到的结果如下:
     
     
     
     
    9、删除指定的volume
     
    1)方法一 删除volume
    docker volume rm first_volume
     
    2)方法二 删除容器
    docker rm -v container_name
     
    10、备份、恢复和迁移volumn
     
    备份:临时起一个容器与容器一共享数据卷,并且把当前路径挂载到容器的/backup ,这样打包后的文件便在当前路径了
    docker run -d --volumns-from container1 -v $(pwd):/backup docker.io/centos tar cvf /backup/data.tar /data
     
    恢复:
    docker run -d --volumes-from a5e77a6d6e0f854eb -v $(pwd):/backup docker.io/centos tar xvf /backup/data.tar -C /

    参考:《Docker容器与容器云》
  • 相关阅读:
    深入解析 float
    解决 css 浮动后 父元素高度失效问题
    高性能 Socket 组件 HP-Socket v3.2.1-RC1 公布
    基于lucene.net 和ICTCLAS2014的站内搜索的实现1
    史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发
    【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
    栈模拟队列 队列模拟栈
    状态机的两种写法
    Hadoop-2.2.0中文文档—— MapReduce 下一代--容量调度器
    OpenGLES 与 WebGL 中顶点属性的组织格式的误解
  • 原文地址:https://www.cnblogs.com/lemon-le/p/9238645.html
Copyright © 2020-2023  润新知