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

时间:2017-06-30 16:27:10

标签: mongodb rest 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,但它会挂起并超时(永远不会返回结果)。其余配置文件如下所示:

{ "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容器中,我还可以看到每次进行查询时连接数都会增加。

1 个答案:

答案 0 :(得分:3)

在docker 1.9之前,你必须使用“一个链接”,但它已被弃用。现在,您应该创建一个“自定义网络”https://docs.docker.com/engine/userguide/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

你需要配置节点使用主机名(与容器名称相同)与Mongo通信,并使用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
};