无法从远程客户端访问Docker容器内的MongoDB副本集

时间:2020-06-03 04:51:20

标签: mongodb docker mongodb-replica-set

我已经在Docker Container中设置了mongoDB Replicaset(3-repicas)。我可以从主机访问复制集,但无法从远程客户端访问mongoDB Replicaset。

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

用于创建mongoDB副本集的脚本:

[ 83%] Building C object src/CMakeFiles/fluent-bit-bin.dir/fluent-bit.c.o
[ 83%] Building C object src/CMakeFiles/fluent-bit-bin.dir/flb_dump.c.o
Linking C executable ../bin/fluent-bit
../library/libflb-plugin-filter_grep.a(grep.c.o): In function `delete_rules':
grep.c:(.text+0x4e3): undefined reference to `flb_ra_destroy'
../library/libflb-plugin-filter_grep.a(grep.c.o): In function `set_rules':
grep.c:(.text+0x861): undefined reference to `flb_ra_create'
../library/libflb-plugin-filter_grep.a(grep.c.o): In function `grep_filter_data':
grep.c:(.text+0xa6a): undefined reference to `flb_ra_regex_match'
../library/libflb-plugin-filter_rewrite_tag.a(rewrite_tag.c.o): In function `process_config':
rewrite_tag.c:(.text+0x9b5): undefined reference to `flb_ra_create'
rewrite_tag.c:(.text+0xa9c): undefined reference to `flb_ra_destroy'
rewrite_tag.c:(.text+0xade): undefined reference to `flb_ra_create'
rewrite_tag.c:(.text+0xb3b): undefined reference to `flb_ra_destroy'
../library/libflb-plugin-filter_rewrite_tag.a(rewrite_tag.c.o): In function `process_record':
rewrite_tag.c:(.text+0xf6a): undefined reference to `flb_ra_regex_match'
rewrite_tag.c:(.text+0xfe2): undefined reference to `flb_ra_translate'
../library/libflb-plugin-filter_rewrite_tag.a(rewrite_tag.c.o): In function `destroy_rules':
rewrite_tag.c:(.text+0x12a3): undefined reference to `flb_ra_destroy'
rewrite_tag.c:(.text+0x12b3): undefined reference to `flb_ra_destroy'
collect2: error: ld returned 1 exit status
make[2]: *** [bin/fluent-bit] Error 1
make[1]: *** [src/CMakeFiles/fluent-bit-bin.dir/all] Error 2
make: *** [all] Error 2
$ 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

以上命令成功。

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

> rs.initiate({_id: "my-mongo-set", version: 1, members: [
  { _id: 0, host : "mongo0:30000" },
  { _id: 1, host : "mongo1:30001" },
  { _id: 2, host : "mongo2:30002" }
]});

即使这样可行:

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

我的/ etc / hosts文件:

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

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

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

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

这是因为从3.6版开始,mongod仅侦听localhost -address,直到您另行通知为止。检查here!或Google“ mongod bindIp”。