जैसा कि शीर्षक कहता है। मुझे आईपी एड्रेस को होस्ट करने वाले और पोर्ट से होस्ट को कंटेनर में भेजने और कंटेनर के अंदर करने में सक्षम होना चाहिए।
जैसा कि शीर्षक कहता है। मुझे आईपी एड्रेस को होस्ट करने वाले और पोर्ट से होस्ट को कंटेनर में भेजने और कंटेनर के अंदर करने में सक्षम होना चाहिए।
जवाबों:
/sbin/ip route|awk '/default/ { print $3 }'
जैसा कि @MichaelNeale ने देखा, इस विधि का उपयोग करने का कोई अर्थ नहीं है Dockerfile
(सिवाय इसके कि जब हमें इस IP की आवश्यकता केवल बिल्ड समय के दौरान हो), क्योंकि यह IP बिल्ड समय के दौरान हार्डकोड किया जाएगा।
संस्करण 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
docker.for.mac..
बेकार है क्योंकि ज्यादातर मामलों में आपकी कंपनी में लिनक्स- या मैक-केवल वातावरण नहीं है। यह मिश्रित है, आपके पास लिनक्स और मैक और विंडोज का उपयोग करने वाले देव हैं। इस डोमेन का कोई मतलब नहीं है क्योंकि 99% में यह एक मिश्रित होस्ट ओएस वातावरण है। मैं macOS के तहत एक कंटेनर विकसित नहीं करता हूं और इसे macOS सर्वर पर तैनात करता हूं। मैं इसे लिनक्स में तैनात करता हूं। ऐसा हर कोई करता है। तो क्या पूरे बिंदु भी है docker.for.mac..
?
docker.for.mac.host.internal
से कोई फर्क नहीं पड़ता कि आप डॉकर का उपयोग कर रहे हैं या उसके बिना docker-compose
। मैं कॉन्फ़िगरेशन फ़ाइलों में एक निश्चित होस्ट का उपयोग करना चाहता हूं। उदाहरण के लिए, IDK, docker.host.internal
जो हमेशा होस्ट IP पते की ओर इशारा करता है। इसके बावजूद कि मैं कौन सा होस्ट सिस्टम इस्तेमाल कर रहा हूं। यह डॉकर का उपयोग करने का पूरा बिंदु है: मैं स्वायत्त होना चाहता हूं। मैं समझता हूं कि यह macOS पर भी पेचीदा है क्योंकि आपके पास होस्ट सिस्टम और कंटेनर के बीच एक और परत है। लेकिन वैसे भी, मेरी राय docker.for.mac.host.internal
में बेकार है अगर आप इसे केवल macOS के लिए उपयोग कर सकते हैं।
अपडेट: मैक के लिए डॉकर पर , संस्करण 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.*
ऊपर के उदाहरण में इस्तेमाल किया । सुनिश्चित करें कि आपके द्वारा उपयोग किया जाने वाला आईपी आपके अपने नेटवर्क पर किसी चीज़ के साथ संघर्ष नहीं करता है।
एडब्ल्यूएस में डॉकर चलाने वालों के लिए, होस्ट के लिए मेटा-डेटा कंटेनर के अंदर से अभी भी उपलब्ध है।
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+'
जब आप कंटेनर बनाते हैं तो एकमात्र तरीका मेजबान जानकारी को पर्यावरण के रूप में पारित कर रहा है
run --env <key>=<value>
-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"
(से स्वीकार किए जाते हैं जवाब का उपयोग कर unix.stackexchange.com/questions/87468/... )
--add-host
एक और अधिक सफाई घोल हो सकता है (लेकिन बंदरगाह भाग के बिना, केवल मेजबान इस समाधान के साथ संभाला जा सकता है)। तो, आपके docker run
आदेश में, कुछ ऐसा करें:
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [my container]
स्वचालित रूप से ऐसा करने वाले अधिकांश ऐप्स के लिए मानक सर्वोत्तम अभ्यास है: आप नहीं । इसके बजाय आपके पास कंटेनर चलाने वाला व्यक्ति बाहरी होस्टनाम / आईपी पते को कॉन्फ़िगरेशन के रूप में इंजेक्ट करता है, जैसे कि पर्यावरण चर या कॉन्फ़िगरेशन फ़ाइल। इसे इंजेक्ट करने के लिए उपयोगकर्ता को अनुमति देना आपको सबसे पोर्टेबल डिज़ाइन देता है।
यह इतना मुश्किल क्यों होगा? क्योंकि कंटेनर डिजाइन द्वारा, मेजबान वातावरण से आवेदन को अलग कर देंगे। नेटवर्क को केवल उस कंटेनर को डिफ़ॉल्ट रूप से नाम दिया गया है, और मेजबान के विवरण कंटेनर के अंदर चल रही प्रक्रिया से सुरक्षित हैं, जो पूरी तरह से विश्वसनीय नहीं हो सकता है।
आपकी विशिष्ट स्थिति के आधार पर विभिन्न विकल्प हैं:
यदि आपका कंटेनर होस्ट नेटवर्किंग के साथ चल रहा है, तो आप डिफ़ॉल्ट रूट आउट देखने के लिए सीधे होस्ट पर रूटिंग टेबल देख सकते हैं। इस सवाल से मेरे लिए निम्नलिखित काम करता है जैसे:
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
कमांड .. धन्यवाद :)
अगर आप असली चाहते हैं 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 से जुड़ने की है, जो होस्ट द्वारा उपयोग किए गए आंतरिक आईपी पते पर आधारित है। यह विकास के उद्देश्य के लिए है और विंडोज के लिए डॉकर के बाहर उत्पादन वातावरण में काम नहीं करेगा।
Alpine Linux
? यदि नहीं तो अपने विशिष्ट के लिए बराबर की जाँच करें linux distribution
।
linux containers
हूं और मैं उपयोग नहीं windows containers
कर रहा हूं। आप ऐसा कर सकते हैं कि राइट-क्लिक करके docker icon
और चयन करें Switch to Linux containers
। मुझे लगता है कि जब आप छवि डाउनलोड कर रहे हैं तो यह महत्वपूर्ण हो सकता है। यदि आपने windows container
पुरानी nginx
छवि को हटाने और इसे फिर से डाउनलोड करने की जांच की है, तो आपको एक अन्य कंटेनर मिलेगा। अगर यह अभी भी आपके लिए काम नहीं करेगा - तो आप nslookup
में स्थापित करने की कोशिश कर सकते हैं ash
।
host.docker.internal
कंटेनर के अंदर से केवल इस होस्टनाम ( ) का उपयोग कर रहा हूं
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 से जुड़ने की है, जो होस्ट द्वारा उपयोग किए गए आंतरिक आईपी पते पर आधारित है। यह विकास के उद्देश्य के लिए है और मैक के लिए डॉकर डेस्कटॉप के बाहर उत्पादन वातावरण में काम नहीं करेगा।
मैक के लिए डॉकर मैं एक कंटेनर से होस्ट पर एक सेवा से जुड़ना चाहता हूं
होस्ट के पास एक बदलती आईपी पता है (या यदि आपके पास कोई नेटवर्क नहीं है)। 18.03 बजे से हमारी अनुशंसा विशेष DNS नाम host.docker.internal से जुड़ने की है, जो होस्ट द्वारा उपयोग किए गए आंतरिक आईपी पते पर आधारित है।
प्रवेश द्वार भी गेटवे .ocker.internal के रूप में उपलब्ध है। https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
यदि आप डॉकटर दूरस्थ एपीआई ( उदाहरण के लिए) को सक्षम करते हैं और होस्ट मशीन के होस्टनाम या आईपी पते को जानते हैं, तो यह बहुत सारे बैश के साथ किया जा सकता है।-H
tcp://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
मेरे पास उबंटू 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]
एडब्ल्यूएस में डॉकर चलाने वालों के लिए यहां एक और विकल्प है। यह विकल्प कर्ल पैकेज को जोड़ने के लिए एपीके का उपयोग करने से बचता है और 7 एमबी अंतरिक्ष की बचत करता है। अंतर्निहित विगो का उपयोग करें (अखंड बिजीबॉक्स बाइनरी का हिस्सा):
wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4
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"
मुझे उम्मीद है यह मदद करेगा।
लिनक्स में आप चला सकते हैं
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'/.$//'`
hostname -I
"आउटपुट के क्रम के बारे में कोई धारणा नहीं बनाने के लिए चेतावनी देता है।"
यह 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);
})
यदि आप सर्विस फैब्रिक क्लस्टर पर विंडोज कंटेनर चला रहे हैं, तो होस्ट का आईपी एड्रेस पर्यावरण चर के माध्यम से उपलब्ध है Fabric_NodeIPOrFQDN
। सेवा कपड़ा पर्यावरण चर
यहाँ है कि मैं यह कैसे करते हैं। इस स्थिति में, यह मेरे स्थानीय मशीन IP पर taurus- host की ओर इशारा करते हुए docker छवि के भीतर / etc / मेजबान में एक मेजबान प्रविष्टि जोड़ता है:
TAURUS_HOST=`ipconfig getifaddr en0`
docker run -it --rm -e MY_ENVIRONMENT='local' --add-host "taurus-host:${TAURUS_HOST}" ...
फिर, डॉकर कंटेनर के भीतर से, स्क्रिप्ट मेरे स्थानीय मशीन से बाहर निकलने के लिए होस्ट नाम टॉरस-होस्ट का उपयोग कर सकती है जो डॉक कंटेनर को होस्ट करती है।
हो सकता है कि मेरे द्वारा बनाया गया कंटेनर उपयोगी हो और साथ ही https://github.com/qoomon/docker-host भी उपयोगी हो
आप बस होस्ट सिस्टम तक पहुँचने के लिए कंटेनर नाम डीएनएस का उपयोग कर सकते हैं जैसे कर्ल http: // dockerhost: 9200 , इसलिए किसी भी आईपी पते से परेशान होने की आवश्यकता नहीं है।
मेरे द्वारा उपयोग किया जाने वाला समाधान एक "सर्वर" पर आधारित है, जो 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
इसे इस्तेमाल करे
docker run --rm -i --net = मेजबान अल्पाइन ifconfig
उबंटू पर, hostname
कमांड का उपयोग निम्नलिखित विकल्पों के साथ किया जा सकता है:
-i
, --ip-address
होस्ट नाम के लिए पतों-I
, --all-ip-addresses
मेजबान के लिए सभी पतेउदाहरण के लिए:
$ hostname -i
172.17.0.2
चर को असाइन करने के लिए, निम्नलिखित एक-लाइनर का उपयोग किया जा सकता है:
IP=$(hostname -i)
साथ में Https://docs.docker.com/machine/install-machine/ के
क) $ डोकर-मशीन आईपी
बी) एक या अधिक मशीनों का आईपी पता प्राप्त करें।
$ docker-machine ip host_name
$ docker-machine ip host_name1 host_name2