docker-compose-volumes的说明

docker-compose中有两种方式可以设置数据持久化。

1.绝对路径

1
2
3
4
5
6
7
db:
image: mariadb:latest
restart: always
ports:
- "3306:3306"
volumes:
- [直接使用宿主机的本地路径]:/var/lib/mysql

使用绝对路径直接挂载到本地,直观易于查看,但需要管理本地的路径。

2.卷标

1
2
3
4
5
6
7
8
9
10
db:
image: mariadb:latest
restart: always
ports:
- "3306:3306"
volumes:
- [卷标名称]:/var/lib/mysql

volumes:
[卷标名称]:

使用卷标的方式,简洁易于管理,但是数据实际存放的位置需要费点周折才能看到。

查看卷标的信息

1
2
docker volume inspect [卷标名称]
#输出的信息中 Mountpoint 即为数据实际存放的位置

还可以查看所有的卷标

1
docker volume ls

volumes与Bind Mount的区别

不同点 volumes bind mounts
Source位置 /var/lib/docker/volumes/… 可以任意指定
对已有挂载点影响 在容器第一次启动的时候,容器内映射目录的数据复制到volume 宿主机路径下的文件,覆盖掉容器内挂载路径文件的内容
是否支持单个文件映射 不支持,只能是目录 支持
权限控制 读写或者只读 读写或者只读
移植性 强,无需指定宿主机文件目录,默认在/var/lib/docker/volumes/目录下 弱,与宿主机绝对路径强绑定

1.关于volumes移植性强的解释

假设我们现在有一百台服务器,我们希望nginx容器在任何一台服务器上启动都使用同样的配置,达到同样的运行效果,该怎么做?

  • 如果是Bind Mount,Source文件路径你可以随意指定、随意命名。如果想达到一定的规范度,只能从制度上进行规范,在技术上很难限制。

  • 如果是volumes,运维人员创建的Volume只要名称是一致的,就可以认为文件路径是一致的,默认统一的放在/var/lib/docker/volumes/目录下。假如某天某个服务器/var/lib/docker磁盘空间不足,我们只需要重新挂载一个服务器硬盘,将/var/lib/docker的文件及目录整体迁移至新硬盘的新路径即可,修改docker默认存储路径为新路径,就对于容器的运行没有任何影响。

2.如何修改docker默认存储路径/var/lib/docker

vim /etc/docker/daemon.json ,添加如下内容:

1
2
3
{
"data-root": "/data/docker"
}

文件修改之后,重启docker引擎(需要注意的是:修改默认存储路径,如果你不希望原始的镜像及容器、数据卷等丢失,请先进行数据迁移。)

1
2
systemctl daemon-reload
systemctl restart docker

docker-compose-volumes的说明
https://johnnysxy.github.io/2023/05/15/docker-compose-volumes的说明/
作者
Johnny Song
发布于
2023年5月15日
许可协议