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