Faça docker usar IPv4 para ligação de porta


97

Eu tenho o docker host e dentro tenho um contêiner.

O host docker está vinculando a porta na interface IPv6 apenas, não no IPv4.

Esta é a saída

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:55082           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::40280                :::*                    LISTEN      -
tcp6       0      0 :::5432                 :::*                    LISTEN      -
tcp6       0      0 :::40122                :::*                    LISTEN      -
tcp6       0      0 :::36378                :::*                    LISTEN      -
tcp6       0      0 :::40543                :::*                    LISTEN      -
tcp6       0      0 :::111                  :::*                    LISTEN      -

Agora tenho a porta 40122 no host para fazer o link com a porta 22 no contêiner.

Quero fazer SSH nesse contêiner, mas não consigo, pois ele só está vinculado ao IPv6

Esta é minha versão docker Docker version 1.5.0, build a8a31ef

docker ps

201bde6c839a        myapp:latest   "supervisord -n"    3 weeks ago         Up 2 hours          0.0.0.0:40122->22/tcp, 0.0.0.0:40280->80/tcp, 0.0.0.0:40543->443/tcp   myapp

Corri usando docker run -d -P -p 40122:22

netstat -tlna

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3031          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::6379                 :::*                    LISTEN

ps aux

root         1  0.0  0.8  52440 16668 ?        Ss   00:53   0:03 /usr/bin/python /usr/bin/supervisord -n
root        49  0.0  0.1  17980  3048 ?        S    01:32   0:00 bash
root        64  0.0  0.1  46632  2712 ?        S    01:32   0:00 su -l vagrant
vagrant     65  0.0  0.1  21308  3760 ?        S    01:32   0:00 -su
root       288  0.0  0.1  17980  3088 ?        S    02:01   0:00 bash
root       304  0.0  0.1  46632  2720 ?        S    02:01   0:00 su -l vagrant
vagrant    305  0.0  0.1  21304  3804 ?        S    02:01   0:00 -su
vagrant    308  0.0  3.7 429616 75840 ?        Sl+  02:01   0:05 python ./manage.py shell_plus
root       654  0.0  0.4  47596  9848 ?        S    03:12   0:01 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       655  0.0  0.3  90280  7732 ?        S    03:12   0:00 nginx: master process /usr/sbin/nginx
www-data   656  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   657  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   658  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   659  0.0  0.2  90940  4500 ?        S    03:12   0:00 nginx: worker process
root       660  0.0  0.2  61372  5332 ?        S    03:12   0:00 /usr/sbin/sshd -D
root       669  0.0  0.4  37004  8892 ?        Sl   03:12   0:01 redis-server *:6379
root       856  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       857  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       858  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       859  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
vagrant    889  0.0  0.1  18692  2508 ?        R+   04:11   0:00 ps aux

Qual comando você usou para iniciar o contêiner? Publique também a saída de docker psquando o contêiner está em execução.
Daniel t.

Você pode confirmar se o sshd está realmente em execução no contêiner? Execute docker exec -ti 201bde6c839a /bin/bash, assim que estiver dentro, poste a saída de ps aux enetstat -taln
Daniel t.

No meu host Docker, todas as portas docker estão escutando no IPv6 e não têm problemas para se conectar ao ssh em contêineres.
Daniel t.

@Danielt. eu adicionei a informação. Consigo ssh usando exec, mas não consigo fazer ssh no contêiner diretamente de fora usando a porta do host 40122 do mac
user3214546

Você pode encontrar este problema github.com/docker/docker/issues/2174 , não tenho certeza se foi resolvido. Você também pode compartilhar como está tentando se conectar por meio de ssh e o erro que está obtendo?
Daniel t.

Respostas:


72

Como @daniel-t aponta no comentário: github.com/docker/docker/issues/2174 trata de mostrar vinculação apenas ao IPv6 no netstat, mas isso não é um problema. Como o problema do github afirma:

Ao configurar o proxy, o Docker solicita o endereço de loopback '127.0.0.1', o Linux percebe que este é um endereço que existe no IPv6 (como :: 0) e abre em ambos (mas é formalmente um soquete IPv6). Quando você executa o netstat, ele vê isso e diz que é um IPv6 - mas ainda está escutando no IPv4. Se você mexeu um pouco com suas configurações, pode ter desabilitado esse truque que o Linux faz - definindo net.ipv6.bindv6only = 1.

Em outras palavras, só porque você o vê apenas como IPv6, ele ainda é capaz de se comunicar no IPv4, a menos que você tenha o IPv6 configurado para vincular apenas no IPv6 com a configuração net.ipv6.bindv6only. Para ficar claro, net.ipv6.bindv6only deve ser 0 - você pode executar sysctl net.ipv6.bindv6onlypara verificar.


4
Este é um grande problema, na verdade. A nuvem pública como o Azure não fala IPV6 muito bem, por exemplo, o balanceador de carga público do Azure está tentando um IPV4 como back-end.
Thomas Decaux

1
Parece que você pode precisar instalar o "Docker VM Extension" no Azure e usar o Ubuntu 14.04 LTS. No entanto, não acho que haja um problema com o ipv6, pois isso ocorre apenas no host local, não na rede.
Michael

Você está certo, o problema estava na minha configuração (desativar IPV6 não é uma boa ideia ^^)
Thomas Decaux

1
@bigdong você deseja que o ipv6 esteja ativado.
Michael

1
@Michael Você é meu economizador de tempo. :)
lv0gun9

6

A configuração net.ipv6.conf.all.forwarding=1resolverá o problema.

Isso pode ser feito em um sistema ao vivo usando sudo sysctl -w net.ipv6.conf.all.forwarding=1


Essa resposta tem uma vantagem: permite que você "conserte" o problema sem precisar reiniciar o docker daemon (a resposta com a alteração da configuração do docker abaixo sim). Em relação à primeira resposta selecionada: Na verdade, sysctl net.ipv6.bindv6only=0a alteração dessa configuração não ajudou.
pkoperek


0

Se você quiser que as portas do contêiner se vinculem ao seu endereço ipv4, apenas:

  • encontre o arquivo de configurações
    • / etc / sysconfig / docker-network no RedHat igualmente
    • / etc / default / docker-network em Debian ans semelhantes
  • edite as configurações de rede
    • adicionar DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx
    • xx.xx.xx.xx sendo seu ipv4 real (e não 0.0.0.0)
  • reiniciar docker deamon

funciona para mim no docker 1.9.1


1
isso funciona no debian? não deveria ser / etc / default / docker?
Dimitri Kopriwa

1
@BigDong obrigado pelo comentário, estou no RedHat like OS, então o caminho é um pouco diferente de um SO para o outro. Tentei refletir seu comentário na resposta
Sylvain

-1

Consegui acessar o contêiner do docker, após desativar o SELinux

Para desativar o SELinux temporariamente #sudo setenforce 0

Meus contêineres docker estavam funcionando em Centos-7

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.