Skip to content

docker run --mount 和 -v 的区别

原文:https://docs.docker.com/storage/volumes/#choose-the--v-or---mount-flag

--mount-v 对比

在 Docker 中使用 --mount-v(或 --volume)都可以将宿主机的文件或目录挂载到容器中,但是两者在语法和功能上有一些区别:

  1. 语法和易用性

    • -v--volume:使用较简单的语法,例如 -v /宿主机路径:/容器路径。这种方式较为简洁,但功能相对有限。
    • --mount:使用更详细的语法,例如 --mount type=bind,source=/宿主机路径,target=/容器路径。这种方式提供了更多的配置选项,比如可以明确指定挂载类型(如 bindvolume),并且能够设置更多的参数(如 readonly)。
  2. 功能差异

    • --mount 提供了比 -v 更丰富的功能,例如可以设置挂载为只读(readonly),或者在使用卷类型挂载时可以指定标签(如 volume-label)、驱动器选项等。
    • 使用 --mount 时,如果挂载的源路径不存在,Docker 会报错并阻止容器启动。而使用 -v 时,如果源路径不存在,Docker 会自动创建它。
  3. 推荐使用

    • Docker 官方推荐使用 --mount,因为它的语法更明确,配置选项更丰富。特别是在生产环境中,使用 --mount 可以提供更精细的控制和错误处理。
  4. 兼容性和历史

    • -v 是更早的语法,由于其简单性,许多老旧的教程和脚本中仍然使用它。
    • --mount 是后来引入的,意在解决 -v 的一些局限性和不足。

总之,如果你需要更精细的挂载控制或更详细的配置选项,推荐使用 --mount。如果是简单的用例或者对兼容性有要求,使用 -v 也是完全可行的。

通过案例来区分

这里有几个常见的 Docker 挂载用例,分别使用 -v--mount 来展示:

1. 挂载本地目录到容器

  • 使用 -v

    bash
    docker run -d -v /path/on/host:/path/in/container myimage

    这个命令会在后台运行一个名为 myimage 的镜像,并将宿主机的 /path/on/host 目录挂载到容器的 /path/in/container 目录。

  • 使用 --mount

    bash
    docker run -d --mount type=bind,source=/path/on/host,target=/path/in/container myimage

    与使用 -v 相同的效果,但更明确指定了挂载类型为 bind

2. 创建并挂载一个卷到容器

  • 使用 -v

    bash
    docker run -d -v myvolume:/path/in/container myimage

    这个命令会创建一个名为 myvolume 的卷(如果尚未存在),并挂载到容器的 /path/in/container 目录。

  • 使用 --mount

    bash
    docker run -d --mount type=volume,source=myvolume,target=/path/in/container myimage

    同样是创建并挂载 myvolume,但这里更明确了挂载类型为 volume

3. 挂载为只读

  • 使用 -v

    bash
    docker run -d -v /path/on/host:/path/in/container:ro myimage

    这个命令将宿主机的 /path/on/host 目录以只读方式挂载到容器的 /path/in/container 目录。

  • 使用 --mount

    bash
    docker run -d --mount type=bind,source=/path/on/host,target=/path/in/container,readonly myimage

    这个命令同样将宿主机的 /path/on/host 目录以只读方式挂载到容器的 /path/in/container 目录,但在 --mount 中使用 readonly 参数来设置只读。

4. 挂载时指定卷的驱动器选项

  • 使用 --mount

    bash
    docker run -d --mount 'type=volume,source=myvolume,target=/path/in/container,volume-driver=custom-driver,volume-opt=o=size=100m' myimage

    这个命令创建并挂载一个名为 myvolume 的卷,使用自定义的卷驱动器 custom-driver,并设置卷大小为 100MB。注意,这种配置 -v 无法实现。

这些例子展示了 -v--mount 在实际应用中的不同用法。在实际开发和运维过程中,可以根据具体需求选择最适合的挂载方式。

--mount 的时候 type=volumetype=bind 的区别,传统的 -vtype=bind 还是 type=volume

在使用 Docker 的 --mount 选项时,type=volumetype=bind 表示两种不同的挂载方式,它们各自有不同的应用场景和行为:

type=volume(数据卷 也叫容器卷)

  • 定义type=volume 是用来挂载 Docker 管理的卷(volume)到容器中。这些卷是由 Docker 在宿主机上管理的,通常位于 Docker 的数据目录下,比如 /var/lib/docker/volumes/
  • 用途:使用卷(volume)挂载通常用于持久化和共享数据。卷可以独立于容器的生命周期存在,即使容器被删除,卷中的数据也可以保留,并且可以轻松地在不同的容器之间共享数据。
  • 特点:Docker 卷支持驱动程序,允许存储在远程主机和云提供者上,或使用特定的功能,如加密。卷挂载也更适合生产环境中的数据持久化需求。

