Docker多容器多networking设置

我已经读了几个小时的docker坞,因为我是新来的,我试图创build单独的networking与容器相互沟通。

(这是要求,所以请不要提出单一的networking解决scheme

这是我docker-compose.yml文件:

 version: '2' services: client: container_name: client build: ./rest_client ports: - "5858:5858" - "3000:3000" networks: - client - server1 server1: container_name: server1 build: ./server_instance ports: - "5841:5840" - "4001:4000" networks: - client - server1 node1: container_name: node1 build: ./node_instance ports: - "5851:5850" - "5001:5000" networks: - server1 networks: client: driver: bridge server1: driver: bridge 

为了简单起见,我摆脱了大部分服务器和节点来澄清问题。

有了上述设置,我假设client能够通过client或服务器1networking与server1进行通信。

当我尝试发送基本如下所示的请求时:

 http://client:4001/api/requestnode 

或这个 :

 http://server1:4001/api/requestnode 

client

我越来越:

错误:连接ECONNREFUSED 172.19.0.5:4001

这意味着服务不会彼此看到?

当我运行一个单一的networkingtesting时,一切都很好。

我究竟做错了什么 ?

帮助非常感谢!

谢谢!

—编辑— docker run -it --rm --net container:id nicolaka/netshoot netstat -lnt

client和服务器1

在这里输入图像说明

另外从我的本地机器屏幕截图:

client

在这里输入图像说明

server1

在这里输入图像说明

 matewilk@matewilk:~$ docker run -it --rm --net container:658d89ba410f nicolaka/netshoot nslookup server1 nslookup: can't resolve '(null)': Name does not resolve Name: server1 Address 1: 172.19.0.4 server1.multisite_server1 matewilk@matewilk:~$ docker run -it --rm --net container:f032cfa52c60 nicolaka/netshoot ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 269: eth1@if270: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.18.0.2/16 scope global eth1 valid_lft forever preferred_lft forever 271: eth0@if272: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:13:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.19.0.4/16 scope global eth0 valid_lft forever preferred_lft forever 

对于容器到容器的通信,没有必要发布目标端口,你将直接与目标容器进行通信。 目标容器中的应用程序需要监听所有接口(0.0.0.0,而不是127.0.0.1)。 假设是这样,你应该可以连接到:

 http://server1:4000/api/requestnode 

服务器启动后。 请注意,客户端可能在服务器之前启动,因此您需要实施某种forms的重试或等待脚本,以确保服务器已经启动。