एक docker कंटेनर के अंदर से docker होस्ट का IP पता कैसे प्राप्त करें


358

जैसा कि शीर्षक कहता है। मुझे आईपी एड्रेस को होस्ट करने वाले और पोर्ट से होस्ट को कंटेनर में भेजने और कंटेनर के अंदर करने में सक्षम होना चाहिए।


क्या आप इस बारे में विस्तार से बता सकते हैं कि आप इस जानकारी का उपयोग कैसे करना चाहेंगे? आपने कहा "डॉकटर होस्ट्स" - क्या आप एक से अधिक होस्ट पर डोकर चला रहे हैं? एक बार जब आपका कंटेनर होस्ट और पोर्टमैप का आईपी पता जानता है, तो वह क्या करेगा?
एंडी

Docker होस्ट IP एड्रेस को docker कंटेनर में पास करने का सबसे सरल तरीका है, मुझे लगता है कि आपको 'docker container exec' का उपयोग करके कंटेनर के अंदर कॉल करना चाहिए। मान लीजिए कि आप बिजीबॉक्स कंटेनर के अंदर से होस्ट को पिंग करना चाहते हैं, उदाहरण के लिए उपयोग करें: $ IP = '8.8.8.8' && डॉकटर कंटेनर बिजीबॉक्स पिंग $ IP 'होस्ट आईपी का पता लगाने का तरीका, आपको जो पसंद है उसका उपयोग करें।
सौलूअलेसांड्रे

जवाबों:


314
/sbin/ip route|awk '/default/ { print $3 }'

जैसा कि @MichaelNeale ने देखा, इस विधि का उपयोग करने का कोई अर्थ नहीं है Dockerfile(सिवाय इसके कि जब हमें इस IP की आवश्यकता केवल बिल्ड समय के दौरान हो), क्योंकि यह IP बिल्ड समय के दौरान हार्डकोड किया जाएगा।


49
जब आप कंटेनरों के लिए docker Bridge (डिफ़ॉल्ट) का उपयोग कर रहे हैं, तो यह पुर्जों के IP को 172.17.42.1 जैसे कि मेजबान के IP जैसे 192.168.1.x (मैं मान रहा हूं कि आपका मेजबान एक घर NAT पर है) को आउटपुट करेगा। यदि आप 192.168.1.x पता चाहते हैं तो @Magno टोरेस जवाब का उपयोग करना शायद लोग ऐसी स्थितियों में चाहते हैं।
प्रोग्रामर

2
RUN आपकी अपेक्षा के अनुसार काम नहीं करेगा - यह केवल बिल्ड समय पर IP की गणना करेगा - और उसके बाद हमेशा के लिए स्थिर हो जाएगा, और उपयोगी नहीं होगा। यह बिल्ड होस्ट का आईपी होगा।
माइकल निले

7
@प्रोग्रामस्टर, मैं मान सकता हूं कि लोग डॉक होस्ट और कंटेनर के बीच संबंध चाहते हैं, यही पुल आईपी आपको (स्टेंडर्ड "होम" इंस्टॉलेशन में) दे सकता है। किसी को भी "वास्तविक" होस्ट आईपी की आवश्यकता होगी यदि यह डॉकटर ब्रिज के बाहर भी हो सकता है और अस्वीकार्य हो सकता है? यह उन सभी लोगों के लिए समाधान है जो बस docker स्थापित करते हैं और कुछ ही समय में इसके साथ खेलना चाहते हैं।
स्पिनस

1
@MichaelNeale, पहले की तरह, मैं मानूंगा कि अधिकांश लोग जो docker से शुरू कर रहे हैं, उन्हें अपने मेजबान और कंटेनर के बीच संबंध की आवश्यकता है, बस। यदि कोई "उचित" तैनाती कर रहा है, तो शायद वह वैसे भी डॉक ब्रिज का उपयोग नहीं कर रहा है, वह कस्टम नेटवर्किंग का उपयोग कर रहा है और संभवतः वह सभी नेटवर्क quirks के बारे में जानता है या उनके पास DNS (या जो भी खोज) स्थापित है।
स्पिनस

