【问题标题】:mongod --bind_ip using docker-compose version 2mongod --bind_ip 使用 docker-compose 版本 2
【发布时间】:2019-04-12 06:17:15
【问题描述】:

我正在尝试使用docker-compose 连接在 docker 上运行的两个 mongodb 容器。一个容器使用mongoimport 将一些数据播种到另一个容器。

但是,我在运行 mongoimport 时遇到以下错误

Failed: error connecting to db server: no reachable servers

我实际上可以从mongo-seed 访问mongodb 容器,因为我将ping -c 3 mongodb 附加到CMD 并且容器可以成功解析该主机名。

在我正在使用的文件下方:

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) Echo Request 数据包并等待 ICMP Echo 回复来运行。 Id 不需要 mongo 服务上的开放端口。 Mongo 导入确实需要一个开放端口。可能这是你的问题吗?

标签: mongodb docker docker-compose


【解决方案1】:

我终于可以连接两个容器了。我的发现在这里是为了记录目的。

要点

  • 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

【讨论】:

    【解决方案2】:

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

    通常,当应用程序和 mongodb 在同一服务器或容器上时,您会在 localhost ip 127.0.0.1 上连接到 mongodb。但是,当使用 docker 容器时,您可以认为 mongodb 是在另一台服务器上。您需要在连接到 mongodb 时提供该容器地址。您可以将 mongodb 容器的名称传递给主机参数。这样就不需要为容器设置 ipv4 地址了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2017-04-09
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多