我们创建了这样的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
答案 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 -
不需要expose
或publish
标志。自我提醒:浪费了1.5天。