Я использую 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
и посмотрим, как дела.