type=bind(绑定挂载)

  • 定义type=bind 是用来将宿主机上的现有文件或目录挂载到容器中。这允许容器直接访问宿主机上的文件系统。
  • 用途:绑定挂载通常用于提供容器访问宿主机特定文件或目录的能力,这对于需要对宿主机资源进行操作或需要对配置文件进行快速更改的应用特别有用。
  • 特点:绑定挂载的内容直接反映宿主机上的文件系统变化,与卷挂载不同,它们不由 Docker 管理,而是直接依赖于宿主机的文件系统。

传统的 -v 参数

  • 行为:使用 -v--volume 参数时,可以实现绑定挂载或卷挂载,具体取决于参数的格式。如果指定的是路径,则它表现为绑定挂载;如果指定的是卷名,则表现为卷挂载。
  • 示例
    • 绑定挂载:docker run -v /host/path:/container/path ... 将宿主机的 /host/path 直接挂载到容器的 /container/path
    • 卷挂载:docker run -v volumename:/container/path ... 将名为 volumename 的 Docker 卷挂载到容器的 /container/path

总结来说,使用 -v 可以实现 type=bindtype=volume 的效果,具体取决于挂载的源是一个路径还是一个卷名。而使用 --mount 则需要明确指定挂载类型,这样使得配置更加明确和可控。

dockers --mount type 的值都有哪些

Docker 的 --mount 标志支持以下几种类型:

  1. type=bind:将宿主机的文件或目录绑定到容器中。这是最直接的一种方式,容器可以访问和修改宿主机的文件系统。
  2. type=volume:使用 Docker 管理的卷来存储容器数据。卷是由 Docker 管理,与宿主机的文件系统是隔离的,可以在多个容器之间共享。
  3. type=tmpfs:挂载一个临时文件系统到容器中,存储在宿主机的内存中。数据不会持久化,当容器停止时,数据会被清除。
  4. type=cache:用于构建缓存,通常在构建 Docker 镜像时使用,用于提高构建效率。缓存卷在构建过程中保存中间结果,可以在后续的构建中使用。
  5. type=secret:用于将敏感数据作为秘密传递给容器,而不是通过环境变量或者绑定挂载的方式,这样可以提供更好的安全性。

这些挂载类型在 Docker 的不同场景下有不同的用途。例如,对于需要持久化数据的应用,通常会使用 volume;而对于需要快速读写临时数据的应用,可能会使用 tmpfsbindsecret 分别用于将宿主机的文件或目录以及敏感数据安全地传递给容器。cache 类型则专门用于优化构建过程。

docker --mount type=volume 、 type=bind 和 type=cache 的区别

在 Docker 中,使用--mount标志可以指定不同类型的挂载来管理容器的文件系统。type=volumetype=bindtype=cache是三种不同的挂载类型,它们在用途和管理方式上有所区别:

  1. type=volume(数据卷)

    • 数据卷是 Docker 管理的一个存在于宿主机文件系统之外的存储空间。它允许你在多个容器之间共享数据,并且当容器被删除时,数据卷默认不会被删除,保证了数据的持久化。
    • 数据卷支持卷驱动程序,这意味着你可以使用第三方的存储解决方案来管理数据卷。
    • 使用数据卷时,容器和宿主机之间的数据传输效率可能会比 bind mount 略低,因为数据卷通常位于宿主机的文件系统之外。
  2. type=bind(绑定挂载)

    • 绑定挂载是将宿主机上的文件或目录直接挂载到容器中。与数据卷相比,它更加直接和快速,因为它直接使用宿主机的文件系统。
    • 绑定挂载不具备数据卷的某些特性,如跨容器数据共享,因为它们是直接映射到宿主机的特定文件或目录上的。
    • 如果挂载的文件或目录在宿主机上不存在,则不会被自动创建。
    • 当容器被删除时,绑定挂载不会自动删除,它完全依赖于宿主机的文件系统。
  3. type=cache(构建缓存卷)

    • 构建缓存卷是一种特殊类型的数据卷,用于加速容器的构建过程。它用于存储在构建过程中产生的中间文件,如未压缩的层、依赖项等。
    • 当容器构建完成后,构建缓存卷可以被清除,从而释放空间。下次构建同一个镜像时,缓存卷可以被重新使用,从而加快构建速度。
    • 构建缓存卷通常用于 CI/CD 环境中,以提高构建效率。 总结来说,选择哪种挂载类型取决于你的具体需求。如果你需要持久化数据并在多个容器之间共享,应该使用数据卷;如果你需要直接访问宿主机的文件系统,应该使用绑定挂载;如果你需要加速构建过程,可以使用构建缓存卷。在实际应用中,可以根据场景灵活选择合适的挂载类型。