1
@spinus - लेकिन यह केवल तभी मान्य होगा जब यह उस होस्ट पर चलता है जिस पर इसे बनाया गया था - उस स्थिति में - आप इसे केवल हार्ड कोड कर सकते हैं - या इसे देख सकते हैं - मुझे लगता है कि यह एक उपयोगी उत्तर नहीं है और बहुत कुछ गुमराह करेगा। लोगों की - आप इसे हटाने की सलाह देते हैं। (द रन बिट)
माइकल निले

182

संस्करण 18.03 के रूप में, आप host.docker.internalहोस्ट के आईपी के रूप में उपयोग कर सकते हैं ।

मैक के लिए डॉकर में काम करता है , विंडोज के लिए डॉकर और शायद अन्य प्लेटफार्मों के लिए भी।

यह मैक-विशिष्ट से अपडेट है , जो docker.for.mac.localhostसंस्करण 17.06 से उपलब्ध है, और docker.for.mac.host.internal, 17.12 संस्करण के बाद से उपलब्ध है, जो अभी भी उस प्लेटफॉर्म पर काम कर सकता है।

ध्यान दें, मैक और विंडोज प्रलेखन के रूप में , यह केवल विकास के उद्देश्य के लिए है।

उदाहरण के लिए, मेरे पास मेरे मेजबान पर पर्यावरण चर हैं:

MONGO_SERVER=host.docker.internal

मेरी docker-compose.ymlफ़ाइल में, मेरे पास यह है:

version: '3'

services:
  api:
    build: ./api
    volumes:
      - ./api:/usr/src/app:ro
    ports:
      - "8000"
    environment:
      - MONGO_SERVER
    command: /usr/local/bin/gunicorn -c /usr/src/app/gunicorn_config.py -w 1 -b :8000 wsgi

2
@allanberry दुर्भाग्य से डॉकर्स लोग हमें ऐसा करने के लिए एक प्लेटफ़ॉर्म-स्वतंत्र तरीका नहीं देना पसंद करते हैं, क्योंकि वे अनपेक्षित उपयोग के मामलों को गले नहीं लगाना पसंद करते हैं (जैसे डॉकटर से स्थानीय मशीन पर किसी भी सेवा तक पहुंचना)
एंडी

21
मुझे डॉकटर की तरह पेश किया गया था एक बार बिल्ड, इसे हर जगह चलाएं। लेकिन यह बहुत गलत है क्योंकि आपको हमेशा होस्ट सिस्टम को कॉन्फ़िगर करना पड़ता है। इसलिए docker.for.mac..बेकार है क्योंकि ज्यादातर मामलों में आपकी कंपनी में लिनक्स- या मैक-केवल वातावरण नहीं है। यह मिश्रित है, आपके पास लिनक्स और मैक और विंडोज का उपयोग करने वाले देव हैं। इस डोमेन का कोई मतलब नहीं है क्योंकि 99% में यह एक मिश्रित होस्ट ओएस वातावरण है। मैं macOS के तहत एक कंटेनर विकसित नहीं करता हूं और इसे macOS सर्वर पर तैनात करता हूं। मैं इसे लिनक्स में तैनात करता हूं। ऐसा हर कोई करता है। तो क्या पूरे बिंदु भी है docker.for.mac..?
theFox

1
@allanberry docker.for.mac.host.internalसे कोई फर्क नहीं पड़ता कि आप डॉकर का उपयोग कर रहे हैं या उसके बिना docker-compose। मैं कॉन्फ़िगरेशन फ़ाइलों में एक निश्चित होस्ट का उपयोग करना चाहता हूं। उदाहरण के लिए, IDK, docker.host.internalजो हमेशा होस्ट IP पते की ओर इशारा करता है। इसके बावजूद कि मैं कौन सा होस्ट सिस्टम इस्तेमाल कर रहा हूं। यह डॉकर का उपयोग करने का पूरा बिंदु है: मैं स्वायत्त होना चाहता हूं। मैं समझता हूं कि यह macOS पर भी पेचीदा है क्योंकि आपके पास होस्ट सिस्टम और कंटेनर के बीच एक और परत है। लेकिन वैसे भी, मेरी राय docker.for.mac.host.internalमें बेकार है अगर आप इसे केवल macOS के लिए उपयोग कर सकते हैं।
फॉक्स

