我在 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
我可以验证容器二可以与容器一通信。
# 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
如果我尝试以相同的方式从容器三到容器二进行通信,则连接“成功”但会立即关闭。
# 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
我的问题是为什么我无法从容器三向容器二写入消息,以及为什么可以建立连接,但仍会自动关闭。
答案1
netcat(和 nc)的默认行为是自动关闭连接(除非-k
出现标志)。
至于容器二和容器三之间的连接,容器二实际上并没有监听底层主机的端口 80,而是依赖于 NAT(网络地址转换)和流量转发。在这种情况下,您试图通过 iptables“防火墙”进行循环,流量无法返回。话虽如此,在当前的 CoreOS alpha 主机(459.0.0)上运行此程序时,我能够复制此程序和看看流量是否在容器之间成功路由。再试一次,-k
看看效果如何。