我尝试使用docker-compose
连接在docker上运行的两个mongodb容器。一个容器使用mongoimport
将一些数据播种到另一个容器。
但是,我在运行mongoimport
Failed: error connecting to db server: no reachable servers
我实际上可以从mongodb
到达mongo-seed
容器,因为我已将ping -c 3 mongodb
附加到CMD
,并且容器可以成功解析该主机名。< / p>
在我使用的文件下方:
搬运工-compose.yml
version: '2'
services:
mongodb:
image: mongo:3.2
ports:
- "27017:27017"
mongo-seed:
build: ./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
蒙戈种子/ 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
有什么想法吗?我错过了什么?
答案 0 :(得分:11)
我终于可以设法连接两个容器了。我的发现是为了记录目的。
docker-compose
版本2创建了一个bridge
网络,并将所有容器添加到其中。mongod
不知道此网络,因此不会绑定到该IP。默认情况下,仅绑定到127.0.0.1
mongoimport
无法使用容器名称建立连接,即使它应该被转换为容器ip。network
--bind_ip
标志指向该静态IP mongoimport
<强>搬运工-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
<强>蒙戈种子/ 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
答案 1 :(得分:0)
另一种解决方案是在mongoimport --host my_mongodb
或mongo my_mongodb
之类的连接参数中使用容器名称作为主机名。
通常,当应用程序和mongodb都在同一服务器或容器上时,您将连接到localhost ip 127.0.0.1上的mongodb。但是,在使用Docker容器时,您可以认为mongodb好像在另一台服务器上。连接到mongodb时,需要提供该容器的地址。您可以将mongodb容器的名称传递给host参数。这样,您无需为容器设置ipv4地址。