1
host.docker.internal कम से कम यह टिप्पणी लिखने के समय, विंडोज के लिए डॉकर पर भी काम करता है
जोनलोफ

1
यह पूरी तरह से काम करता है, मेरे पास कंटेनर में से एक में विंडोज़ और रनिंग जेनकींस के लिए डॉकरे है। मैं जेनकिन्स के भीतर डॉक कमांड चलाना चाहता था, लेकिन डॉक जोड़ने वाले क्लाउड स्टेप पर कनेक्ट करने में सक्षम नहीं था, मैंने इस tcp: //host.docker.internal: 2375 का उपयोग किया और 'लोकलहोस्ट पर एक्सपोज डेमॉन: 2375' को सक्षम किया और यह काम करता है। बहुत समय बचाया। धन्यवाद!
विकाश

84

अपडेट: मैक के लिए डॉकर पर , संस्करण 18.03 के रूप में, आप host.docker.internal को होस्ट के आईपी के रूप में उपयोग कर सकते हैं । एलनबेरी का जवाब देखें । मैक के लिए डॉकर के पूर्व संस्करणों के लिए निम्नलिखित उत्तर अभी भी उपयोगी हो सकते हैं:

मैक के लिए डॉकर पर docker0पुल मौजूद नहीं है, इसलिए यहां अन्य उत्तर काम नहीं कर सकते हैं। हालाँकि, सभी आउटगोइंग ट्रैफ़िक को आपके पैरेंट होस्ट के माध्यम से रूट किया जाता है, इसलिए जब तक आप एक आईपी से कनेक्ट करने का प्रयास करते हैं, तब तक वह स्वयं को पहचानता है (और डॉकटर कंटेनर खुद को नहीं लगता) आपको कनेक्ट करने में सक्षम होना चाहिए। उदाहरण के लिए यदि आप इसे मूल मशीन से चलाते हैं:

ipconfig getifaddr en0

यह आपको अपने वर्तमान नेटवर्क पर अपने मैक का आईपी दिखाना चाहिए और आपका डॉकटर कंटेनर इस पते पर भी कनेक्ट करने में सक्षम होना चाहिए। यह निश्चित रूप से एक दर्द है अगर यह आईपी पता कभी भी बदल जाता है, लेकिन आप अपने मैक में एक कस्टम लूपबैक आईपी जोड़ सकते हैं जो कंटेनर को नहीं लगता कि वह मूल मशीन पर ऐसा कुछ कर रहा है:

sudo ifconfig lo0 alias 192.168.46.49

फिर आप टेलनेट के साथ डॉक कंटेनर के कनेक्शन का परीक्षण कर सकते हैं। मेरे मामले में मैं एक दूरस्थ xdebug सर्वर से जुड़ना चाहता था:

telnet 192.168.46.49 9000

अब जब ट्रैफिक आपके मैक में 192.168.46.49 (और आपके कंटेनर छोड़ने वाले सभी ट्रैफ़िक आपके मैक के माध्यम से जाता है) के लिए आता है, तो आपका मैक मान लेगा कि आईपी ही है। जब आप इस IP का उपयोग कर समाप्त कर लेते हैं, तो आप इस तरह से लूपबैक उर्फ ​​को हटा सकते हैं:

sudo ifconfig lo0 -alias 192.168.46.49

इस बारे में सावधान रहने की एक बात यह है कि अगर डॉकटर कंटेनर को ट्रैफिक के गंतव्य के बारे में सोचते हैं तो वह ट्रैफिक को नहीं भेजेगा। यदि आपको परेशानी हो तो कंटेनर के अंदर लूपबैक इंटरफ़ेस की जाँच करें:

sudo ip addr show lo

मेरे मामले में, यह दिखाया गया है inet 127.0.0.1/8जिसका अर्थ है कि मैं 127.*रेंज में किसी भी आईपी का उपयोग नहीं कर सकता । इसलिए मैंने 192.168.*ऊपर के उदाहरण में इस्तेमाल किया । सुनिश्चित करें कि आपके द्वारा उपयोग किया जाने वाला आईपी आपके अपने नेटवर्क पर किसी चीज़ के साथ संघर्ष नहीं करता है।


