最佳实践-匿名卷 VS 绑定挂载

5
在容器中可以使用语法(VOLUME /build)或者volumes指定/build条目在Dockerfile中创建匿名卷。
cache:
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - /tmp/cache:/cache
    - /build
  entrypoint: "true"

我的理解是,这两种方法(上述)都会在容器进入 Exited 状态后使卷 /build 可用。

这个卷是匿名的,因为 /build 指向docker主机中 /var/lib/docker/volumes 目录下的一些随机新位置。

我认为匿名卷比命名卷(如 /tmp/cache:/cache)更安全。

因为 /tmp/cache 位置很脆弱,很有可能被多个docker容器使用。


1)

为什么不鼓励使用匿名卷?

2)

Dockerfile 中的 VOLUME /build

相同吗?

volumes: 
 - /build 

docker-compose.yml文件中,是否存在需要同时提及两者的情况?

匿名挂载和绑定挂载都可以被其他容器重复使用。 - rok
2个回答

6

您错过了一个关键的第三个选项,命名卷。如果您声明:

version: '3'
volumes:
  build: {}
services:
  cache:
    image: ...
    volumes:
      - build:/build

Docker Compose会为您创建一个命名卷; 您可以使用docker volume ls来查看它,例如。 您可以明确地管理命名卷的生命周期,并在它们上设置几个其他选项,有时非常有用。 Docker文档详细描述了命名卷
我建议使用命名卷,因为能够显式地查看它们何时被创建和销毁,以及能够在它们上设置其他选项,比匿名卷严格优越。 您还可以将同一命名卷挂载到多个容器中 (在你之前的问题序列中,我通常鼓励您使用命名卷并将其挂载到几个容器中,以取代volumes_from:)。
命名卷与绑定挂载在两个方向上都有优缺点。 绑定挂载易于备份和管理 ,对于像日志文件这样需要直接检查的内容非常方便; 在MacOS系统上,它们非常慢。 命名卷可以独立于任何主机系统目录布局运行,并且很好地转换为像Kubernetes这样的集群环境,但是检查它们或备份它们要困难得多。
你几乎永远不需要使用VOLUME指令。 您可以将一个卷或主机目录挂载到容器中,而无论它是否声明为卷。 它的技术效果是如果没有其他东西被挂载在那里,它会在该位置上挂载一个新的匿名卷; 它的实际效果是防止未来的Dockerfile步骤修改该目录。 如果你有VOLUME行,你几乎总是可以将其删除而不影响任何内容。

3

实际上,与挂载绑定/tmp/cache:/cache)相比,鼓励使用匿名卷(/build):

卷具有比挂载绑定更多的优点:

  • 卷比挂载绑定更容易备份或迁移。
  • 您可以使用Docker CLI命令或Docker API管理卷。
  • 卷适用于Linux和Windows容器。
  • 卷可以在多个容器之间更安全地共享。
  • 卷驱动程序可让您将卷存储在远程主机或云提供商上,加密卷内容或添加其他功能。
  • 新卷的内容可以由容器预填充。

关于您的第二个问题,是的。您可以在docker-compose文件或Dockerfile中创建匿名卷。无需在两个位置都指定。


你是在称呼/tmp/cache:/cache为绑定挂载吗?查询已编辑。 - overexchange
查询中第二个问题有什么想法吗? - overexchange
你可以使用docker-compose创建卷,而无需在Dockerfile中声明它们,因此你只需要定义匿名卷一次。 - rok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接