2017-09-04 93 views
0

我已经读了几个小时的码头坞站,因为我对它很陌生,我试图创建具有相互通信容器的单独网络。码头多容器多网络设置

(这是必要条件,所以请不建议燎网络解决方案

这是我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或网络与进行通信。

当我尝试发送它基本上是这样的请求:

http://client:4001/api/requestnode 

或本:

http://server1:4001/api/requestnode 

client

我越来越:

Error: connect ECONNREFUSED 172.19.0.5:4001

这将暗示服务不会彼此看到?

当我在单个网络上运行测试时一切正常。

我在做什么错?

帮助非常感谢!

谢谢!

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

client & accordintly

enter image description here

而且从我的本地机器的屏幕截图:

client

enter image description here

enter image description here

[email protected]:~$ 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 



[email protected]:~$ 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: [email protected]: <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: [email protected]: <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 

回答

1

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

http://server1:4000/api/requestnode 

服务器启动后。请注意,客户端可能在服务器之前启动,因此您需要实施某种形式的重试或wait-for-it,如脚本以确保服务器已先启动。

+0

时间不是问题,我可以轻松地从我的本地机器调用所有服务。另外,我需要映射端口,因为我有同一个容器的多个实例,并且要求它们是独立的服务器,所以我为每个实例设置了不同的端口,因此映射。另外,我不确定你为什么提到'127.0.0.1'?这在我的问题中根本没有提到。所以问题依然存在,容器之间没有沟通,没有明显的原因。 – matewilk

+0

对于docker来说,收听环回是一个常见的错误。请注意,在我上面的回答中,您需要连接到端口4000,而不是端口4001,容器不会在主机上看到您发布的端口,而只能看到目标容器内的实际端口。 – BMitch

+0

同样的问题恐怕'错误:连接ECONNREFUSED 172.18.0.2:4000' – matewilk