在容器中
可以创建匿名卷
在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 /build
在Dockerfile
与
不同volumes:
- /build
在docker-compose.yml
文件中?是否有一种情况,我们需要同时提及两者?
答案 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
行,几乎可以随时删除它而不会影响任何内容。