क्या यह लूप बैक सेटिंग्स को सिस्टम रीस्टार्ट करने के बाद साफ करेगा?
रोबो_यूके

@Robbo_UK हाँ, लूपबैक उर्फ ​​आपके मैक को पुनरारंभ करने के बाद चला जाएगा।
कोड कमांडर

1
इस होस्टनाम के उपयोग से कोई मतलब नहीं है क्योंकि यह लिनक्स के लिए डॉकर के तहत काम नहीं करता है। उन्होंने इसे लिनक्स के लिए भी क्यों नहीं जोड़ा?
TheFox

वे इस समय इसे देख रहे हैं @ TheFox: github.com/docker/libnetwork/pull/2348
Ivo Pereira

46

एडब्ल्यूएस में डॉकर चलाने वालों के लिए, होस्ट के लिए मेटा-डेटा कंटेनर के अंदर से अभी भी उपलब्ध है।

curl http://169.254.169.254/latest/meta-data/local-ipv4

उदाहरण के लिए:

$ docker run alpine /bin/sh -c "apk update ; apk add curl ; curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo"
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.1-119-gb247c0a [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.1-59-g48b0368 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5855 distinct packages available
(1/4) Installing openssl (1.0.2g-r0)
(2/4) Installing ca-certificates (20160104-r2)
(3/4) Installing libssh2 (1.6.0-r1)
(4/4) Installing curl (7.47.0-r0)
Executing busybox-1.24.1-r7.trigger
Executing ca-certificates-20160104-r2.trigger
OK: 7 MiB in 15 packages
172.31.27.238

$ ifconfig eth0 | grep -oP 'inet addr:\K\S+'
172.31.27.238

यह एडब्ल्यूएस का उपयोग करने वालों के लिए एक सुपर सुविधाजनक तरीका है। मैं कंसूल एजेंटों के क्लाइंट को कॉन्फ़िगर करने और पते को बांधने के लिए इसका उपयोग करता हूं। यह आदर्श है जब आप ऐसी परिस्थितियों में होते हैं जहां आप मेजबान नेटवर्किंग (जैसे इलास्टिक बीनस्टॉक और ईसीएस में कंटेनर की तैनाती) का उपयोग नहीं कर सकते हैं।
रिचर्ड क्लेटन

यह एक लाइफसेवर है, धन्यवाद। मुझे यह पता लगाने में कठिनाई हो रही थी कि मेरे ईसीएस क्लस्टर में कंटेनरों के बीच संचार को कैसे संभालना है।
ब्रेनन

फ़्यूज़न बेसिमेज (उबंटू पर आधारित) पर, मुझे आपकी कमांड को थोड़ा बदलना पड़ा:ifconfig eth0 | grep -oP 'inet \K\S+'
मेओई

25

जब आप कंटेनर बनाते हैं तो एकमात्र तरीका मेजबान जानकारी को पर्यावरण के रूप में पारित कर रहा है

run --env <key>=<value>

19
: विशेष रूप से, पुल आईपी पते की तरह एक कमांड लाइन विकल्प का उपयोग करने में पारित किया जा सकता -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"(से स्वीकार किए जाते हैं जवाब का उपयोग कर unix.stackexchange.com/questions/87468/... )
ncoghlan

7
मुझे लगता है कि यह मैक / विंडोज के लिए डॉकर में काम नहीं करता है। (पुल आईपी)
zx1986

22

--add-hostएक और अधिक सफाई घोल हो सकता है (लेकिन बंदरगाह भाग के बिना, केवल मेजबान इस समाधान के साथ संभाला जा सकता है)। तो, आपके docker runआदेश में, कुछ ऐसा करें:

docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print  $3}'` [my container]

