Membuat buruh pelabuhan menggunakan IPv4 untuk pengikatan port

98

Saya memiliki host buruh pelabuhan dan di dalamnya saya memiliki satu wadah.

Host buruh pelabuhan mengikat port hanya pada antarmuka IPv6, bukan pada IPv4.

Ini adalah hasilnya

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      -

Sekarang saya memiliki port 40122 pada host untuk ditautkan dengan port 22 pada kontainer.

Saya ingin SSH ke dalam wadah itu tetapi saya tidak dapat karena hanya terikat ke IPv6

Ini adalah versi buruh pelabuhan saya 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

Saya berlari menggunakan 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
pengguna3214546
sumber
Perintah apa yang Anda gunakan untuk memulai penampung? Juga posting output docker pssaat penampung sedang berjalan.
Daniel t.
Dapatkah Anda mengonfirmasi bahwa sshd benar-benar berjalan di penampung? Jalankan docker exec -ti 201bde6c839a /bin/bash, setelah Anda masuk, posting output dari ps aux dannetstat -taln
Daniel t.
Di host Docker saya, semua port docker mendengarkan di IPv6 dan tidak memiliki masalah saat menyambung ke ssh di container.
Daniel t.
@Tokopedia saya telah menambahkan info. Saya dapat ssh menggunakan exec tetapi saya tidak dapat melakukan ssh ke dalam container langsung dari luar menggunakan host port 40122 dari mac
user3214546
Anda dapat mencapai masalah ini github.com/docker/docker/issues/2174 , saya tidak yakin apakah sudah teratasi. Bisakah Anda juga membagikan bagaimana Anda mencoba untuk terhubung melalui ssh dan kesalahan yang Anda dapatkan?
Daniel t.

Jawaban:

73

Seperti yang ditunjukkan @ daniel-t di komentar: github.com/docker/docker/issues/2174 adalah tentang menunjukkan pengikatan hanya ke IPv6 di netstat, tetapi itu bukan masalah. Karena masalah github menyatakan:

Saat menyiapkan proxy, Docker meminta alamat loopback '127.0.0.1', Linux menyadari bahwa ini adalah alamat yang ada di IPv6 (sebagai :: 0) dan terbuka di keduanya (tetapi secara formal adalah soket IPv6). Ketika Anda menjalankan netstat, ia melihat ini dan memberitahu Anda bahwa itu adalah IPv6 - tetapi masih mendengarkan di IPv4. Jika Anda telah bermain-main dengan pengaturan Anda sedikit, Anda mungkin telah menonaktifkan trik Linux ini - dengan mengatur net.ipv6.bindv6only = 1.

Dengan kata lain, hanya karena Anda melihatnya sebagai IPv6 saja, ia masih dapat berkomunikasi di IPv4 kecuali Anda telah mengatur IPv6 untuk hanya mengikat pada IPv6 dengan pengaturan net.ipv6.bindv6only. Agar jelas, net.ipv6.bindv6hanya harus 0 - Anda dapat menjalankan sysctl net.ipv6.bindv6onlyuntuk memverifikasi.

Michael
sumber
4
Ini sebenarnya masalah besar. Cloud publik seperti Azure, tidak menggunakan IPV6 dengan baik, misalnya penyeimbang beban Azure publik mencoba IPV4 sebagai backend.
Thomas Decaux
1
Sepertinya Anda mungkin perlu menginstal "Docker VM Extension" di Azure dan menggunakan Ubuntu 14.04 LTS. Namun, menurut saya tidak ada masalah dengan ipv6 karena ini hanya ada di host lokal, bukan jaringan.
Michael
Anda benar, masalahnya ada di konfigurasi saya (menonaktifkan IPV6 bukanlah ide yang baik ^^)
Thomas Decaux
1
@bigdong Anda ingin menggunakan ipv6.
Michael
1
@Michael Anda penghemat waktu saya. :)
lv0gun9
6

Pengaturan net.ipv6.conf.all.forwarding=1akan memperbaiki masalah.

Ini dapat dilakukan pada sistem langsung menggunakan sudo sysctl -w net.ipv6.conf.all.forwarding=1

LuciferJack
sumber
Jawaban ini memiliki satu keuntungan: memungkinkan Anda untuk "memperbaiki" masalah tanpa harus me-restart daemon buruh pelabuhan (jawaban dengan mengubah konfigurasi buruh pelabuhan di bawah ini). Mengenai jawaban atas, yang dipilih: Sebenarnya saya telah sysctl net.ipv6.bindv6only=0mengubah konfigurasi ini tidak membantu.
pkoperek
2

Secara default, buruh pelabuhan menggunakan soket AF_INET6 yang dapat digunakan untuk koneksi IPv4 dan IPv6. Ini menyebabkan netstat melaporkan alamat IPv6 untuk alamat mendengarkan.

Dari RedHat https://access.redhat.com/solutions/3114021

Gerassimos Mitropoulos
sumber
0

Jika Anda ingin port kontainer Anda mengikat alamat ipv4 Anda, cukup:

  • temukan file pengaturan
    • / etc / sysconfig / docker-network di RedHat sama
    • / etc / default / docker-network di Debian dan sejenisnya
  • edit pengaturan jaringan
    • tambahkan DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx
    • xx.xx.xx.xx adalah ipv4 Anda yang sebenarnya (dan bukan 0.0.0.0)
  • restart deamon buruh pelabuhan

bekerja untuk saya di buruh pelabuhan 1.9.1

Sylvain
sumber
1
apakah ini berfungsi di debian? bukankah seharusnya / etc / default / docker?
Dimitri Kopriwa
1
@BigDong terima kasih atas komentarnya, saya menggunakan RedHat seperti OS jadi jalurnya sedikit berbeda dari satu OS ke OS lainnya Saya mencoba merefleksikan komentar Anda dalam jawabannya
Sylvain
0

MASALAH TERSELESAIKAN :

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

Masalah itulah yang kami hadapi dengan VM beberapa waktu alih-alih jaringan jembatan coba dengan host yang akan bekerja untuk Anda

tcp     0    0 0.0.0.0:80            0.0.0.0:*             LISTEN      - 
tcp6    0    0 :::80                 :::*                  LISTEN      -  
Harish Chander Dalal
sumber
-1

Saya dapat mengakses kontainer buruh pelabuhan, setelah menonaktifkan SELinux

Untuk menonaktifkan SELinux sementara #sudo setenforce 0

Kontainer buruh pelabuhan saya berjalan di Centos-7

Manjunath N
sumber