我的简短问题:
在docker-compose
中,两者之间有什么区别
volumes:
- type: volume
source: mydata
target: /data
和
volumes:
- type: bind
source: mydata
target: /data
?
问题很长:
在volumes
文件中指定docker-compose
选项时,可以使用long-syntax style
根据文档,type
选项接受3个不同的值: volume
, bind
和 { {1}} :
我了解tmpfs
选项-it means that the volume will not be saved after the container is down.。
但是我在文档中找不到关于其他两个选项之间的区别的参考文献:tmpfs
和bind
,有人可以启发我吗?
答案 0 :(得分:2)
当绑定装载是来自主机的文件时,卷更像是docker的nas。
这些卷带有自己的docker commands集;您也可以通过
查询此列表docker volume --help
您可以通过以下方式查看现有卷
docker volume ls
您可以通过以下方式创建命名卷
docker volume create my_named_volume
但是您也可以通过docker-compose
文件创建卷
version: "3.3"
services:
mysql:
image: mysql
volumes:
- type: volume
source: db-data
target: /var/lib/mysql/data
volumes:
db-data:
这是说的部分,请泊坞窗,在容器目录/ var / lib / mysql / data 顶部>上安装名为 db-data 的卷>
- type: volume
source: db-data
target: /var/lib/mysql/data
这是对docker 说的部分,请为我创建一个名为 db-data
的卷。volumes:
db-data:
有关三种安装类型的Docker文档:
答案 1 :(得分:2)
如果我对您的理解正确,那么您在问:卷和绑定安装之间有什么区别?
主机上管理和隔离方面的差异
绑定安装存在于主机文件系统上,并由主机维护者管理。
Docker外部的应用程序/进程也可以对其进行修改。
卷也可以在主机上实现,但是Docker将为我们管理它们,并且无法在Docker之外访问它们。
音量是更广泛的解决方案
尽管这两种解决方案都可以帮助我们将数据生命周期与容器分开, 通过使用 Volumes ,您可以在系统上获得更多的功能和灵活性。
借助 Volumes ,我们可以有效地设计数据,并通过将数据存储在专用远程位置(例如Cloud)并将其与外部服务(例如备份,监视,加密和硬件管理。
与绑定安装相比,更多卷具有以下优势:
gid
不匹配的情况下,这些权限会发生。
让我们采取两种情况。
案例1:Web服务器。
我们想为我们的Web服务器提供一个可能经常更改的配置文件。
例如:根据当前环境公开端口。
我们可以每次使用相关的设置来重建映像,或者为每个环境创建2个不同的映像。这两种解决方案都不是很有效。
使用 Bind挂载 Docker将给定的源目录挂载到容器内的某个位置。
(联合文件系统内部只读层中的原始目录/文件将被覆盖)。
例如-将动态端口绑定到nginx:
version: "3.7"
services:
web:
image: nginx:alpine
volumes:
- type: bind #<-----Notice the type
source: ./mysite.template
target: /etc/nginx/conf.d/mysite.template
ports:
- "9090:8080"
environment:
- PORT=8080
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template >
/etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
(*)请注意,也可以使用Volumes解决此示例。
案例2:数据库。
Docker容器不存储持久性数据:一旦容器停止运行,所有将写入容器的联合文件系统中可写层的数据都将丢失。
但是,如果我们有一个在容器上运行的数据库并且容器停止运行,那意味着所有数据都将丢失?
音量进行救援。
这些被命名为文件系统树,由Docker为我们管理。
例如-持久化Postgres SQL数据:
services:
db:
image: postgres:latest
volumes:
- "dbdata:/var/lib/postgresql/data"
volumes:
- type: volume #<-----Notice the type
source: dbdata
target: /var/lib/postgresql/data
volumes:
dbdata:
请注意,在这种情况下,对于命名卷,源是卷的名称 (对于匿名卷,将省略此字段)。