( Https://stackoverflow.com/a/26864854/127400 से )


मैंने कहा "इस के लिए बनाया" जब कोई और / / मेजबान में एक प्रविष्टि चाहता था; इस सवाल में यह सच नहीं है। साथ ही ओपी ने "होस्ट और पोर्टमैप" के लिए कहा और आपने केवल होस्ट को कवर किया है।
ब्रायन

ठीक है। मैं थोड़ा उलझन में था क्योंकि स्वीकृत समाधान केवल मेजबान भाग को भी कवर करता है। और मुझे लगता है कि आपका समाधान स्पिनस में से एक से बेहतर है।
17

यह काम नहीं करता अगर आप डिंड - डॉक-इन-डॉक का उपयोग करना चाहते हैं। इनर डॉकटर में अलग-अलग आईपी होंगे
शोरगुल

12

स्वचालित रूप से ऐसा करने वाले अधिकांश ऐप्स के लिए मानक सर्वोत्तम अभ्यास है: आप नहीं । इसके बजाय आपके पास कंटेनर चलाने वाला व्यक्ति बाहरी होस्टनाम / आईपी पते को कॉन्फ़िगरेशन के रूप में इंजेक्ट करता है, जैसे कि पर्यावरण चर या कॉन्फ़िगरेशन फ़ाइल। इसे इंजेक्ट करने के लिए उपयोगकर्ता को अनुमति देना आपको सबसे पोर्टेबल डिज़ाइन देता है।

यह इतना मुश्किल क्यों होगा? क्योंकि कंटेनर डिजाइन द्वारा, मेजबान वातावरण से आवेदन को अलग कर देंगे। नेटवर्क को केवल उस कंटेनर को डिफ़ॉल्ट रूप से नाम दिया गया है, और मेजबान के विवरण कंटेनर के अंदर चल रही प्रक्रिया से सुरक्षित हैं, जो पूरी तरह से विश्वसनीय नहीं हो सकता है।


आपकी विशिष्ट स्थिति के आधार पर विभिन्न विकल्प हैं:

यदि आपका कंटेनर होस्ट नेटवर्किंग के साथ चल रहा है, तो आप डिफ़ॉल्ट रूट आउट देखने के लिए सीधे होस्ट पर रूटिंग टेबल देख सकते हैं। इस सवाल से मेरे लिए निम्नलिखित काम करता है जैसे:

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

एक कंटेनर में होस्ट नेटवर्किंग के साथ यह दिखाने वाला एक उदाहरण इस प्रकार है:

docker run --rm --net host busybox /bin/sh -c \
  "ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"

डॉकर डेस्कटॉप के कुछ संस्करणों के लिए, उन्होंने एम्बेडेड VM में DNS प्रविष्टि को इंजेक्ट किया:

getent hosts host.docker.internal | awk '{print $1}'

यदि आप क्लाउड वातावरण में चल रहे हैं, तो आप क्लाउड प्रदाता से मेटाडेटा सेवा की जांच कर सकते हैं, जैसे AWS एक:

curl http://169.254.169.254/latest/meta-data/local-ipv4

यदि आप अपना बाहरी / इंटरनेट पता चाहते हैं, तो आप किसी दूरस्थ सेवा की तरह क्वेरी कर सकते हैं:

curl ifconfig.co

इनमें से प्रत्येक की सीमाएँ हैं और केवल विशिष्ट परिदृश्यों में काम करती हैं। सबसे पोर्टेबल विकल्प अभी भी आपके कंटेनर को एक कॉन्फ़िगरेशन के रूप में इंजेक्ट किए गए आईपी पते के साथ चलाना है, उदाहरण के लिए यहां एक विकल्प है ipजो होस्ट पर पहले का कमांड चला रहा है और इसे पर्यावरण चर के रूप में इंजेक्ट कर रहा है:

export HOST_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
docker run --rm -e HOST_IP busybox printenv HOST_IP

वास्तव में उपयोगी curl ifconfig.coकमांड .. धन्यवाद :)
MadAboutProgramming

8

अगर आप असली चाहते हैं IP पता (पुल नहीं IP) Windowsऔर आपके पास डॉकटर 18.03(या हाल ही में) निम्नलिखित हैं:

मेजबान से कंटेनर पर बैश चलाएं जहां छवि का नाम है nginx (काम करता है Alpine Linux distribution):

 docker run -it nginx /bin/ash

फिर कंटेनर के अंदर चलाएं

/ # nslookup host.docker.internal

Name:      host.docker.internal
Address 1: 192.168.65.2

192.168.65.2होस्ट का आईपी है - spinusस्वीकृत उत्तर में पुल आईपी की तरह नहीं ।

