2015-04-30 10 views
38

Mam hosta dokera, a wewnątrz mam jeden kontener.Spraw, aby doker używał protokołu IPv4 do wiązania portów.

Host dokowania wiąże port tylko w interfejsie IPv6, a nie w IPv4.

To wyjście

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  - 

Teraz mam port na hoście 40122 do połączenia z portem 22 na pojemniku.

Chcę zalogować się na tym pojemniku, ale nie jestem w stanie jak jego związany tylko IPv6

To mój doker wersja 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 

Pobiegłem za pomocą 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 
+0

Jakiego polecenia użyłeś do uruchomienia kontenera? Opublikuj także wyjście 'docker ps', gdy kontener jest uruchomiony. –

+0

Czy możesz potwierdzić, że sshd działa na kontenerze? Uruchom 'docker exec -ti 201bde6c839a/bin/bash', gdy już będziesz, opublikuj wyjście' ps aux' i 'netstat -taln' –

+0

Na moim hoście Docker wszystkie porty dokowane nasłuchują na IPv6 i nie mają problemów z połączeniem do ssh na kontenerach. –

Odpowiedz

26

jak @ Daniel-t zauważa w komentarzu: github.com/docker/docker/issues/2174 jest o pokazanie obowiązywała tylko do IPv6 w netstat, ale to nie jest problem. Jako że kwestie GitHub stwierdza:

Podczas konfigurowania serwera proxy, Docker żąda adresu loopback „127.0.0.1”, Linux realizuje to adres, który istnieje w IPv6 (jak :: 0) i otwiera się na obu (ale jest to formalnie gniazdo IPv6). Po uruchomieniu netstat widzi to i informuje, że jest to IPv6 - ale wciąż nasłuchuje na IPv4. Jeśli grałeś z ustawieniami trochę, może być wyłączona ten trick Linux robi - przez ustawienie net.ipv6.bindv6only = 1.

Innymi słowy, tylko dlatego, że widać go jak tylko IPv6, to jest nadal jest w stanie komunikować się na IPv4, chyba że ustawiono IPv6 tylko do wiązania IPv6 z ustawieniem net.ipv6.bindv6only. Aby było jasne, net.ipv6.bindv6only powinno być 0 - możesz uruchomić sysctl net.ipv6.bindv6only, aby to sprawdzić.

+2

To naprawdę duży problem. Chmura publiczna, taka jak Azure, nie wypowiada się dobrze na IPV6, na przykład publiczny system równoważenia obciążenia Azure próbuje IPV4 jako backend. –

+1

Wygląda na to, że konieczne może być zainstalowanie "Rozszerzenie maszyny wirtualnej Docker" na platformie Azure i użycie Ubuntu 14.04 LTS. Jednak nie sądzę, aby wystąpił problem z ipv6, ponieważ jest to tylko na lokalnym hoście, a nie w sieci. – Michael

+0

Masz rację, problem był w mojej konfiguracji (wyłączenie IPV6 nie jest dobrym pomysłem ^^) –

-2

Jeśli chcesz, aby porty kontenerowe związać na adres IPv4, po prostu:

  • znaleźć plik ustawień
    • /etc/sysconfig/Döcker-sieć na RedHat zarówno
    • /etc/default/docker-network na Debianie i podobne
  • edytuj ustawienia sieciowe
    • dodać DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx
    • xx.xx.xx.xx jest Twoja prawdziwa IPv4 (a nie 0.0.0.0)
  • restart doker deamon

działa dla mnie w docker 1.9.1

+1

czy to działa na debian? nie powinno to być/etc/default/docker? – BigDong

+1

@BigDong dzięki za komentarz, jestem na RedHat jak OS, więc ścieżka różni się nieco od jednego systemu operacyjnego do innego Próbowałem odzwierciedlić Twój komentarz w odpowiedzi – Sylvain

+0

nie działa dla mnie – user454322

Powiązane problemy