Docker'ın bağlantı noktası bağlama için IPv4 kullanmasını sağlayın


103

Docker ana bilgisayarım var ve içinde bir konteynerim var.

Docker ana bilgisayarı, bağlantı noktasını IPv4'te değil, yalnızca IPv6 arabiriminde bağlar.

Bu çıktı

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      -

Şimdi konteynırdaki 22 numaralı bağlantı noktasına bağlanmak için ana bilgisayarda 40122 bağlantı noktasına sahibim.

Bu kapsayıcıya SSH eklemek istiyorum, ancak yalnızca IPv6'ya bağlı olduğu için yapamıyorum

Bu benim docker versiyonum 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

Kullanarak koştum 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

Kabı başlatmak için hangi komutu kullandınız? Ayrıca docker pskonteynerin ne zaman çalıştığını da kaydedin.
Daniel t.

Sshd'nin kapsayıcıda gerçekten çalıştığını doğrulayabilir misiniz? Koş docker exec -ti 201bde6c839a /bin/bash, girdikten sonra, ps aux venetstat -taln
Daniel t'nin

Docker ana bilgisayarımda, tüm docker portları IPv6 üzerinde dinliyor ve container'lardaki ssh'a bağlanmada sorun yaşamıyor.
Daniel t.

@Danielt. bilgiyi ekledim. Exec kullanarak ssh yapabiliyorum ancak Mac'ten 40122 ana bilgisayar bağlantı noktasını kullanarak doğrudan dışarıdan kapsayıcıya ssh yapamıyorum
user3214546

Bu soruna github.com/docker/docker/issues/2174 basabilirsiniz , çözülüp çözülmediğinden emin değilim. Ayrıca ssh üzerinden nasıl bağlanmaya çalıştığınızı ve aldığınız hatayı da paylaşabilir misiniz?
Daniel t.

Yanıtlar:


76

@ Daniel-t'nin yorumda işaret ettiği gibi: github.com/docker/docker/issues/2174 , yalnızca IPv6 girişine bağlanmayı göstermekle ilgilidir netstat, ancak bu bir sorun değildir. Bu github sorunlarının belirttiği gibi:

Proxy'yi kurarken Docker, '127.0.0.1' geri döngü adresini ister, Linux bunun IPv6'da bulunan (:: 0 olarak) bir adres olduğunu ve her ikisinde de açılır (ancak resmi olarak bir IPv6 soketidir). Netstat'ı çalıştırdığınızda bunu görür ve size bir IPv6 olduğunu söyler - ancak yine de IPv4'ü dinler. Ayarlarınızla biraz oynadıysanız, Linux'un yaptığı bu hileyi devre dışı bırakmış olabilirsiniz - net.ipv6.bindv6only = 1 ayarlayarak.

Diğer bir deyişle, yalnızca IPv6 olarak gördüğünüz için, IPv6'nın yalnızca IPv6'ya net.ipv6.bindv6only ayarıyla bağlanacak şekilde ayarlanmadığı sürece IPv4 üzerinden iletişim kurabilir. Açık olmak gerekirse, net.ipv6.bindv6only 0 olmalıdır - sysctl net.ipv6.bindv6onlydoğrulamak için çalıştırabilirsiniz .


5
Bu aslında büyük bir problem. Azure gibi genel bulut, IPV6'yı çok iyi konuşmaz, örneğin genel Azure yük dengeleyici arka uç olarak bir IPV4'ü deniyor.
Thomas Decaux

1
Azure'da "Docker VM Extension" yüklemeniz ve Ubuntu 14.04 LTS kullanmanız gerekebilir gibi görünüyor. Ancak, ipv6 ile ilgili bir sorun olduğunu sanmıyorum çünkü bu ağda değil, sadece yerel ana bilgisayarda.
Michael

Haklısınız, sorun yapılandırmamdaydı (IPV6'yı devre dışı bırakmak iyi bir fikir değildir ^^)
Thomas Decaux

1
@bigdong ipv6'yı istiyorsun.
Michael

1
@Michael Sen benim zaman koruyucusun. :)
lv0gun9

6

Ayar net.ipv6.conf.all.forwarding=1sorunu çözecektir.

Bu, kullanılarak canlı bir sistemde yapılabilir sudo sysctl -w net.ipv6.conf.all.forwarding=1


Bu cevabın bir avantajı vardır: docker daemon'u yeniden başlatmanıza gerek kalmadan sorunu "düzeltmenize" olanak tanır (aşağıdaki docker yapılandırmasını değiştirmenin yanıtı). En üstteki seçili cevapla ilgili olarak: Aslında sysctl net.ipv6.bindv6only=0bu yapılandırmayı değiştirmenin bir faydası olmadı.
pkoperek


1

ÇÖZÜLEN SORUN :

KULLANIM docker run -it -p 80:80 --name nginx --net=host -d nginx

Bu, bir süre VM ile karşılaştığımız sorun, köprü ağı yerine sizin için çalışacak ana bilgisayarla deneyin

tcp     0    0 0.0.0.0:80            0.0.0.0:*             LISTEN      - 
tcp6    0    0 :::80                 :::*                  LISTEN      -  

0

Kapsayıcı bağlantı noktalarınızın ipv4 adresinize bağlanmasını istiyorsanız, sadece:

  • ayarlar dosyasını bul
    • RedHat üzerinde / etc / sysconfig / docker-network
    • Debian ve benzeri / etc / default / docker-network
  • ağ ayarlarını düzenle
    • DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx ekle
    • xx.xx.xx.xx gerçek ipv4'ünüzdür (0.0.0.0 değil)
  • docker deamon'u yeniden başlat

docker 1.9.1'de benim için çalışıyor


1
bu debian üzerinde çalışıyor mu? / etc / default / docker olması gerekmez mi?
Dimitri Kopriwa

1
@BigDong, yorum için teşekkürler, işletim sistemi gibi RedHat'tayım, bu yüzden yol bir işletim sisteminden diğerine biraz farklı. Yorumunuzu cevapta yansıtmaya çalıştım
Sylvain,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.