tcp4 ubuntu docker port ipv6

ubuntu - tcp4 - Hacer que Docker use IPv4 para el enlace de puertos



docker ipv4 (3)

Tengo un host Docker y dentro tengo un contenedor.

El host docker 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 vincular 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 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


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

Al configurar el proxy, Docker solicita la dirección de bucle invertido ''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 has jugado un poco con tu configuración, es posible que hayas deshabilitado este truco que hace Linux, configurando net.ipv6.bindv6only = 1.

En otras palabras, solo porque lo ve como solo IPv6, todavía puede comunicarse en IPv4 a menos que tenga IPv6 configurado para vincularse solo en IPv6 con la configuración net.ipv6.bindv6only. Para ser claros, net.ipv6.bindv6only debería ser 0: puede ejecutar sysctl net.ipv6.bindv6only para verificar.


Configurar net.ipv6.conf.all.forwarding = 1 solucionará el problema. trabaja para mi


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

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

funciona para mí en Docker 1.9.1