मैं यहाँ host.docker.internal का उपयोग कर रहा हूँ :

होस्ट के पास एक बदलती आईपी पता है (या यदि आपके पास कोई नेटवर्क नहीं है)। 18.03 बजे से हमारी अनुशंसा विशेष DNS नाम host.docker.internal से जुड़ने की है, जो होस्ट द्वारा उपयोग किए गए आंतरिक आईपी पते पर आधारित है। यह विकास के उद्देश्य के लिए है और विंडोज के लिए डॉकर के बाहर उत्पादन वातावरण में काम नहीं करेगा।


2
मैंने आपको हल करने की कोशिश की और ऐसा लगता है कि nslookup कमांड नहीं मिल सकता है
सर्गेई

@Sergey क्या आपकी छवि आधारित है Alpine Linux? यदि नहीं तो अपने विशिष्ट के लिए बराबर की जाँच करें linux distribution
कामिल विटकोव्स्की

नहीं, मैं आपके आदेश का बिल्कुल उपयोग करता हूं - docker run -it nginx / bin / ash
Sergey

ठीक है - यदि आप खिड़कियों पर हैं, तो मैं स्विच कर रहा linux containersहूं और मैं उपयोग नहीं windows containersकर रहा हूं। आप ऐसा कर सकते हैं कि राइट-क्लिक करके docker iconऔर चयन करें Switch to Linux containers। मुझे लगता है कि जब आप छवि डाउनलोड कर रहे हैं तो यह महत्वपूर्ण हो सकता है। यदि आपने windows containerपुरानी nginxछवि को हटाने और इसे फिर से डाउनलोड करने की जांच की है, तो आपको एक अन्य कंटेनर मिलेगा। अगर यह अभी भी आपके लिए काम नहीं करेगा - तो आप nslookupमें स्थापित करने की कोशिश कर सकते हैं ash
कामिल विटकोव्स्की

यदि आप nslookup नहीं कर सकते हैं, तो बस पिंग करें। यह सुलझा हुआ आईपी दिखाएगा। मेरे लिए यह उत्तर काम करता है, और मैं host.docker.internalकंटेनर के अंदर से केवल इस होस्टनाम ( ) का उपयोग कर रहा हूं
दिमित्री मिंकोवस्की

7

मैक और विंडोज के लिए TLDR

docker run -it --rm alpine nslookup host.docker.internal

... होस्ट का IP पता प्रिंट करता है ...

nslookup: can't resolve '(null)': Name does not resolve

Name:      host.docker.internal
Address 1: 192.168.65.2

विवरण

पर मैक और विंडोज , तो आप विशेष DNS नाम का उपयोग कर सकते host.docker.internal

होस्ट के पास एक बदलती आईपी पता है (या यदि आपके पास कोई नेटवर्क नहीं है)। 18.03 बजे से हमारी अनुशंसा विशेष DNS नाम host.docker.internal से जुड़ने की है, जो होस्ट द्वारा उपयोग किए गए आंतरिक आईपी पते पर आधारित है। यह विकास के उद्देश्य के लिए है और मैक के लिए डॉकर डेस्कटॉप के बाहर उत्पादन वातावरण में काम नहीं करेगा।


1
कृपया एक से अधिक प्रश्नों के उत्तर न जोड़ें । सबसे अच्छा उत्तर दें और बाकी को डुप्लिकेट के रूप में चिह्नित करें, जब आप पर्याप्त प्रतिष्ठा अर्जित करते हैं। यदि यह डुप्लिकेट नहीं है, तो प्रश्न के लिए पोस्ट को दर्जी करें और असमानता के लिए ध्वज।
भार्गव राव

6

मैक के लिए डॉकर मैं एक कंटेनर से होस्ट पर एक सेवा से जुड़ना चाहता हूं

होस्ट के पास एक बदलती आईपी पता है (या यदि आपके पास कोई नेटवर्क नहीं है)। 18.03 बजे से हमारी अनुशंसा विशेष DNS नाम host.docker.internal से जुड़ने की है, जो होस्ट द्वारा उपयोग किए गए आंतरिक आईपी पते पर आधारित है।

प्रवेश द्वार भी गेटवे .ocker.internal के रूप में उपलब्ध है। https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


