如何在Docker中配置共享目录为PostgreSQL数据卷供多容器使用
实现PostgreSQL容器的集中共享存储(Ubuntu 17.10 + Docker 17)
没问题,我来一步步帮你搞定这个需求。首先得提前说清楚:PostgreSQL的核心数据目录/var/lib/postgresql/data绝对不能同时被多个容器实例读写(会直接损坏数据),所以我们的集中存储可以用来给每个容器分配独立的子目录,或者共享备份、通用配置这类非核心数据。下面是具体操作:
1. 创建主机上的集中存储目录
先在Ubuntu主机上建一个专门的根目录,用来统一存放所有PostgreSQL容器的相关数据,同时设置正确的权限(容器内的postgres用户UID是999,必须让这个用户能读写该目录,否则容器启动会失败):
# 创建根目录 sudo mkdir -p /opt/postgres-shared-storage # 调整权限,适配容器内的postgres用户 sudo chown -R 999:999 /opt/postgres-shared-storage sudo chmod -R 700 /opt/postgres-shared-storage
2. 创建专属Docker网络
为了让多个容器在同一网络内互相访问(也方便后续管理),我们创建一个自定义的Docker网络:
docker network create postgres-shared-network
后续所有需要使用这个共享存储的PostgreSQL容器,都要加入这个网络。
3. 运行PostgreSQL容器并挂载共享存储
方式1:每个容器使用共享存储下的独立子目录(推荐,避免数据冲突)
比如启动第一个容器,挂载/opt/postgres-shared-storage/db1到容器内的数据目录:
docker run -d \ --name postgres-db1 \ --network postgres-shared-network \ -e POSTGRES_PASSWORD=your-db-password \ -v /opt/postgres-shared-storage/db1:/var/lib/postgresql/data \ postgres:latest
再启动第二个容器,使用共享存储下的db2子目录:
docker run -d \ --name postgres-db2 \ --network postgres-shared-network \ -e POSTGRES_PASSWORD=your-db-password \ -v /opt/postgres-shared-storage/db2:/var/lib/postgresql/data \ postgres:latest
这样两个容器的数据都集中存放在主机的/opt/postgres-shared-storage下,且互相独立,完全不会冲突。
方式2:共享非核心数据目录(比如备份脚本、静态配置)
如果你只是想共享一些通用的配置或者备份文件,可以挂载共享存储到容器内的其他目录,比如:
docker run -d \ --name postgres-db1 \ --network postgres-shared-network \ -e POSTGRES_PASSWORD=your-db-password \ -v /opt/postgres-shared-storage/db1:/var/lib/postgresql/data \ -v /opt/postgres-shared-storage/shared-backups:/backups \ postgres:latest
这样多个容器都可以访问/backups目录下的备份文件,实现共享需求。
4. 验证配置是否生效
- 查看容器是否正常运行:
docker ps - 进入容器查看挂载情况:
docker exec -it postgres-db1 bash,然后执行df -h,可以看到/var/lib/postgresql/data对应的主机路径 - 在一个容器的共享目录下创建文件,比如在
/backups下创建test.txt,然后在另一个容器的/backups目录下查看是否能看到该文件,验证共享是否成功。
重要注意事项
- 绝对不要让多个PostgreSQL容器同时挂载同一个
/var/lib/postgresql/data目录,PostgreSQL不支持多实例共享同一个数据目录,会直接导致数据损坏。 - 一定要确保主机目录的权限设置正确,否则容器内的postgres用户无法读写数据,容器会启动失败。
- Docker 17版本相对较旧,建议如果条件允许的话升级到更稳定的版本,但上述操作在Docker 17下完全兼容。
内容的提问来源于stack exchange,提问作者Ahsan Mukhtar
相关产品推荐
相关产品推荐

