使用docker-compose版本2时,如何在mongod命令中使用--bind_ip参数?

13

我正在尝试使用docker-compose连接运行在Docker上的两个MongoDB容器。其中一个容器使用mongoimport向另一个容器注入一些数据。

然而,当我运行mongoimport时,我遇到了以下错误:

Failed: error connecting to db server: no reachable servers

由于我将 ping -c 3 mongodb 添加到了 CMD 中,而容器成功解析了该主机名,因此我实际上可以从 mongo-seed 访问 mongodb 容器。

以下是我使用的文件:

docker-compose.yml

version: '2'

services:
  mongodb:
    image: mongo:3.2
    ports:
      - "27017:27017"

  mongo-seed:
    build: ./mongo-seed

mongo-seed/Dockerfile

FROM mongo:3.2

COPY init.json /init.json
CMD ping -c 3 mongodb && mongoimport --host mongodb --db test --collection users \
   --type json --file /init.json --jsonArray

mongo-seed/init.json

[
  {
    "name": "Joe Smith",
    "email": "jsmith@gmail.com",
    "age": 40,
    "admin": false
  },
  {
    "name": "Jen Ford",
    "email": "jford@gmail.com",
    "age": 45,
    "admin": true
  }
]

这是docker-compose up的输出结果:

mongo-seed_1  | PING mongodb (172.18.0.2): 48 data bytes
mongo-seed_1  | 56 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.116 ms
mongo-seed_1  | 56 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.141 ms
mongo-seed_1  | 56 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.114 ms
mongo-seed_1  | --- mongodb ping statistics ---
mongo-seed_1  | 3 packets transmitted, 3 packets received, 0% packet loss
mongo-seed_1  | round-trip min/avg/max/stddev = 0.114/0.124/0.141/0.000 ms
mongo-seed_1  | 2016-08-09T20:34:15.728+0000    [........................] smtt.devices 0.0 B/25.5 MB (0.0%)
mongo-seed_1  | 2016-08-09T20:34:17.992+0000    [........................] smtt.devices 0.0 B/25.5 MB (0.0%)
mongo-seed_1  | 2016-08-09T20:34:17.992+0000    Failed: error connecting to db server: no reachable servers
mongo-seed_1  | 2016-08-09T20:34:17.992+0000    imported 0 documents
mongo_mongo-seed_1 exited with code 1

有任何想法吗?我错过了什么吗?


Ping操作通过向目标主机发送Internet控制消息协议(ICMP)回显请求数据包并等待ICMP回显响应来运行。它不需要Mongo服务上的开放端口。 Mongo导入确实需要一个开放的端口。也许这就是你遇到的问题? - Bukharov Sergey
2个回答

17

我最终成功连接了两个容器。以下是我为了文档目的而记录的发现。

主要内容

  • docker-compose版本2会创建一个bridge网络并将所有容器添加到其中。
  • mongod不知道这个网络,因此不会绑定到那个ip地址。默认情况下,只绑定到127.0.0.1
  • mongoimport无法使用容器名称建立连接,即使它应该被翻译成容器IP。

解决方法

  • 通过显式定义network为mongodb分配静态IP
  • 使用指向该静态IP的--bind_ip标志初始化mongo容器
  • 使用IP地址而不是主机名与mongoimport一起使用

docker-compose.yml

version: '2'

services:
  mongodb:
    image: mongo:3.2
    ports:
      - "27017:27017"
    networks:
      mongo_net:
        ipv4_address: 172.16.0.1
    command: mongod --bind_ip 127.0.0.1,172.16.0.1

  mongo-seed:
    build: ./mongo-seed
    networks:
      mongo_net:
    depends_on:
      - mongodb

networks:
  mongo_net:
    driver: bridge
    ipam:
      config:
      - subnet: 172.16.0.0/24
        gateway: 172.16.0.254

mongo-seed/Dockerfile

FROM mongo:3.2

COPY init.json /init.json
CMD mongoimport --host 172.16.0.1 --db test --collection users \
   --type json --file /init.json --jsonArray

0

另一种解决方案是在连接参数中使用容器名称作为主机名,例如mongoimport --host my_mongodbmongo my_mongodb

通常情况下,当应用程序和mongodb都在同一台服务器或容器上时,您会连接到本地主机IP 127.0.0.1上的mongodb。然而,在使用Docker容器时,您可以将mongodb视为另一台服务器。连接到mongodb时,您需要提供该容器的地址。您可以将mongodb容器的名称传递给主机参数。这样,您就不需要为容器设置IPv4地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接