5

यदि आप डॉकटर दूरस्थ एपीआई ( उदाहरण के लिए) को सक्षम करते हैं और होस्ट मशीन के होस्टनाम या आईपी पते को जानते हैं, तो यह बहुत सारे बैश के साथ किया जा सकता है।-Htcp://0.0.0.0:4243

मेरे कंटेनर के उपयोगकर्ता के भीतर bashrc:

export hostIP=$(ip r | awk '/default/{print $3}')
export containerID=$(awk -F/ '/docker/{print $NF;exit;}' /proc/self/cgroup)
export proxyPort=$(
  curl -s http://$hostIP:4243/containers/$containerID/json |
  node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).NetworkSettings.Ports["DESIRED_PORT/tcp"][0].HostPort'
)

दूसरी पंक्ति आपकी स्थानीय /proc/self/cgroupफ़ाइल से कंटेनर ID पकड़ती है ।

तीसरी पंक्ति मेजबान मशीन को कर्ल करती है (यह मानकर कि आप 4243 डॉकर्स पोर्ट के रूप में उपयोग कर रहे हैं) फिर नोड का उपयोग करता है ताकि लौटे JSON को पार्स किया जा सके DESIRED_PORT


यह केवल तब लागू होता है जब आप पोर्ट फ़ॉरवर्डिंग का उपयोग करते हैं। वास्तव में HostPortयहाँ उपयोगी जानकारी HostIpहो सकती है , दुर्भाग्य से हो सकता है0.0.0.0
अर्नौट एंगेलन

4

मेरे पास उबंटू 16.03 है। मेरे लिए

docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print  $3}'` [image]

काम नहीं करता है (गलत आईपी उत्पन्न कर रहा था)

मेरा कार्य समाधान यह था कि:

docker run --add-host dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` [image]

3

एडब्ल्यूएस में डॉकर चलाने वालों के लिए यहां एक और विकल्प है। यह विकल्प कर्ल पैकेज को जोड़ने के लिए एपीके का उपयोग करने से बचता है और 7 एमबी अंतरिक्ष की बचत करता है। अंतर्निहित विगो का उपयोग करें (अखंड बिजीबॉक्स बाइनरी का हिस्सा):

wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4

3

AFAIK, लिनक्स के लिए डॉकर (मानक वितरण) के मामले में, मेजबान का आईपी पता हमेशा रहेगा 172.17.0.1

इसे प्राप्त करने का सबसे आसान तरीका ifconfigहोस्ट के माध्यम से (इंटरफ़ेस docker0) है:

ifconfig

कर्ता के अंदर से, कर्ता से निम्न आज्ञा: ip -4 route show default | cut -d" " -f3

आप इसे निम्न कमांड लाइन के साथ डॉक में जल्दी से चला सकते हैं:

# 1. Run an ubuntu docker
# 2. Updates dependencies (quietly)
# 3. Install ip package   (quietly)
# 4. Shows (nicely) the ip of the host
# 5. Removes the docker (thanks to `--rm` arg)
docker run -it --rm ubuntu:19.10 bash -c "apt-get update && apt-get install iproute2 -y && ip -4 route show default | cut -d' ' -f3"

मुझे उम्मीद है यह मदद करेगा।


2

लिनक्स में आप चला सकते हैं

HOST_IP=`hostname -I | awk '{print $1}'`

MacOS में आपकी होस्ट मशीन डॉकटर होस्ट नहीं है। Docker इसे VirtualBox में OS होस्ट करेगा।

HOST_IP=`docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print $4}' | sed s'/.$//'`

1
पहला कोड ब्लॉक कंटेनर IP को पकड़ लेगा न कि होस्ट IP
Ari

मैंडॉक hostname -I"आउटपुट के क्रम के बारे में कोई धारणा नहीं बनाने के लिए चेतावनी देता है।"
बजे

1

यह Node.js में एक न्यूनतम कार्यान्वयन है , जो AWS EC2 इंस्टेंस पर होस्ट चला रहा है , उपरोक्त उल्लिखित EC2 मेटाडेटा उदाहरण का उपयोग करके

