netcatclosuresdocker集装箱之间build立的连接

我在coreos上,并启动了三个容器。

docker run --rm -ti -p 80 --name one ubuntu /bin/bash docker run --rm --link one:one -p $HOST_IP::80 -ti --name two ubuntu /bin/bash docker run --rm -ti -p 80 --name three ubuntu /bin/bash $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 57b76ef98d16 ubuntu:14.04 "/bin/bash" 8 minutes ago Up 8 minutes 0.0.0.0:49154->80/tcp three a3160a19c377 ubuntu:14.04 "/bin/bash" 9 minutes ago Up 9 minutes $HOST_IP:$DOCKER_PORT->80/tcp two 0ac743ae3a1a ubuntu:14.04 "/bin/bash" 9 minutes ago Up 9 minutes 0.0.0.0:49153->80/tcp one,two/one 

我可以validation容器二可以与容器一对话。

 # container one, listen on port 80 $ hostname -i 172.17.0.2 $ nc -l 80 # container two, writing to port 80 (typing foo results in foo appearing on container one) $ hostname -i 172.17.0.3 $ nc 172.17.0.2 80 foo 

如果我尝试从容器3到容器2的通信,连接“成功”,但立即closures。

 # container two, listen on port 80 $ hostname -i 172.17.0.3 $ nc -l 80 # container three, writing to port 80 (connection gets just closed) $ hostname -i 172.17.0.4 $ nc $HOST_IP $DOCKER_PORT -v Connection to $HOST_IP $DOCKER_PORT port [tcp/*] succeeded! $ 

一些环境信息

 # coreos version $ cat /etc/lsb-release DISTRIB_ID=CoreOS DISTRIB_RELEASE=459.0.0 DISTRIB_CODENAME="Red Dog" DISTRIB_DESCRIPTION="CoreOS 459.0.0" # docker info $ docker info Containers: 4 Images: 278 Storage Driver: btrfs Execution Driver: native-0.2 Kernel Version: 3.16.2+ Operating System: CoreOS 459.0.0 # ubuntu container info $ uname -a Linux 57b76ef98d16 3.16.2+ #2 SMP Fri Oct 3 07:45:37 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 

我的问题是,为什么我不能写邮件从容器三到容器二,为什么连接可以build立,但仍然会自动closures。

netcat(和nc)的默认行为是自动closures连接(除非出现-k标志)。

就容器2和容器3之间的连接而言,容器2实际上并不是在底层主机上的端口80上进行监听,而是依靠NAT(networking地址转换)和stream量转发。 在这种情况下,您试图通过iptables“防火墙”进行循环,并且无法返回stream量。 这就是说,在当前的CoreOS alpha主机(459.0.0)上运行这个,我能够复制这个, 看到容器之间的stream量成功路由。 再用-k再试一遍,看看它是如何运作的。