Hacer que Docker use IPv4 para el enlace de puertos

97

Tengo un host de docker y dentro tengo un contenedor.

El host de la ventana acoplable vincula el puerto solo en la interfaz IPv6, no en IPv4.

Esta es la salida

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      -

Ahora tengo el puerto 40122 en el host para vincularlo con el puerto 22 en el contenedor.

Quiero SSH en ese contenedor pero no puedo, ya que solo está vinculado a IPv6

Esta es mi versión de 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

Corrí 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
usuario3214546
fuente
¿Qué comando usaste para iniciar el contenedor? También publique la salida de docker pscuándo se está ejecutando el contenedor.
Daniel t.
¿Puede confirmar que sshd se está ejecutando realmente en el contenedor? Ejecute docker exec -ti 201bde6c839a /bin/bash, una vez que esté dentro, publique la salida de ps aux ynetstat -taln
Daniel t.
En mi host de Docker, todos los puertos de Docker están escuchando en IPv6 y no tienen problemas para conectarse a ssh en contenedores.
Daniel t.
@Danielt. he agregado la información. Puedo usar ssh usando exec pero no puedo ingresar al contenedor directamente desde el exterior usando el puerto de host 40122 desde mac
user3214546
Podría resolver este problema github.com/docker/docker/issues/2174 , no estoy seguro de si está resuelto. ¿También puede compartir cómo está intentando conectarse a través de ssh y el error que está recibiendo?
Daniel t.

Respuestas:

72

Como @ daniel-t señala en el comentario: github.com/docker/docker/issues/2174 trata sobre mostrar el enlace solo a IPv6 en netstat, pero eso no es un problema. Como dice ese github:

Al configurar el proxy, Docker solicita la dirección de bucle de retorno '127.0.0.1', Linux se da cuenta de que esta es una dirección que existe en IPv6 (como :: 0) y se abre en ambos (pero formalmente es un socket IPv6). Cuando ejecuta netstat, ve esto y le dice que es un IPv6, pero todavía está escuchando en IPv4. Si ha jugado un poco con su configuración, es posible que haya desactivado este truco que hace Linux, configurando net.ipv6.bindv6only = 1.

En otras palabras, solo porque lo ve como IPv6 solo, aún puede comunicarse en IPv4 a menos que haya configurado IPv6 para vincularse solo en IPv6 con la configuración net.ipv6.bindv6only. Para que quede claro, net.ipv6.bindv6only debería ser 0; puede ejecutar sysctl net.ipv6.bindv6onlypara verificar.

Miguel
fuente
4
En realidad, este es un gran problema. La nube pública como Azure no habla muy bien de IPV6, por ejemplo, el equilibrador de carga público de Azure está intentando un IPV4 como backend.
Thomas Decaux
1
Parece que es posible que deba instalar la "Extensión de máquina virtual de Docker" en Azure y usar Ubuntu 14.04 LTS. Sin embargo, no creo que haya un problema con ipv6, ya que solo se encuentra en el host local, no en la red.
Michael
Tiene razón, el problema estaba en mi configuración (deshabilitar IPV6 no es una buena idea ^^)
Thomas Decaux
1
@bigdong quieres que ipv6 esté activado.
Michael
1
@Michael Tú eres mi ahorrador de tiempo. :)
lv0gun9
6

La configuración net.ipv6.conf.all.forwarding=1solucionará el problema.

Esto se puede hacer en un sistema en vivo usando sudo sysctl -w net.ipv6.conf.all.forwarding=1

LuciferJack
fuente
Esta respuesta tiene una ventaja: le permite "solucionar" el problema sin tener que reiniciar el demonio de la ventana acoplable (la respuesta con cambiar la configuración de la ventana acoplable a continuación sí). Con respecto a la respuesta superior, seleccionada: de hecho, sysctl net.ipv6.bindv6only=0cambiar esta configuración no ayudó.
pkoperek
2

De forma predeterminada, Docker usa sockets AF_INET6 que se pueden usar para conexiones IPv4 e IPv6. Esto hace que netstat informe una dirección IPv6 para la dirección de escucha.

De RedHat https://access.redhat.com/solutions/3114021

Gerassimos Mitropoulos
fuente
0

Si desea que los puertos de su contenedor se unan a su dirección ipv4, simplemente:

  • encontrar el archivo de configuración
    • / etc / sysconfig / docker-network en RedHat por igual
    • / etc / default / docker-network en Debian y por igual
  • editar la configuración de red
    • agregar DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx
    • xx.xx.xx.xx es su ipv4 real (y no 0.0.0.0)
  • reiniciar Docker Deamon

funciona para mí en Docker 1.9.1

Sylvain
fuente
1
¿Funciona esto en Debian? ¿No debería ser / etc / default / docker?
Dimitri Kopriwa
1
@BigDong gracias por el comentario, estoy en RedHat como el sistema operativo, por lo que el camino es un poco diferente de un sistema operativo a otro. Intenté reflejar su comentario en la respuesta
Sylvain
-1

Pude acceder al contenedor de la ventana acoplable, después de deshabilitar SELinux

Para deshabilitar SELinux temporalmente #sudo setenforce 0

Mis contenedores Docker se estaban ejecutando en Centos-7

Manjunath N
fuente