即使暴露了端口也无法访问。连接被拒绝

时间:2019-03-08 01:18:22

标签: docker

我们创建了这样的docker容器:

docker container create \
    --name orderer \
    --network dscsa_net \
    --workdir $WORK_DIR \
    --expose=7050 \
    hyperledger/fabric-orderer:1.3.0 ./start-orderer.sh

,但无法连接到容器上的端口7050。

root@dcee7e74266f:/home# nc -vz 10.0.0.194 7050
nc: connect to 10.0.0.194 port 7050 (tcp) failed: Connection refused

我们能够ping通该容器:

root@dcee7e74266f:/home# ping 10.0.0.194
PING 10.0.0.194 (10.0.0.194) 56(84) bytes of data.
64 bytes from 10.0.0.194: icmp_seq=1 ttl=64 time=0.810 ms
64 bytes from 10.0.0.194: icmp_seq=2 ttl=64 time=1.30 ms
64 bytes from 10.0.0.194: icmp_seq=3 ttl=64 time=0.668 ms
64 bytes from 10.0.0.194: icmp_seq=4 ttl=64 time=1.10 ms
64 bytes from 10.0.0.194: icmp_seq=5 ttl=64 time=0.631 ms
^C
--- 10.0.0.194 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 0.631/0.902/1.301/0.261 ms

,还看到一个监听容器上端口7050的进程:

root@9756199efefa:/home# netstat -tuplen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 127.0.0.1:7050          0.0.0.0:*               LISTEN      0          10097930    7/orderer       
tcp        0      0 127.0.0.11:34865        0.0.0.0:*               LISTEN      0          10097705    -               
udp        0      0 127.0.0.11:51385        0.0.0.0:*                           0          10097704    -  

这是怎么回事?我们该如何解决呢?

编辑:我们在覆盖网络上。答案中建议的发布标志为n / a,因为我们正在进行容器到容器的通信。无论如何,我们尝试了它,但是它不起作用。

我们注意到一件事,那就是如果我们跑步:

docker network inspect <our-network-name> 

除其他事项外,它还会打印出containers节,但是在该节中仅列出了执行docker network inspect的主机上的容器。未列出托管在其他节点上的容器(也提到了here)。

我们验证了是否可以运行:

docker node ls

所有节点都是集群的一部分。

似乎其他人也遇到了这个问题,例如here,但是解决方案是什么?

注意:我们能够连接到另一个运行在端口7054上公开的其他服务的容器。此容器是在没有使用expose标志的情况下创建的。

root@dcee7e74266f:/home# nc -zv 10.0.0.164 7054
Connection to 10.0.0.164 7054 port [tcp/*] succeeded!

使用tcpdump进行的进一步调试和tcpdump的输出与有人尝试连接到没有进程正在侦听的端口时的输出相同。但是如前所述,netstat显示了一个正在侦听的进程,我们可以从localhost连接到该进程。

tcpdump的输出:

root@dcee7e74266f:/test# tcpdump -s0 host 10.0.0.195 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
23:44:45.978583 IP dcee7e74266f.52148 > orderer.dscsa_net.7050: Flags [S], seq 3845506108, win 28200, options [mss 1410,sackOK,TS val 4203049443 ecr 0,nop,wscale 7], length 0
23:44:45.979324 IP orderer.dscsa_net.7050 > dcee7e74266f.52148: Flags [R.], seq 0, ack 3845506109, win 0, length 0

R标志告诉客户端重置连接。

traceroute的输出:

root@dcee7e74266f:/test# traceroute 10.0.0.195     
traceroute to 10.0.0.195 (10.0.0.195), 30 hops max, 60 byte packets
 1  orderer.dscsa_net (10.0.0.195)  1.008 ms  0.900 ms  0.872 ms

2 个答案:

答案 0 :(得分:5)

Expose仅在图像或容器上设置元数据,而不能从外部访问端口。您正在寻找的选项是发布:

docker container create \
    --name orderer \
    --network dscsa_net \
    --workdir $WORK_DIR \
    --publish=7050:7050 \
    hyperledger/fabric-orderer:1.3.0 ./start-orderer.sh

答案 1 :(得分:0)

感谢1解决了此问题。服务器监听127.0.0.1是问题所在。将侦听地址更改为0.0.0.0(在下面的:::输出中显示为netstat)之后,我们就可以连接到服务器了:

root@e9766a94d102:/home# netstat -tuplen          
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 127.0.0.11:37641        0.0.0.0:*               LISTEN      0          12821468    -               
tcp6       0      0 :::7050                 :::*                    LISTEN      0          12821696    7/orderer       
udp        0      0 127.0.0.11:51855        0.0.0.0:*                           0          12821467    -       

不需要exposepublish标志。自我提醒:浪费了1.5天。