Назад | Перейти на главную страницу

netcat закрывает установленное соединение между контейнерами докеров

Я использую 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

У меня вопрос: почему я не могу писать сообщения из контейнера три в контейнер два и почему соединение может быть установлено, но все равно будет закрыто автоматически.

По умолчанию netcat (и nc) автоматически закрывает соединения (если только -k флаг представлен).

Что касается соединений между контейнером два и контейнером три, контейнер два на самом деле не прослушивает порт 80 на базовом хосте, он полагается на NAT (преобразование сетевых адресов) и пересылку трафика. В этом случае вы пытаетесь создать петлю через «межсетевой экран» iptables, и трафик не может быть возвращен. При этом, запустив это на текущем альфа-хосте CoreOS (459.0.0), я смог продублировать это и увидеть, как трафик успешно проходит между контейнерами. Попробуйте еще раз с -k и посмотрим, как дела.