最佳实践 - 匿名卷与绑定安装

ove*_*nge 5 docker dockerfile docker-compose

在一个容器中,

可以创建匿名卷

使用语法( VOLUME /build)Dockerfile

或者

下面的语法volumes/build条目

cache:
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - /tmp/cache:/cache
    - /build
  entrypoint: "true"
Run Code Online (Sandbox Code Playgroud)

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

卷是匿名的,因为/build指向/var/lib/docker/volumesdocker 主机中的一些随机新位置(在目录中)

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

因为/tmp/cache位置很容易受到攻击,因为这个位置被多个 docker 容器使用的可能性更大。


1)

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

2)

VOLUME /buildDockerfile

不一样

volumes: 
 - /build 
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml文件中?是否有一种情况,我们需要同时提及两者?

Dav*_*aze 5

您缺少一个关键的第三个选项,名为 volumes。如果您声明:

version: '3'
volumes:
  build: {}
services:
  cache:
    image: ...
    volumes:
      - build:/build
Run Code Online (Sandbox Code Playgroud)

Docker Compose 会为你创建一个命名卷;docker volume ls例如,您可以使用 来查看它。您可以明确管理命名卷的生命周期,并在它们上设置几个偶尔有用的附加选项。Docker 文档有一个页面详细描述了命名卷

我建议命名卷严格优于匿名卷,因为能够明确地看到它们何时被创建和销毁,并且能够为它们设置额外的选项。您还可以将相同命名的卷安装到多个容器中。(在您一直在问的这一系列问题中,我通常鼓励您使用命名卷并将其安装到多个容器中并替换volumes_from:.)

命名卷与绑定安装在两个方向上都有优点和缺点。绑定挂载易于备份和管理,对于需要直接检查的日志文件等内容要容易得多;在 MacOS 系统上,它们非常慢。命名卷可以独立于任何主机系统目录布局运行,并且可以很好地转换为 Kubernetes 等集群环境,但检查或备份它们要困难得多。

你几乎从不需要VOLUME指令。无论是否声明为卷,您都可以将卷或主机目录挂载到容器中。它的技术效果是在那个位置挂载一个新的匿名卷,如果那里没有挂载其他任何东西;它的实际效果是防止以后的 Dockerfile 步骤修改该目录。如果您有VOLUME一行,您几乎可以随时删除它而不会影响任何内容。


rok*_*rok 3

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

与绑定挂载相比,卷有几个优点:

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

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