const cp = require('child_process');
const ec2 = function (callback) {
    const URL = 'http://169.254.169.254/latest/meta-data/local-ipv4';
    // we make it silent and timeout to 1 sec
    const args = [URL, '-s', '--max-time', '1'];
    const opts = {};
    cp.execFile('curl', args, opts, (error, stdout) => {
        if (error) return callback(new Error('ec2 ip error'));
        else return callback(null, stdout);
    })
        .on('error', (error) => callback(new Error('ec2 ip error')));
}//ec2

और के रूप में इस्तेमाल किया

ec2(function(err, ip) {
        if(err) console.log(err)
        else console.log(ip);
    })


0

यहाँ है कि मैं यह कैसे करते हैं। इस स्थिति में, यह मेरे स्थानीय मशीन IP पर taurus- host की ओर इशारा करते हुए docker छवि के भीतर / etc / मेजबान में एक मेजबान प्रविष्टि जोड़ता है:

TAURUS_HOST=`ipconfig getifaddr en0`
docker run -it --rm -e MY_ENVIRONMENT='local' --add-host "taurus-host:${TAURUS_HOST}" ...

फिर, डॉकर कंटेनर के भीतर से, स्क्रिप्ट मेरे स्थानीय मशीन से बाहर निकलने के लिए होस्ट नाम टॉरस-होस्ट का उपयोग कर सकती है जो डॉक कंटेनर को होस्ट करती है।


0

हो सकता है कि मेरे द्वारा बनाया गया कंटेनर उपयोगी हो और साथ ही https://github.com/qoomon/docker-host भी उपयोगी हो

आप बस होस्ट सिस्टम तक पहुँचने के लिए कंटेनर नाम डीएनएस का उपयोग कर सकते हैं जैसे कर्ल http: // dockerhost: 9200 , इसलिए किसी भी आईपी पते से परेशान होने की आवश्यकता नहीं है।


0

मेरे द्वारा उपयोग किया जाने वाला समाधान एक "सर्वर" पर आधारित है, जो http अनुरोध प्राप्त होने पर डॉकर होस्ट का बाहरी पता देता है।

"सर्वर" पर:

1) jwilder / nginx- प्रॉक्सी शुरू करें

# docker run -d -p <external server port>:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

2) स्टार्ट कंटेनर को प्रारंभ करें

# docker run -e VIRTUAL_HOST=<external server name/address> --detach --name ipify osixia/ipify-api:0.1.0

अब जब एक कंटेनर सर्वर पर http अनुरोध भेजता है, जैसे

# curl http://<external server name/address>:<external server port>

Docker होस्ट का IP पता http हेडर "X-Forwarded-For" के माध्यम से ipify द्वारा लौटाया गया है

उदाहरण (ipify सर्वर का नाम "ipify.example.com" है और पोर्ट 80 पर चलता है, docker host के पास IP 10.20.30.40 है:

# docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
# docker run -e VIRTUAL_HOST=ipify.example.com --detach --name ipify osixia/ipify-api:0.1.0

कंटेनर के अंदर अब आप कॉल कर सकते हैं:

# curl http://ipify.example.com
10.20.30.40


-2

उबंटू पर, hostnameकमांड का उपयोग निम्नलिखित विकल्पों के साथ किया जा सकता है:

  • -i, --ip-address होस्ट नाम के लिए पतों
  • -I, --all-ip-addressesमेजबान के लिए सभी पते

उदाहरण के लिए:

$ hostname -i
172.17.0.2

चर को असाइन करने के लिए, निम्नलिखित एक-लाइनर का उपयोग किया जा सकता है:

IP=$(hostname -i)

यह आपको डॉकटर कंटेनर का आईपी पता देगा, मेजबान का नहीं
मारियो कैमो

-7

साथ में Https://docs.docker.com/machine/install-machine/ के

क) $ डोकर-मशीन आईपी

बी) एक या अधिक मशीनों का आईपी पता प्राप्त करें।

  $ docker-machine ip host_name

  $ docker-machine ip host_name1 host_name2

10
यह वर्चुअल मशीन के आईपी को पुनः प्राप्त करता है जो डॉक कंटेनर को चलाता है, न कि उस मेजबान के आईपी को जो कंटेनर में चलता है।
स्पेंसर विलियम्स

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