跨三台机器部署MongoDB ReplicaSet的Docker Compose配置咨询
跨主机部署MongoDB副本集的Docker Compose配置方案
问题1:如何配置Docker Compose实现跨主机部署
Docker Compose是单主机编排工具,无法通过一个配置文件将服务分发到不同主机。因此需要为每台主机单独编写仅包含自身节点的Compose文件,并将副本集配置中的节点地址替换为实际主机名(而非容器名),具体配置如下:
1.1 主节点(primary-1.com)的docker-compose.yml
仅定义主节点服务,调整健康检查逻辑为仅验证节点状态(初始化操作手动执行):
version: "3.8" services: mongo-primary: image: mongo:5 container_name: mongo-primary command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30001"] volumes: - ./data/mongo-primary:/data/db # 本地持久化目录,需提前创建并设置权限 ports: - 30001:30001 healthcheck: test: test $$(echo "rs.status().ok" | mongo --port 30001 --quiet) -eq 1 interval: 10s start_period: 30s
1.2 副本节点1(backup-1.com)的docker-compose.yml
仅定义第一个副本节点:
version: "3.8" services: mongo-backup1: image: mongo:5 container_name: mongo-backup1 command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30002"] volumes: - ./data/mongo-backup1:/data/db ports: - 30002:30002 healthcheck: test: test $$(echo "rs.status().ok" | mongo --port 30002 --quiet) -eq 1 interval: 10s start_period: 30s
1.3 副本节点2(backup-2.com)的docker-compose.yml
仅定义第二个副本节点:
version: "3.8" services: mongo-backup2: image: mongo:5 container_name: mongo-backup2 command: ["--replSet", "my-replica-set", "--bind_ip_all", "--port", "30003"] volumes: - ./data/mongo-backup2:/data/db ports: - 30003:30003 healthcheck: test: test $$(echo "rs.status().ok" | mongo --port 30003 --quiet) -eq 1 interval: 10s start_period: 30s
1.4 手动初始化副本集
所有节点启动并通过健康检查后,进入主节点容器执行初始化:
docker exec -it mongo-primary mongo --port 30001
在Mongo Shell中执行:
rs.initiate({ _id: 'my-replica-set', members: [ { _id: 0, host: 'primary-1.com:30001' }, { _id: 1, host: 'backup-1.com:30002' }, { _id: 2, host: 'backup-2.com:30003' } ] })
执行rs.status()确认副本集状态正常即可。
问题2:是否需要在每个主机上运行该docker-compose文件
是的,每台主机仅负责运行自身的Mongo节点容器,因此需要在primary-1.com、backup-1.com、backup-2.com分别部署对应节点的Compose文件,并执行docker-compose up -d启动服务。
额外注意事项
- 三台主机必须确保网络互通,开放对应端口(30001/30002/30003)的入站规则;
- 本地持久化目录需提前创建,并设置正确权限(可执行
sudo chown -R 999:999 ./data/mongo-xxx,Mongo容器默认使用UID/GID为999的用户); - 若主机有防火墙或安全组,需允许三台主机之间的Mongo端口通信;
- 若使用IP而非主机名,需确保IP是静态的,避免节点地址变化导致副本集故障。
内容的提问来源于stack exchange,提问作者pylos
相关产品推荐
相关产品推荐

