Volume 是 docker 容器生成持久化数据的首选机制。bind mounts 依赖主机机器的目录机构,volume 完全由 docker 管理。volume 较 bind mounts 有几个优势:
 
        1. volume 比 bind mounts 更易备份和迁移。
 
        2. 可以使用 docker cli 命令和 API 管理 volume。
 
        3. volume 工作在 linux 和 windows 容器上。
 
        4. volume 在多个容器间共享可以更安全。
 
        5. volume 驱动允许存储 volume 到主机和云,加密 volume 内容,或者添加其它功能。
 
        6. 新的 volume 可以含有容器预放置的内容。
 
另外,volume 通常与持久化数据到容器的可写层相比是更好的选择,因为 volume 不增大容器的大小,并且 volume 的内容不在容器的生命周期之外。
 
如果容器产生不持久化的状态数据,考虑使用 tmpfs mount 来避免永久存储,并且通过避免写入容器的可写层来增加容器性能。
 
 
选择 -v 还是 –mount
 
    最初,-v 或 –volume 用于独立的容器,–mount 用于 swarm 服务。
 
    而自 Docker 17.06 开始,你可以将 –mount 用于独立的容器。一般而言,–mount 更明确和冗长。
 
    最大的不同是,-v 语法把所有的选项绑定到一行,而 –mount 语法把它们分开。
 
    如果需要指定 volume 驱动选项,你必须使用 –mount。
 
    -v 或 –volume: 包含三个字段,由冒号分割。字段必须保持正确顺序,每个字段的含义不是很明显。
 
        1. 在有名字的 volume 中,第一个字段是 volume 的名字,在主机上唯一。对于匿名的 volume,第一个字段可以省略。
        2. 第二个字段是文件或目录挂载到容器中的路径。
        3. 第三个字段是可选的,是逗号分隔的选项列表,比如 ro 。
 
    –mount : 包含多个键值对,由逗号隔开,每一个是 <key>=<value>对。–mount 语法比 -v 或 –volume 更冗余,但键的顺序并不重要,value 更容易理解。
 
        1. 挂载的 type 可以是 bind, volume, tmpfs。本节讨论 volume,所以类型总是 volume。
        2. 挂载的 source。对于有名字的 volume,它是 volume 的名字,对于匿名的 volume,这个字段可以省略,可以指定为 source 或 src。
        3. destination 的值表示文件或目录 挂载到容器中的路径。可以指定为 destination,dst,target。
        4. reanonly 选项,如果存在,导致作为只读挂载到容器中。
        5. volume-opt 选项,可以指定不止一次,有一个含选项名和值的键值对。
 
 
-v 和 –mount 的行为差异
 
    相对 bind mounts,所有 volume 的选项对 –mount 和 -v 都可用。
 
    当与 service 一起使用 volume 时,只有 –mount 是支持的。
 
 
创建和管理 volume
 
    不像 bind mount, 你可以在容器外面创建和管理 volume。
 
    $ docker volume create myvol
    $ docker volume ls
    $ docker inspect myvol
    $ docker volume rm myvol
 
 
带着 volume 启动 container
 
    如果启动容器时带的容器不存在,那么 docker 会创建一个。
 
    # -v 将主机 /var/lib/docker/volumes/volume_os 挂在到容器中 /var/lib/docker/volume_os,以下两条等同。
 
    docker run –rm -it -v volume_os:/var/lib/docker/volume_os 5e8b97a2a082
    docker run –rm -it –mount ‘type=volume,src=volume_os,dst=/var/lib/docker/volume_os,volume-driver=local’ 5e8b97a2a082
 
 
