如何让两个Docker容器相互通话?

我有两个Docker容器正在运行。 一个是MongoDB,另一个是运行简单的rest API的容器,它应该能够查询MongoDB容器。

端口映射

  • 0.0.0.0:28001->27017/tcp(mongodb)
  • 0.0.0.0:3000->3000/tcp(restapi)

用于MongoDB映像的命令

docker run -p 28001:27017 -v /home/ubuntu/docker/mongodb/mongod.conf:/etc/mongod.conf --name mongodb_container -d mongodb_image 

我重写mongo.conf来添加0.0.0.0来绑定IP

 net: port: 27017 bindIp: [127.0.0.1,0.0.0.0] 

用于API的运行命令:

 docker container run -it -v /home/ubuntu/docker/node_modules:/usr/lib/node_modules -p 3000:3000 --name rest_container rest_image /bin/bash 

我能够查询其余的API,但它挂起和超时(永远不会返回结果)。 其余的configuration文件如下所示:

 { "db": { 'port': 28001, 'host': "192.168.123.191" }, 'server': { 'port': 3000, 'timeout': 120, 'address': "0.0.0.0" }, 'flavor': "regular", 'debug': true }; 

其余api容器的内部IP:

172.17.0.4

mongodb容器的内部IP:

172.17.0.2

我知道API的工作原理,因为我能够执行查询,而无需在docker上运行程序。 端口27017和3000都暴露在Dockerfile中。 在MongoDB容器中,我还可以看到每次查询时连接数都会增加。

在docker 1.9之前,你必须使用“一个链接”,但它已被弃用。 现在你应该创build一个“自定义networking” https://docs.docker.com/engine/userguide/networking )并在这个networking中运行你的容器。

例如 :

 docker network create --driver bridge my_network docker run --network=my_network -p 28001:27017 -v /home/ubuntu/docker/mongodb/mongod.conf:/etc/mongod.conf --name mongodb_container -d mongodb_image docker container run --network=my_network -it -v /home/ubuntu/docker/node_modules:/usr/lib/node_modules -p 3000:3000 --name rest_container rest_image /bin/bash 

你需要configuration节点与Mongo使用主机名(这是与containe'rs的名称相同)和使用Mongo容器的端口而不是外部端口,我的意思是端口27017不是28001.这就是为什么端口绑定-p 28001: 27017是不必要的,除非你想从外部访问它。

 { "db": { 'port': 27017, 'host': "mongodb_container" }, 'server': { 'port': 3000, 'timeout': 120, 'address': "0.0.0.0" }, 'flavor': "regular", 'debug': true };