如何从主机连接到docker本地托管的mongodb副本集

问题描述 投票:0回答:2

我想在 docker 中创建本地 MongoDB 副本集,以便我可以在本地调试需要 mongo 会话/事务的程序。我有以下 compose 文件来启动 3 个所需的节点。我还有一个调用

rs.initialize
的脚本,也在下面。

服务器初始化正常,但我使用

mongosh mongodb://localhost:27001,localhost:27002,localhost:27003/test?replicaSet=devReplicaSet
的连接失败。

现在的问题是,容器用于相互连接的主机名和端口与主机用于连接到它们的主机名和端口不同。因此,我的种子连接最初使用本地主机主机名,然后复制集连接协议尝试告诉客户端连接到类似

mongo1:27017
的内容(正如容器所看到的那样)。但是我的主机不知道如何解析
mongo1:27017
,它知道它为
localhost:27001
并且连接失败。

那么我如何让容器将我转发到这个替代地址,或者如何为它们提供它们都理解的所有主机名和端口,无论它来自主机还是容器?

docker-compose.rs.yml

version: "3.9"
services:
  mongo1:
    hostname: 'mongo1'
    container_name: 'mongo1'
    image: mongo:5
    networks:
      - mongoCluster
    ports:
      - 27001:27017
    expose:
      - 27001
    entrypoint: mongod --replSet devReplicaSet --bind_ip localhost,mongo1
  mongo2:
    hostname: 'mongo2'
    container_name: 'mongo2'
    image: mongo:5
    networks:
      - mongoCluster
    ports:
      - 27002:27017
    expose:
      - 27001
    entrypoint: mongod --replSet devReplicaSet --bind_ip localhost,mongo2
    depends_on:
      - mongo1
  mongo3:
    hostname: 'mongo3'
    container_name: 'mongo3'
    image: mongo:5
    networks:
      - mongoCluster
    ports:
      - 27003:27017
    expose:
      - 27001
    entrypoint: mongod --replSet devReplicaSet --bind_ip localhost,mongo3
    depends_on:
      - mongo1
networks:
  mongoCluster:

带有 rs.initialize 的 powershell 脚本

# Run docker compose up with docker-compose.repl.yml file
docker-compose -f docker-compose.repl.yml up -d

# Wait for 5 seconds
Start-Sleep -Seconds 5

# Run docker exec -it mongo1 mongosh
docker exec -it mongo1 mongosh --eval "rs.initiate({ `
    _id: 'devReplicaSet', `
    members: [ `
      {_id: 0, host: 'mongo1:27017'}, `
      {_id: 1, host: 'mongo2:27017'}, `
      {_id: 2, host: 'mongo3:27017'} `
    ] `
   })"
mongodb docker docker-compose replicaset
2个回答
0
投票

连接字符串

mongodb://localhost:27001,localhost:27002,localhost:27003/test?replicaSet=devReplicaSet
应与副本集配置一致

members: [ 
  {_id: 0, host: 'mongo1:27017'}, 
  {_id: 1, host: 'mongo2:27017'}, 
  {_id: 2, host: 'mongo3:27017'} 
] 

前者使用主机系统域,后者使用 docker-compose 域。


0
投票

同样的问题,通过以下方式解决: 使用

extra_hosts
代替
network_mode: host
环境:Macos

services:
  mongo1:
    container_name: mongo1
    hostname: mongo1
    image: mongo
    restart: always
    ports:
      - 27017:27017
    extra_hosts:
      - "host.docker.internal:host-gateway"
    volumes:
      - "mongo1_data:/data/db"
      - "mongo1_config:/data/configdb"
    command: ["--replSet", "rs0", "--bind_ip_all", "--port", "27017"]

连接:

mongodb://host.docker.internal:27017/db?replicaSet=rs0&retryWrites=true&w=majority

© www.soinside.com 2019 - 2024. All rights reserved.