netcat 关闭 docker 容器之间已建立的连接

netcat 关闭 docker 容器之间已建立的连接

我在 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看看效果如何。

相关内容