【问题标题】:Unable to access MongoDB replicaset inside Docker Container from remote client无法从远程客户端访问 Docker 容器内的 MongoDB 副本集
【发布时间】:2020-06-03 04:51:20
【问题描述】:

我在 Docker 容器中设置了一个 mongoDB Replicaset (3-repicas)。我可以从主机访问副本集,但无法从远程客户端访问 mongoDB 副本集。

参考:https://www.sohamkamani.com/blog/2016/06/30/docker-mongo-replica-set/

创建 mongoDB 副本集的脚本:

$ docker run -it -v <host mount path>:/data/db -p 30000:30000 --name mongo0 --net my-mongo-cluster -d mongo --replSet my-mongo-set --port 30000
$ docker run -it -v <host mount path>:/data/db -p 30001:30001 --name mongo1 --net my-mongo-cluster -d mongo --replSet my-mongo-set --port 30001
$ docker run -it -v <host mount path>:/data/db -p 30002:30002 --name mongo2 --net my-mongo-cluster -d mongo --replSet my-mongo-set --port 30002
$docker exec -it mongo1 mongo
> rs.initiate({_id: "my-mongo-set", version: 1, members: [
  { _id: 0, host : "mongo0:30000" },
  { _id: 1, host : "mongo1:30001" },
  { _id: 2, host : "mongo2:30002" }
]});

以上命令成功。

我尝试从 docker 容器外的同一主机访问 mongo Replicaset:

$ mongo mongodb://<PUBLIC_IP>:30000,<PUBLIC_IP>:30001,<PUBLIC_IP>:30002/?replicaSet=my-mongo-set
my-mongo-set:PRIMARY> 

即使这样也有效:

$ mongo mongodb://localhost:30000,localhost:30001,localhost:30002/?replicaSet=my-mongo-set
my-mongo-set:PRIMARY> 

我的 /etc/hosts 文件:

$ cat /etc/hosts
127.0.0.1 localhost mongo0 mongo1 mongo2
<PUBLIC_IP> <domain> mongo0 mongo1 mongo2

什么不工作: 从远程客户端(shell 和 MongoDB Compass):

$ mongo mongodb://<PUBLIC_IP>:30000,<PUBLIC_IP>:30001,<PUBLIC_IP>:30002/?replicaSet=my-mongo-set
connecting to: mongodb://<PUBLIC_IP>:30000,<PUBLIC_IP>:30001,<PUBLIC_IP>:30002/?replicaSet=my-mongo-set
2020-06-02T22:56:53.776+0530 I NETWORK  [js] Starting new replica set monitor for my-mongo-set/<PUBLIC_IP>:30000,<PUBLIC_IP>:30001,<PUBLIC_IP>:30002
2020-06-02T22:56:53.796+0530 I NETWORK  [ReplicaSetMonitor-TaskExecutor] Successfully connected to <PUBLIC_IP>:30000 (1 connections now open to <PUBLIC_IP>:30000 with a 5 second timeout)
2020-06-02T22:56:53.796+0530 I NETWORK  [js] Successfully connected to <PUBLIC_IP>:30002 (1 connections now open to <PUBLIC_IP>:30002 with a 5 second timeout)
2020-06-02T22:56:53.805+0530 I NETWORK  [ReplicaSetMonitor-TaskExecutor] changing hosts to my-mongo-set/mongo0:30000,mongo1:30001,mongo2:30002 from my-mongo-set/<PUBLIC_IP>:30000,<PUBLIC_IP>:30001,<PUBLIC_IP>:30002
2020-06-02T22:56:54.315+0530 W NETWORK  [js] Unable to reach primary for set my-mongo-set
2020-06-02T22:56:54.315+0530 I NETWORK  [js] Cannot reach any nodes for set my-mongo-set. Please check network connectivity and the status of the set. This has happened for 1 checks in a row.

2020-06-02T22:56:54.821+0530 W NETWORK  [js] Unable to reach primary for set my-mongo-set
2020-06-02T22:56:54.821+0530 I NETWORK  [js] Cannot reach any nodes for set my-mongo-set. Please check network connectivity and the status of the set. This has happened for 2 checks in a row.

如何解决这个问题?

【问题讨论】:

    标签: mongodb docker mongodb-replica-set


    【解决方案1】:

    这是因为从 3.6 版开始,mongod 只侦听 localhost -address,除非您另有说明。检查here! 或谷歌“mongod bindIp”。

    【讨论】:

    • 我尝试了几个选项:1. 将 IP 绑定到 localhost 和 publicIP 2. 将 IP 绑定到 0.0.0.0。在选项 #1 中,我无法连接到容器,但在选项 #2 中,我能够连接到副本集,但不能从远程客户端连接。 #1 $ docker run -it -v /mnt/volume_blr1_01/mongo0:/data/db -p 30000:30000 --name mongo0 --net my-mongo-cluster -d mongo --replSet my-mongo-set --bind_ip [localhost, &lt;PUBLIC_IP&gt;] --port 30000 #2 $docker run -it -v /mnt/volume_blr1_01/mongo0:/data/db -p 30000:30000 --name mongo0 --net my-mongo-cluster -d mongo --replSet my-mongo-set --bind_ip 0.0.0.0 --port 30000
    • 首先..使用bind_ip时,IP地址列表中逗号后面不能有空格。所以不是“ip1,ip2”,它必须是“ip1,ip2”,当然因为你在docker里面运行mongod,它必须监听那个内部地址。其次,您是否检查过您的防火墙没有阻止从外部连接到这些端口? “iptables -L -n”是检查的好命令...
    • 我没有在 ip1 和 ip2 之间给出相同的值。我使用 ufw 允许访问端口 30000、30001 和 30002。但它仍然不起作用。是的,因为我在 docker 中运行 mongod,它会监听内部地址,但我已经暴露了一个端口供外部访问,我应该通过该端口连接到容器。正如我所说,我能够从同一主机连接到复制集,但不能从远程主机连接。这与我在 /etc/hosts 中的条目有关吗?
    • 你试过使用参数--bind_ip_all吗?如果您尝试使用(docker 主机内的外壳)'telnet 30000',结果会怎样,您得到任何答案吗?如果我知道docker是如何工作的,那些端口3000x连接到所有主机网卡,所以你使用localhost或host-ip没有区别......如果两者都不起作用,那么一定有一些块(比如防火墙)
    • 嗨@Rajkrishnan,你解决问题了吗?我在这里面临同样的问题。提前致谢。
    猜你喜欢
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 2018-10-10
    • 2019-06-11
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多