netcat fecha a conexão estabelecida entre contêineres docker

2

Estou no coreos e iniciei três contêineres.

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

Eu posso verificar se o contêiner 2 pode falar com o contêiner 1.

# 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

Se eu tentar o mesmo para a comunicação do contêiner três para o contêiner dois, a conexão "será bem-sucedida", mas será fechada imediatamente.

# 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!
$

Algumas informações sobre o ambiente

# 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

Minha pergunta é por que não consigo escrever mensagens do contêiner três para o contêiner dois e por que a conexão pode ser estabelecida, mas ainda será fechada automaticamente.

    
por xh3b4sd 10.10.2014 / 15:43

1 resposta

1

O comportamento padrão do netcat (e nc) é fechar conexões automaticamente (a menos que o -k flag seja apresentado).

No que diz respeito às conexões entre o contêiner dois e o contêiner três, o contêiner dois não está realmente escutando na porta 80 no host subjacente, está contando com NAT (conversão de endereço de rede) e encaminhamento de tráfego. Neste caso você está tentando fazer um loop através do "firewall" do iptables e o tráfego não pode ser retornado. Dito isto, rodando isso em um host alpha do CoreOS atual (459.0.0), eu era capaz de duplicar este e ver o tráfego trafegado com sucesso entre os contêineres. Tente novamente com -k e veja como se sai.

    
por 10.10.2014 / 19:29