You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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网络(比如计划后续扩展为多节点集群),需要做两步调整:

  1. 启用Docker Swarm模式
    在终端执行以下命令初始化Swarm:

    docker swarm init
    
  2. 修改网络配置添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:02:34