Docker小记-存储卷

2020/05/05 Docker

概念

  • 存储卷是容器目录树上的挂载点,是一个数据分割、持久化和共享的工具,有一个与容器无关的范围或生命周期。
  • 每一个存储卷就是容器目录树的挂载点在主机目录树中的位置,但不同的存储卷类型在主机的位置是不同的
    • 绑定挂载存储卷使用用户提供的主机目录或文件
    • 管理存储卷使用由Docker守护进程控制的位置,被称为Docker管理空间
  • 镜像适合打包和分发相对静态的文件,如程序;存储卷则持有动态或专门数据。这种区别使得镜像可重用,数据也可以简单分享。

绑定挂载卷

  • 绑定挂载卷是一种存储卷,指向主机文件系统上用户指定的位置。
  • 使用场景
    • 主机提供的文件或目录需要挂载到容器目录的特定位置
    • 将数据分享给运行在容器外的进程,比如主机系统组件
    • 比较适合需要使用特殊挂载点的工作站或机器,最好在通用平台或硬件池避免这类特定的绑定。 ### 使用
  • 下面的命令将启动一个ApacheHTTP服务器,将主机上的目录绑定挂载在容器服务器的文档根目录中: docker run -d --name web \ -v ~/example-docs:/usr/local/apache2/htdocs \ -p 80:80 \ httpd:latest
  • 使用-v选项和位置映射来创建绑定挂载卷。该映射以冒号分隔,映射键(冒号之前的路径)是主机文件系统上的一个绝对路径,该键值(冒号后的路径)是容器中挂载的目标存储位置,必须使用绝对路径指定该位置。
  • 当你在一个容器文件系统挂载存储卷,镜像中该位置的内容将被覆盖。
  • 如果指定了一个不存在的主机目录,Docker会为你创建相应的目录。但避免这么使用,最好在这个目录上对权限设置有更多的管控。
  • 如果用一整个目录绑定挂载到该位置,那么其他文件都将丢失。通过使用一个特定的文件作为存储卷,可以只覆盖或插入单个文件。(需要注意的重点是,文件必须在创建容器之前就存在于主机上。否则Docker会认为你想用一个目录,并在主机上创建它,把它挂载在需要的位置。)
  • 将挂载卷和存储卷设为只读权限:你可以通过在存储卷映射规则后追加:ro docker run -d --name web \ -v ~/example-docs:/usr/local/apache2/htdocs:ro \ -p 80:80 \ httpd:latest

缺点

  • 无法跨主机移植:将可移植容器绑定到特定主机的文件系统,如果容器的定义取决于主机文件系统特定位置上的内容,无论所在位置的内容可用或不可用,该定义无法跨主机移植
  • 创造了与其他容器发生冲突的机会

Docker管理卷

  • 管理卷创建:执行docker run使用-v选项(或–volume),指定容器目录树中的挂载点,Docker守护程序会在主机文件系统中创建存储卷,并由Docke管理,
  • 获取容器挂载点的列表,以及在主机目录树中的相应路径的方法: docker inspect -f "" docker-name
  • inspect子命令将输出容器挂载点的列表,以及在主机目录树中的相应路径。输出将是: {"/var/lib/cassandra/data":"/mnt/sda1/var/lib/docker/vfs/dir/632fa59c…"} 键是容器中的挂载点,键值是主机文件系统上的目录位置
  • 区分存储卷最好的方法是为每个管理卷定义一个容器。这样可以很具体地了解用了哪些存储卷还可以帮助你删除特定的存储卷。
  • 运行带有-v选项的docker rm命令将试图删除目标容器中引用的任何管理卷。任何有其他容器引用的管理卷将被忽略
  • 如果删除每一个已引用管理卷的容器,但没有使用-v标志,就会产生孤立卷。移除孤立卷,需要一系列手工操作

volumes-from共享卷

  • –volumes-from,可将卷从一个或多个容器复制到新的容器中。可设定多次,可指定多个源容器。
  • 复制卷始终具有相同的挂载点,且具有相同的卷定义

存储卷的高级容器模式

### 卷容器模式 - 这是一个只提供卷的句柄的容器。卷容器并不需要运行,因为停止时容器仍能保证存储卷的引用 - 当创建新容器时,使用已停止的容器作为–volumes-from标志来源。 ### 数据打包的存储卷容器 - 数据打包的卷容器将镜像中的静态内容复制到其定义的存储卷。这些容器可用于分发关键架构信息,如配置,密钥材料和代码。 - 使用存储卷,你可以注入不同的行为到容器中,而无需修改其镜像。 - 对于手动构建的镜像中包含的可用数据,需要复制出来,可通过运行和定义存储卷,并在容器启动时执行cp命令:

// 复制镜像内容到一个存储卷
docker run --name dpvc \
-v /config \
demo/ch4 /bin/sh -c 'cp /packed/* /config/'

Search

    Table of Contents