带着 volume 启动 service
 
    当你启动一个 service 并且定义了一个 volume,每一个 service 容器使用它自己的本地 volume。
 
    如果你使用 volume 的 local 驱动,没有一个容器可以共享它的数据。
 
    示例启动四个复制的 nginx 服务,每一个使用本地 volume 叫 myvol2。
 
    $ docker service create -d \
        –replicas=4 \
        –name devtest-service \
        –mount source=myvol2,target=/app \
        nginx:latest
 
    验证服务正在运行:docker service ps devtest-service  
 
    移除服务:docker service rm devtest-service,移除 service 不会移除任何 service 创建的 volume。volume 移除是独立的步骤。
 
    docker service create 命令不支持 -v 或 –volume 标记,必须使用 –mount 标记。
 
 
使用容器放置 volume
 
    如果启动一个容器,容器中被挂载的目录有文件或目录,那么目录的内容会被拷贝到 volume 中。
    
    $ docker run -d –name=nginxtest -v nginx-vol:/usr/share/nginx/html nginx:latest
    
 
使用只读 volume
 
    $ docker run -d –name=nginxtest -v nginx-vol:/usr/share/nginx/html:ro nginx:latest
 
 
在机器间共享数据
 
    当构建容错性应用时,你可能需要配置多个复制的相同服务来访问相同的文件。
 
    当开发应用时,有多种方式可以取得。第一种是应用把文件存到云对象系统中,比如 Amazon S3,另一种是创建一个支持把文件写到外部存储系统(如NFS)的 volume 驱动。
    
    volume 驱动允许你从应用层抽象底层存储系统。例如,如果 service 使用一个 NFS 驱动的 volume,你可以更新 service 使用不同的驱动,比如把数据存储到云中,而不需要改变应用逻辑。
 
 
使用一个 volume 驱动
 
    初始化安装
    $ docker plugin install –grant-all-permissions vieux/sshfs    
    
    使用一个 volume 驱动创建 volume
    $ docker volume create –driver vieux/sshfs \
        -o sshcmd=test@node2:/home/test \
        -o password=pwd sshvolume \
        sshvolume
 
    启动容器时创建使用 volume 驱动的 volume
    $ docker run -d \
        –name sshfs-container \
        –volume-driver vieux/sshfs \
        –mount src=sshvolume,target=/app, volume-opt=sshcmd=test@node2:/home/test, volume-opt=password=pwd \
        nginx:latest
 
 
备份,恢复,迁移 data volume
 
    volume 对备份,恢复,迁移 有用。使用 –volumes-from 标记来创建一个新的容器挂载到 volume.
 
    备份一个容器
 
      # 启动新容器,从 dbstore 容器中挂载 volume,挂载一个本地目录叫 backup,传递一个命令压缩 dbdata volume 的内容到 /backup 目录的 backup.tar
      docker run –rm –volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
 
    从备份中恢复容器
    
      # 创建一个容器 dbstore2:
      docker run -v /dbdata –name dbstore2 ubuntu /bin/bash
      # 解压缩备份文件到新容器的数据 volume 中:
      docker run –rm –volumes-from dbstore2 -v $(pwd):/backup ubuntu bach -c “cd /dbdata && tar xvf /backup/backup.tar –strip 1”
 
    你可以使用以上技术来自动备份、迁移、恢复来测试。
 
 
移除 volume
 
    docker 数据 volume 在容器被删除后依旧存在。有两种类型的 volume。
 
        1. 有名字的 volume:有一个指定的容器外的来源。
        2. 匿名的 volume:没有指定来源,所以当容器被删除时会指示 docker 守护进程引擎移除它们。
        
    移除匿名 volume 
 
        要自动移除匿名容器使用 –rm 选项。例子中,命令创建一个匿名 volume /foo 。当容器移除时,docker 引擎移除 /foo volume,但不会移除 awesome volume
        $ docker run –rm -v /foo -v awesome:/bar busybox top
 
    移除所有未使用的 volume
 
        $ docker volume prune

 

Guide:https://docs.docker.com/storage/volumes/

Link:https://www.cnblogs.com/farwish/p/9260613.html

posted on 2018-07-03 21:09 farwish 阅读() 评论() 编辑 收藏

版权声明:本文为farwish原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/farwish/p/9260613.html