docker 挂载卷

2,657 阅读3分钟

docker run 命令并包含 -v--volume 标志时,你可以在 Docker 容器和宿主机之间挂载卷。卷提供了一种在容器和宿主机之间共享文件的方式,并且这些文件独立于容器存在,这意味着即使容器被删除,数据仍然保留在卷中。

使用 -v 标志指定挂载卷的基本语法如下:

 docker run -v <host_dir_or_volume>:<container_dir> [options] <image>

这里 <host_dir_or_volume> 是宿主机上的目录或一个已命名的卷,而 <container_dir> 是容器内部的目录。

指定挂载卷的模式:

  1. 只读挂载 (ro): 如果你希望容器只能读取卷上的数据,但不能写入或修改数据,你可以添加 :ro 到挂载选项中:

     docker run -v <host_dir_or_volume>:<container_dir>:ro <image>
    
  2. 只写挂载 (rw): 默认情况下,挂载的卷是可读写的。如果你明确想要可读写权限,你可以指定 :rw,但这通常是多余的,因为这是默认行为。

  3. 缓存模式 (cached): 在某些情况下,你可能希望挂载的卷具有缓存行为,这对于读取密集型的工作负载可能有益。在 Docker 19.03 及更高版本中,你可以在 :cached 模式下挂载卷。

示例:

如果你想挂载宿主机上的 /home/user/data 目录到容器的 /app/data 目录,并且容器只能读取这个目录,你可以这样执行:

 docker run -v /home/user/data:/app/data:ro <image>

如果你想创建一个新的卷,并将其挂载到容器的 /app/data 目录,你可以这样做:

docker volume create my-data-volume
docker run -v my-data-volume:/app/data <image>

在这种情况下,my-data-volume 是一个由 Docker 管理的卷,它位于宿主机的 /var/lib/docker/volumes 目录下。这种卷的好处是,你可以更轻松地管理数据的备份和迁移,因为它们与容器的生命周期分离。

传播模式

可以指定propagation模式,这将影响宿主机和容器之间文件系统调用的传播方式。propagation模式主要在Linux系统中使用,因为它涉及到内核的文件系统权限和隔离设置。目前,Docker支持以下几种传播模式:

  1. rprivate (default):这是默认模式,意味着容器内的文件系统调用不会传播到宿主机。这提供了更好的隔离性,因为容器中的进程不能影响宿主机的文件系统。
  2. rshared:在这个模式下,容器内的文件系统调用会传播到宿主机和其他以rsharedrslave模式挂载的容器。这意味着多个容器可以共享同一个宿主机目录的变化。
  3. rslave:容器内的文件系统调用会传播到宿主机,但不会传播给其他容器。这通常用于允许容器访问宿主机的特定资源,同时保持与其他容器的隔离。
  4. zZ:这两个选项用于SELinux(Security-Enhanced Linux)环境下的标签,它们分别代表了不执行任何SELinux上下文转换和执行SELinux上下文转换。这通常用于确保容器内的文件遵循SELinux的安全策略。

要指定传播模式,你可以在-v标志后添加:<mode>,其中<mode>是你选择的传播模式。例如:

 docker run -v /host/path:/container/path:rshared <image>

在这个例子中,/host/path将以rshared模式挂载到容器的/container/path,这意味着其他以rsharedrslave模式挂载的容器也将能够看到这个目录的变化。