最佳做法-匿名卷与绑定挂载

时间:2019-10-19 11:40:24

标签: docker docker-compose dockerfile

在容器中

可以创建匿名卷

VOLUME /build中具有语法(Dockerfile

具有volumes条目的/build以下语法

cache:
  build: ../../
  dockerfile: docker/dev/Dockerfile
  volumes:
    - /tmp/cache:/cache
    - /build
  entrypoint: "true"

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

卷是匿名的,因为/build指向Docker主机中某个随机的新位置(在/var/lib/docker/volumes目录中)

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

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


1)

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

2)

VOLUME /buildDockerfile

不同
volumes: 
 - /build 

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

2 个答案:

答案 0 :(得分:2)

实际上,匿名卷(/build)的使用比encouraged/tmp/cache:/cache)的使用要bind mounts

  

与绑定安装相比,卷具有几个优点:

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

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

答案 1 :(得分:2)

您缺少第三个关键选项命名卷。如果您声明:

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

Docker Compose将为您创建一个命名卷;例如,您可以使用docker volume ls查看它。您可以显式管理命名卷的生命周期,并在其上设置一些其他选项,这些选项有时很有用。 Docker文档中有a page describing named volumes的详细信息。

我建议命名卷严格优于匿名卷,因为它们能够显式查看创建和销毁它们的时间,并能够为其设置其他选项。您也可以将相同名称的卷装载到多个容器中。 (按照您所提出的一系列问题,通常建议您使用命名卷并将其装入几个容器中并替换volumes_from:。)

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

几乎不需要VOLUME指令。您可以将卷或主机目录装载到容器中,而不管它是否被声明为卷。它的技术效果是,如果没有在该位置安装新的匿名卷,则在该位置安装新的匿名卷。它的实际作用是防止将来的Dockerfile步骤修改该目录。如果您有VOLUME行,几乎可以随时删除它而不会影响任何内容。