पोर्ट बाइंडिंग के लिए Docker उपयोग IPv4 करें


97

मेरे पास डॉकटर होस्ट है और मेरे अंदर एक कंटेनर है।

Docker होस्ट केवल IPv4 पर नहीं, बल्कि IPv6 इंटरफ़ेस पर पोर्ट को बाइंड कर रहा है।

यह आउटपुट है

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      -

अब मेरे पास कंटेनर पर पोर्ट 22 के साथ लिंक करने के लिए होस्ट पर 40122 पोर्ट है।

मैं उस कंटेनर में एसएसएच करना चाहता हूं, लेकिन मैं केवल आईपीवी 6 के लिए बाध्य नहीं हूं

यह मेरा डॉक वर्जन है 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

मैं प्रयोग करके भागा 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

पीएस ऑक्स

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

कंटेनर को शुरू करने के लिए आपने किस कमांड का उपयोग किया? docker psजब कंटेनर चल रहा हो तब भी आउटपुट पोस्ट करें ।
डैनियल टी।

क्या आप पुष्टि कर सकते हैं कि sshd वास्तव में कंटेनर पर चल रहा है? भागो docker exec -ti 201bde6c839a /bin/bash, एक बार जब आप अंदर होते हैं, तोps aux netstat -taln
डैनियल टी

मेरे डॉकर होस्ट में, सभी docker पोर्ट IPv6 पर सुन रहे हैं और कंटेनरों पर ssh से कनेक्ट करने में कोई समस्या नहीं है।
डैनियल टी।

@Danielt। मैंने जानकारी जोड़ी है। मैं निष्पादन के लिए ssh का उपयोग कर रहा हूँ, लेकिन मैं बाहर से सीधे कंटेनर में ssh को होस्ट पोर्ट 40122 का उपयोग करने में सक्षम नहीं हूँ
user3214546

आप इस मुद्दे को हिट कर सकते हैं github.com/docker/docker/issues/2174 , मुझे यकीन नहीं है कि यह हल हो गया है। क्या आप यह भी साझा कर सकते हैं कि आप ssh और आपके द्वारा की जा रही त्रुटि से कैसे जुड़ने का प्रयास कर रहे हैं?
डैनियल टी।

जवाबों:


72

जैसा कि @ daniel-t टिप्पणी में बताते हैं: github.com/docker/docker/issues/2174 केवल IPv6 में बाइंडिंग दिखाने के बारे में है netstat, लेकिन यह कोई समस्या नहीं है। जैसा कि गितुब मुद्दों में कहा गया है:

प्रॉक्सी सेट करते समय, डॉकर लूपबैक एड्रेस '127.0.0.1' का अनुरोध करता है, लिनक्स को पता चलता है कि यह एक ऐसा पता है जो IPv6 (as :: 0) में मौजूद है और दोनों पर खुलता है (लेकिन यह औपचारिक रूप से IPv6 सॉकेट है)। जब आप netstat चलाते हैं तो यह इसे देखता है और आपको बताता है कि यह एक IPv6 है - लेकिन यह अभी भी IPv4 पर सुन रहा है। यदि आपने अपनी सेटिंग्स के साथ थोड़ा सा खेला है, तो आप इस चाल को निष्क्रिय कर सकते हैं - लिनक्स net.ipv6.bindv6only = 1 सेट करके।

दूसरे शब्दों में, केवल इसलिए कि आप इसे केवल IPv6 के रूप में देखते हैं, यह अभी भी IPv4 पर संवाद करने में सक्षम है, जब तक कि आप IPv6 को केवल net.ipv6.bindv6only सेटिंग के साथ IPv6 पर बाँधने के लिए सेट नहीं है। स्पष्ट होने के लिए, net.ipv6.bindv6only 0 होना चाहिए - आप sysctl net.ipv6.bindv6onlyसत्यापित करने के लिए चला सकते हैं ।


4
यह वास्तव में एक बड़ी समस्या है। एज़्योर जैसे सार्वजनिक क्लाउड, आईपीवी 6 को बहुत अच्छी तरह से नहीं बोलते हैं, उदाहरण के लिए सार्वजनिक एज़्योर लोड-बैलेंसर आईपीवी 4 को बैकेंड के रूप में लेने का प्रयास कर रहा है।
थॉमस डेकाक्स

1
लगता है कि आपको Azure में "Docker VM Extension" स्थापित करना होगा और Ubuntu 14.04 LTS का उपयोग करना होगा। हालाँकि, मुझे नहीं लगता कि ipv6 के साथ कोई समस्या है क्योंकि यह केवल स्थानीय होस्ट पर है, नेटवर्क पर नहीं।
माइकल

आप सही हैं, समस्या मेरे कॉन्फिगर में थी (IPV6 को अक्षम करना एक अच्छा विचार नहीं है ^ ^)
थॉमस डेकाक्स

1
@bigdong पर आप ipv6 चाहते हैं।
माइकल

1
@ मिचेल तुम मेरे टाइमसेवर हो। :)
lv0gun9

6

सेटिंग net.ipv6.conf.all.forwarding=1से समस्या ठीक हो जाएगी।

यह एक लाइव सिस्टम का उपयोग करके किया जा सकता है sudo sysctl -w net.ipv6.conf.all.forwarding=1


इस उत्तर का एक फायदा है: यह आपको डॉक डेमॉन को फिर से शुरू करने के बिना समस्या को "ठीक" करने की अनुमति देता है (नीचे docker config के साथ उत्तर करता है)। शीर्ष के बारे में, चयनित उत्तर: मैंने वास्तव में sysctl net.ipv6.bindv6only=0इतना बदल दिया था कि यह विन्यास मदद नहीं करता था।
pkoperek

2

डिफ़ॉल्ट रूप से, docker AF_INET6 सॉकेट का उपयोग करता है जिसका उपयोग IPv4 और IPv6 कनेक्शन दोनों के लिए किया जा सकता है। यह netstat सुनने के पते के लिए एक IPv6 पते की रिपोर्ट करने का कारण बनता है।

RedHat https://access.redhat.com/solutions/3114021 से


0

यदि आप अपने कंटेनर पोर्ट को अपने IPv4 पते पर बांधना चाहते हैं, तो:

  • सेटिंग्स फ़ाइल खोजें
    • RedHat पर समान रूप से / etc / sysconfig / docker-network
    • डेबियन एन्स एक जैसे / आदि / डिफ़ॉल्ट / docker- नेटवर्क
  • नेटवर्क सेटिंग्स संपादित करें
    • DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx जोड़ें
    • xx.xx.xx.xx आपका वास्तविक आईपीवी 4 है (और 0.0.0.0 नहीं)
  • पुनः आरंभ करने वाला बहरा

मेरे लिए काम करता है 1.9.1 पर


1
डेबियन पर यह काम करता है? यह नहीं होना चाहिए / etc / default / docker?
दिमित्री कोपरीवा

1
@BigDong टिप्पणी के लिए धन्यवाद, मैं रेडहैट पर ओएस की तरह हूं इसलिए रास्ता एक ओएस से दूसरे से थोड़ा अलग है मैंने जवाब में आपकी टिप्पणी को प्रतिबिंबित करने की कोशिश की
सिल्वेन

-1

SELinux को अक्षम करने के बाद, मैं docker कंटेनर को एक्सेस करने में सक्षम था

अस्थायी रूप से SELinux को निष्क्रिय करने के लिए #sudo setenforce 0

मेरे डॉकटर कंटेनर सेंटोस -7 पर चल रहे थे

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.