Efr*_*tan 7 docker docker-compose docker-volume
TLDR
在中docker-compose,有什么区别
volumes:
- type: volume
source: mydata
target: /data
Run Code Online (Sandbox Code Playgroud)
和
volumes:
- type: bind
source: mydata
target: /data
Run Code Online (Sandbox Code Playgroud)
?
问题很长:
volumes在docker-compose文件中指定选项时,可以使用长语法样式
根据该文档,所述type选项接受3个不同的值:volume,bind和tmpfs:
我了解该tmpfs选项- 这意味着在关闭容器后将不会保存该卷。。
但是我在文档中找不到其他两个选项之间区别的参考:bind和volume,有人可以启发我吗?
β.ε*_*.βε 23
当绑定挂载是来自主机的文件时,卷更像是docker 的 nas。
这些卷带有自己的一组docker 命令;您也可以通过以下方式查阅此列表
docker volume --help
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式查看现有卷
docker volume ls
Run Code Online (Sandbox Code Playgroud)
您可以通过创建命名卷
docker volume create my_named_volume
Run Code Online (Sandbox Code Playgroud)
但是您也可以通过docker-compose文件创建卷
version: "3.3"
services:
mysql:
image: mysql
volumes:
- type: volume
source: db-data
target: /var/lib/mysql/data
volumes:
db-data:
Run Code Online (Sandbox Code Playgroud)
这是说请 docker的部分,将名为db-data的卷挂载到容器目录 /var/lib/mysql/data 的顶部
- type: volume
source: db-data
target: /var/lib/mysql/data
Run Code Online (Sandbox Code Playgroud)
这是对 docker 说的部分,请为我创建一个名为db-data的卷
volumes:
db-data:
Run Code Online (Sandbox Code Playgroud)
关于三种挂载类型的 Docker 文档:
Rtm*_*tmY 19
如果我理解正确,您就是在问: Volumes 和 bind mounts 有什么区别?
主机上管理和隔离的差异
绑定挂载 存在于主机文件系统上并由主机维护者管理。
Docker 之外的应用程序/进程也可以修改它。
Volumes也可以在宿主机上实现,但是 Docker 会为我们管理它们,并且它们不能在 Docker 之外访问。
卷是一个更广泛的解决方案
尽管这两种解决方案都帮助我们将数据生命周期与容器分开,但通过使用Volumes,您可以获得比系统更多的功能和灵活性。
使用Volumes,我们可以有效地设计我们的数据,并通过将数据存储在专用的远程位置(例如云)并将其与备份、监控、加密和硬件管理等外部服务集成,从而将其与主机和系统的其他部分分离。
与绑定安装相比,更多的 Volumes 优势:
gid。让我们来看看 2 个场景。
案例 1:Web 服务器。
我们希望为我们的 Web 服务器提供一个可能经常更改的配置文件。
例如:根据当前环境暴露端口。
我们可以每次使用相关设置重建映像,或者为每个环境创建 2 个不同的映像。这两种解决方案都不是很有效。
使用Bind mounts 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;'"
Run Code Online (Sandbox Code Playgroud)
(*) 请注意,此示例也可以使用 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:
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,对于命名卷,源是卷的名称(对于匿名卷,此字段被省略)。
Feature | Bind | Volume\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2 \xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0 |
|---|---|---|
| 内在灵魂 | 绑定挂载将主机文件系统上用户指定的位置附加到容器文件树中的特定点。 | 卷附加到主机文件系统或云存储上的磁盘存储。 |
| 命令 | --mount type=bind,src="",dst="" | Docker CLIdocker volume命令 |
| 依赖性 | 取决于主机文件系统的位置。 | 独立于容器的数据管理 |
| 关注点分离 | 不 | 是的 |
| 与其他容器冲突 | 是示例: Cassandra 的多个实例均使用同一主机位置作为数据存储的绑定安装。在这种情况下,每个实例都会竞争同一组文件。如果没有文件锁等其他工具,这可能会导致数据库损坏。 | 不会。默认情况下,Docker 使用local卷插件创建卷。 |
| 何时选择 | 1-当主机提供容器中运行的程序所需的文件或目录,或者容器化程序生成由在容器外部运行的用户或程序处理的文件或日志时,绑定挂载非常有用。 2-适用于工作站、具有专门关注点的机器的工具 3-具有更传统配置管理工具的系统。 | 使用持久存储 1.数据库 2.云存储 |
| 什么时候不该选择 | 最好避免在通用平台或硬件池中进行此类特定绑定。 | 待写 |
| 归档时间: |
|
| 查看次数: |
3483 次 |
| 最近记录: |