Docker部署Mongo副本集时overlay驱动无法使用的问题求助
解决Docker for Mac中Mongo副本集启动的网络权限错误
问题诊断
你遇到的PermissionDenied desc = network ... not manually attachable错误,核心原因有两个:
- 你配置了
overlay驱动的网络,但在Docker for Mac的单节点环境下,默认创建的overlay网络没有开启attachable属性,导致普通容器(非Swarm服务)无法连接; - 你的三个Mongo容器都映射了主机的
27017端口,这会引发端口冲突——即使解决了网络问题,第二个容器也会因为端口被占用启动失败。
解决方案(推荐方案:使用Bridge网络)
对于单节点的Mongo副本集,完全不需要使用overlay网络(overlay主要用于多节点Swarm集群场景),改用Docker默认的bridge网络即可解决问题,同时修复端口冲突:
修改你的docker-compose.yml如下:
version: '2' services: replica1: image: mongo:3.0 container_name: mongo1 ports: - "27017:27017" volumes: - ./mongodata/replica1:/data/db command: mongod --smallfiles --replSet "mrmtx" networks: - mongo_cluster replica2: image: mongo:3.0 container_name: mongo2 ports: - "27018:27017" # 修改主机端口避免冲突 volumes: - ./mongodata/replica2:/data/db command: mongod --smallfiles --replSet "mrmtx" networks: - mongo_cluster replica3: image: mongo:3.0 container_name: mongo3 ports: - "27019:27017" # 修改主机端口避免冲突 volumes: - ./mongodata/replica3:/data/db command: mongod --smallfiles --replSet "mrmtx" networks: - mongo_cluster networks: mongo_cluster: driver: bridge # 替换为bridge驱动
修改完成后,重新启动服务:
docker-compose down docker-compose up -d
备选方案:保留Overlay网络(适合未来扩展到Swarm集群)
如果你确实需要使用Overlay网络(比如计划后续扩展为多节点集群),需要做两步调整:
启用Docker Swarm模式
在终端执行以下命令初始化Swarm:docker swarm init修改网络配置添加
attachable属性
更新docker-compose.yml的网络部分,同时修复端口冲突:version: '2' services: # ... 保持服务配置不变,仅修改ports部分(同推荐方案) replica1: ports: - "27017:27017" replica2: ports: - "27018:27017" replica3: ports: - "27019:27017" # ... networks: mongo_cluster: driver: overlay attachable: true # 添加该属性允许普通容器连接
之后重新启动服务即可。
额外提示:初始化Mongo副本集
容器启动后,你需要进入其中一个容器初始化副本集:
docker exec -it mongo1 mongo
然后在Mongo shell中执行:
rs.initiate({ _id: "mrmtx", members: [ { _id: 0, host: "mongo1:27017" }, { _id: 1, host: "mongo2:27017" }, { _id: 2, host: "mongo3:27017" } ] })
内容的提问来源于stack exchange,提问作者Bruno Guerra
相关产品推荐
相关产品推荐

