Fai in modo che docker utilizzi IPv4 per l'associazione delle porte


97

Ho un host docker e al suo interno ho un container.

L'host docker sta vincolando la porta solo sull'interfaccia IPv6, non su IPv4.

Questo è l'output

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      -

Ora ho la porta 40122 sull'host da collegare alla porta 22 sul contenitore.

Voglio SSH in quel contenitore ma non sono in grado di farlo perché è solo associato a IPv6

Questa è la mia versione 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

Ho corso 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

Quale comando hai usato per avviare il contenitore? Pubblica anche l'output di docker psquando il contenitore è in esecuzione.
Daniel t.

Puoi confermare che sshd sia effettivamente in esecuzione sul contenitore? Esegui docker exec -ti 201bde6c839a /bin/bash, una volta entrato, pubblica l'output di ps aux enetstat -taln
Daniel t.

Nel mio host Docker, tutte le porte Docker sono in ascolto su IPv6 e non hanno problemi a connettersi a ssh sui container.
Daniel t.

@Danielt. ho aggiunto le informazioni. Sono in grado di ssh usando exec ma non sono in grado di ssh nel container direttamente dall'esterno usando la porta host 40122 da mac
user3214546

Potresti colpire questo problema github.com/docker/docker/issues/2174 , non sono sicuro che sia stato risolto. Puoi anche condividere come stai tentando di connetterti tramite ssh e l'errore che stai ricevendo?
Daniel t.

Risposte:


72

Come sottolinea @ daniel-t nel commento: github.com/docker/docker/issues/2174 riguarda la visualizzazione dell'associazione solo a IPv6 in netstat, ma non è un problema. Come afferma il problema di GitHub:

Quando si configura il proxy, Docker richiede l'indirizzo di loopback '127.0.0.1', Linux si rende conto che questo è un indirizzo che esiste in IPv6 (come :: 0) e si apre su entrambi (ma è formalmente un socket IPv6). Quando esegui netstat, lo vede e ti dice che è un IPv6, ma è ancora in ascolto su IPv4. Se hai giocato un po 'con le tue impostazioni, potresti aver disabilitato questo trucco che fa Linux - impostando net.ipv6.bindv6only = 1.

In altre parole, solo perché lo vedi solo come IPv6, è ancora in grado di comunicare su IPv4 a meno che tu non abbia IPv6 impostato per legarsi solo su IPv6 con l'impostazione net.ipv6.bindv6only. Per essere chiari, net.ipv6.bindv6only dovrebbe essere 0: puoi eseguire la sysctl net.ipv6.bindv6onlyverifica.


4
Questo è un grosso problema in realtà. Il cloud pubblico come Azure, non parla molto bene IPV6, ad esempio il bilanciatore del carico pubblico di Azure sta tentando un IPV4 come backend.
Thomas Decaux

1
Sembra che potrebbe essere necessario installare "Docker VM Extension" in Azure e utilizzare Ubuntu 14.04 LTS. Tuttavia, non penso che ci sia un problema con ipv6 poiché questo è solo sull'host locale, non sulla rete.
Michael

Hai ragione, il problema era nella mia configurazione (disabilitare IPV6 non è una buona idea ^^)
Thomas Decaux

1
@ bigdong su cui vuoi ipv6.
Michael

1
@Michael Sei il mio risparmiatore di tempo. :)
lv0gun9

6

L'impostazione net.ipv6.conf.all.forwarding=1risolverà il problema.

Questo può essere fatto su un sistema live usando sudo sysctl -w net.ipv6.conf.all.forwarding=1


Questa risposta ha un vantaggio: ti permette di "risolvere" il problema senza dover riavviare il demone docker (la risposta con la modifica della configurazione docker di seguito lo fa). Per quanto riguarda la risposta in alto, selezionata: in realtà avevo sysctl net.ipv6.bindv6only=0così cambiato questa configurazione non ha aiutato.
pkoperek


0

Se vuoi che le porte del tuo contenitore si leghino al tuo indirizzo ipv4, basta:

  • trova il file delle impostazioni
    • / etc / sysconfig / docker-network su RedHat allo stesso modo
    • / etc / default / docker-network su Debian e ugualmente
  • modificare le impostazioni di rete
    • aggiungi DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx
    • xx.xx.xx.xx è il tuo vero ipv4 (e non 0.0.0.0)
  • riavviare docker deamon

funziona per me sulla finestra mobile 1.9.1


1
funziona su Debian? non dovrebbe essere / etc / default / docker?
Dimitri Kopriwa

1
@BigDong grazie per il commento, sono su RedHat come OS quindi il percorso è un po 'diverso da un SO all'altro Ho provato a riflettere il tuo commento nella risposta
Sylvain

-1

Sono stato in grado di accedere al container docker, dopo aver disabilitato SELinux

Per disabilitare temporaneamente SELinux #sudo setenforce 0

I miei container Docker erano in esecuzione su Centos-7

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.