क्या एक कमांड है जिसे मैं कंटेनर का आईपी पता प्राप्त करने के लिए होस्ट से चला सकता हूं एक नया कंटेनर बनने के बाद?
असल में, एक बार डॉकटर कंटेनर बनाने के बाद, मैं अपनी खुद की कोड तैनाती और कंटेनर कॉन्फ़िगरेशन स्क्रिप्ट रोल करना चाहता हूं।
क्या एक कमांड है जिसे मैं कंटेनर का आईपी पता प्राप्त करने के लिए होस्ट से चला सकता हूं एक नया कंटेनर बनने के बाद?
असल में, एक बार डॉकटर कंटेनर बनाने के बाद, मैं अपनी खुद की कोड तैनाती और कंटेनर कॉन्फ़िगरेशन स्क्रिप्ट रोल करना चाहता हूं।
जवाबों:
बचाव का --format
विकल्प inspect
आता है।
आधुनिक डॉकर क्लाइंट सिंटैक्स है:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
पुराना डॉकर क्लाइंट सिंटैक्स है:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
ये कमांड डॉकर कंटेनर के आईपी एड्रेस को वापस कर देंगे।
जैसा कि टिप्पणियों में उल्लेख किया गया है: यदि आप विंडोज पर हैं, तो घुंघराले ब्रेस के चारों ओर "
एकल उद्धरण के बजाय दोहरे उद्धरण चिह्नों का उपयोग करें '
।
<no value>
अंजीर / Boot2Docker का उपयोग कर एक मैक पर प्रतिक्रिया प्राप्त करना
<no value>
यदि आप इस कंटेनर को चलाने की कोशिश कर रहे हैं जो कि नहीं चल रहा है। सुनिश्चित करें कि ऐसा करने से पहले आपका कंटेनर चल रहा है।
{{ .NetworkSettings.Networks.$network.IPAddress }}
। डिफ़ॉल्ट पुल प्रतीत होता है, लेकिन डॉकटर-कम्पोज़ के तहत यह एक विशिष्ट नाम होगा जो आपके ऐप के नाम पर निर्भर करता है (मुझे लगता है कि --प्रोजेक्ट-नाम ध्वज से, हालांकि यह भी निर्भर करता है कि किस प्रकार का नेटवर्किंग डिस्क है आपने सेट किया है)। मैंने यहां एक उत्तर में एक पूर्ण उत्तर लिखा था stackoverflow.com/questions/17157721/…
आप उपयोग कर सकते हैं docker inspect <container id>
।
उदाहरण के लिए:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
docker inspect $CID | grep IPAddress | cut -d '"' -f 4
, यह ठीक काम करता है :)
alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
नया वाक्यविन्यास है। -format
पदावनत हो जाता है, बन जाता है --format
।
सबसे पहले कंटेनर आईडी प्राप्त करें:
docker ps
(पहला कॉलम कंटेनर आईडी के लिए है)
चलाने के लिए कंटेनर ID का उपयोग करें:
docker inspect <container ID>
सबसे नीचे, "NetworkSettings" के तहत, आप "IPAddress" पा सकते हैं
या बस करो:
docker inspect <container id> | grep "IPAddress"
docker run -it MYCONTAINER /bin/bash
), आउटपुट का inspect
कोई खंड नहीं है NetworkSettings
!
docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
... | grep IP
आईपी प्राप्त करने के लिए आवश्यक सभी स्वरूपण विवरणों के समाधान को बहुत पसंद करता हूं । +1
docker run -it MYIMAGE
docker inspect MYIMAGE
MYIMAGE_1
docker inspect MYIMAGE_1
docker inspect CONTAINER_ID | grep "IPAddress"
आप -i
मामले को अनदेखा करने के लिए grep में जोड़ सकते हैं तब भी निम्नलिखित काम करेंगे:
docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
केवल एक ही आदेश में सभी कंटेनर नाम और उनके आईपी पते प्राप्त करने के लिए।
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
यदि आप docker-compose
कमांड का उपयोग कर रहे हैं तो यह होगा:
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
उत्पादन होगा:
/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
{{.NetworkSettings.IPAddress }}
में{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'
:। sed(1)
हटा देगा कंटेनर वर्तमान के लिए खाली लाइनों, लेकिन एक आईपी पते नहीं होने चाहिए।
इस शेल स्क्रिप्ट को अपनी ~/.bashrc
या संबंधित फ़ाइल में जोड़ें :
docker-ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
फिर, एक कंटेनर का IP पता प्राप्त करने के लिए, बस यह करें:
docker-ip YOUR_CONTAINER_ID
डॉकर के नए संस्करण के लिए, कृपया निम्नलिखित का उपयोग करें:
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
source ~/.bash_profile
डॉकर 1.3+ में, आप इसका उपयोग करके भी देख सकते हैं:
रनिंग डॉकर (लिनक्स) दर्ज करें:
docker exec [container-id or container-name] cat /etc/hosts
172.17.0.26 d8bc98fa4088
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.17 mysql
विंडोज के लिए:
docker exec [container-id or container-name] ipconfig
docker exec [container-name-or-id] ip a
docker exec [container-id or container-name] ipconfig
डॉकर संस्करण 1.10.3 के रूप में, 20f81dd का निर्माण करें
जब तक आपने डॉकर को अन्यथा नहीं बताया, डॉकर हमेशा आपके कंटेनर को ब्रिज नेटवर्क में लॉन्च करता है। तो आप इस आदेश को नीचे आज़मा सकते हैं:
docker network inspect bridge
जिसे तब एक कंटेनर अनुभाग वापस करना चाहिए जो उस चालू कंटेनर के लिए आईपी पता प्रदर्शित करेगा।
[
{
"Name": "bridge",
"Id": "40561e7d29a08b2eb81fe7b02736f44da6c0daae54ca3486f75bfa81c83507a0",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Containers": {
"025d191991083e21761eb5a56729f61d7c5612a520269e548d0136e084ecd32a": {
"Name": "drunk_leavitt",
"EndpointID": "9f6f630a1743bd9184f30b37795590f13d87299fe39c8969294c8a353a8c97b3",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
}
}
]
निष्पादित:
docker ps -a
यह सक्रिय डॉकटर चित्र प्रदर्शित करेगा:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
कंटेनर आईडी मूल्य का उपयोग करें:
docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
"172.17.0.2"
मेरे द्वारा पसंद किए गए कुछ उत्तरों के आधार पर, मैंने सभी आईपी पते और एक विशिष्ट कंटेनर के लिए एक फ़ंक्शन प्राप्त करने के लिए उन्हें एक समारोह में विलय करने का निर्णय लिया। वे अब मेरी .bashrc
फाइल में हैं।
docker-ips() {
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
पहला कमांड सभी कंटेनरों का आईपी पता देता है और दूसरा एक विशिष्ट कंटेनर का आईपी एड्रेस।
docker-ips
docker-ip YOUR_CONTAINER_ID
के तहत चल रहे सभी कंटेनरों से आईपी पतों की एक तालिका प्राप्त करने के लिए मैंने निम्नलिखित बैश स्क्रिप्ट लिखी docker-compose
।
function docker_container_names() {
docker ps -a --format "{{.Names}}" | xargs
}
# Get the IP address of a particular container
dip() {
local network
network='YOUR-NETWORK-HERE'
docker inspect --format "{{ .NetworkSettings.Networks.$network.IPAddress }}" "$@"
}
dipall() {
for container_name in $(docker_container_names);
do
local container_ip=$(dip $container_name)
if [[ -n "$container_ip" ]]; then
echo $(dip $container_name) " $container_name"
fi
done | sort -t . -k 3,3n -k 4,4n
}
आपको चर नेटवर्क को अपने नेटवर्क नाम में बदलना चाहिए।
यहाँ एक त्वरित जवाब है:
अपना कंटेनर नाम या आईडी प्राप्त करें:
docker container ls
फिर आईपी प्राप्त करें:
docker inspect <container_ID Or container_name> |grep 'IPAddress'
पोर्ट प्राप्त करें:
docker inspect <container_ID Or container_name> |grep 'Port'
डॉकर को गो में लिखा गया है और यह क्वेरी उद्देश्यों के लिए गो सिंटैक्स का उपयोग करता है।
एक विशेष कंटेनर के आईपी पते का निरीक्षण करने के लिए, आपको कमांड चलाने की जरूरत है ( -f
"प्रारूप" के लिए):
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
कंटेनर आईडी या नाम के लिए, आप कमांड चला सकते हैं
docker container ls
जो हर चलने वाले कंटेनर को सूचीबद्ध करेगा।
यहां एक समाधान है जिसे मैंने आज पायथन में विकसित किया है, docker inspect container
डेटा स्रोत के रूप में JSON आउटपुट का उपयोग कर रहा है ।
मेरे पास बहुत सारे कंटेनर और इन्फ्रास्ट्रक्चर हैं जिनका मुझे निरीक्षण करना है, और मुझे किसी भी कंटेनर से, तेज और सुंदर तरीके से बुनियादी नेटवर्क जानकारी प्राप्त करने की आवश्यकता है। इसलिए मैंने यह स्क्रिप्ट बनाई है।
महत्वपूर्ण: संस्करण 1.9 के बाद से, डॉकर आपको कई नेटवर्क बनाने और कंटेनरों में संलग्न करने की अनुमति देता है।
#!/usr/bin/python
import json
import subprocess
import sys
try:
CONTAINER = sys.argv[1]
except Exception as e:
print "\n\tSpecify the container name, please."
print "\t\tEx.: script.py my_container\n"
sys.exit(1)
# Inspecting container via Subprocess
proc = subprocess.Popen(["docker","inspect",CONTAINER],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
out = proc.stdout.read()
json_data = json.loads(out)[0]
net_dict = {}
for network in json_data["NetworkSettings"]["Networks"].keys():
net_dict['mac_addr'] = json_data["NetworkSettings"]["Networks"][network]["MacAddress"]
net_dict['ipv4_addr'] = json_data["NetworkSettings"]["Networks"][network]["IPAddress"]
net_dict['ipv4_net'] = json_data["NetworkSettings"]["Networks"][network]["IPPrefixLen"]
net_dict['ipv4_gtw'] = json_data["NetworkSettings"]["Networks"][network]["Gateway"]
net_dict['ipv6_addr'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6Address"]
net_dict['ipv6_net'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6PrefixLen"]
net_dict['ipv6_gtw'] = json_data["NetworkSettings"]["Networks"][network]["IPv6Gateway"]
for item in net_dict:
if net_dict[item] == "" or net_dict[item] == 0:
net_dict[item] = "null"
print "\n[%s]" % network
print "\n{}{:>13} {:>14}".format(net_dict['mac_addr'],"IP/NETWORK","GATEWAY")
print "--------------------------------------------"
print "IPv4 settings:{:>16}/{:<5} {}".format(net_dict['ipv4_addr'],net_dict['ipv4_net'],net_dict['ipv4_gtw'])
print "IPv6 settings:{:>16}/{:<5} {}".format(net_dict['ipv6_addr'],net_dict['ipv6_net'],net_dict['ipv6_gtw'])
आउटपुट है:
$ python docker_netinfo.py debian1
[frontend]
02:42:ac:12:00:02 IP/NETWORK GATEWAY
--------------------------------------------
IPv4 settings: 172.18.0.2/16 172.18.0.1
IPv6 settings: null/null null
[backend]
02:42:ac:13:00:02 IP/NETWORK GATEWAY
--------------------------------------------
IPv4 settings: 172.19.0.2/16 172.19.0.1
IPv6 settings: null/null null
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
ऊपर काम करता है अगर कंटेनर डिफ़ॉल्ट पुल नेटवर्क पर तैनात है।
हालाँकि, यदि कस्टम ब्रिज नेटवर्क या ओवरले नेटवर्क का उपयोग किया जाता है, तो मुझे बेहतर काम करने के लिए नीचे मिला:
docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
को-डॉस उत्तर का विस्तार करने के लिए, यहां सभी कंटेनर नामों और उनके आईपी पते को सूचीबद्ध करने के लिए एक उपनाम है:
alias docker-ips='docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect $name | grep IPAddress | cut -d \" -f 4; done'
docker ps -q
से बचने के लिए tail
, और टाल से बचने के लिए उपयोग करें --format
। इसके अलावा आप docker inspect
शेल में लूप के बजाय कई कंटेनर आईडी पास कर सकते हैं ।
docker ps -q
केवल कंटेनरों की संख्यात्मक आईडी प्रदर्शित करता है, लेकिन मुझे लगता है कि उनके नाम का उपयोग करना बेहतर है। tail
केवल पहली पंक्ति (तालिका शीर्ष लेख) से छुटकारा पाने के लिए और अभी भी आवश्यक है। मैं उपयोग कर सकता हूं --format
, हालांकि docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done
:। लेकिन यह एक बड़ा सुधार नहीं लगता है ... grep
अधिक पठनीय IMO था।
docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
यदि आपने डॉकर टूलबॉक्स का उपयोग करके डॉकटर को स्थापित किया है, तो आप कंटेनर आईपी पते को प्राप्त करने के लिए किटीमैटिक एप्लिकेशन का उपयोग कर सकते हैं:
docker inspect
जब आप डॉक टूलबॉक्स चलाते हैं तो यह काम नहीं करता है। यह एक आईपी पते की रिपोर्ट करेगा, लेकिन यह सही पता नहीं है कि आपकी सेवाओं का उपयोग क्या होगा।
ध्यान दें!!! डॉकर कम्पोज़ के उपयोग के लिए:
चूंकि डॉकर कम्पोज़ प्रत्येक क्लस्टर के लिए एक अलग नेटवर्क बनाता है, इसलिए नीचे दिए गए तरीके काम नहीं करते हैं docker-compose
।
सबसे सुरुचिपूर्ण और आसान तरीका एक शेल फ़ंक्शन को परिभाषित कर रहा है, वर्तमान में सबसे अधिक मतदान वाला उत्तर @ WouterD का :
dockip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
डॉकटर कंटेनर आईडी को लिनक्स प्रोग्राम जैसी फ़ाइल में लिख सकता है:
साथ चल रहा है --cidfile=filename
, डॉकटर ने कंटेनर का आईडी "फ़ाइलनाम" में डाल दिया।
अधिक जानकारी के लिए " डॉकर पीआईडी समकक्ष अनुभाग चलाता है " देखें ।
--cidfile="app.cid": Write the container ID to the file
PID फ़ाइल का उपयोग करना:
--cidfile
पैरामीटर के साथ कंटेनर चलाना , app.cid
फ़ाइल सामग्री इस प्रकार है:
a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
डॉकटर कंटेनरों का निरीक्षण करने के लिए आप फ़ाइल सामग्री का उपयोग कर सकते हैं:
blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
आप इनलाइन पायथन लिपि का उपयोग करके कंटेनर IP निकाल सकते हैं:
$ docker inspect `cat app.cid` | python -c "import json;import sys;\
sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])"
172.17.0.2
यहाँ एक अधिक मानवीय अनुकूल रूप है:
#!/usr/bin/env python
# Coding: utf-8
# Save this file like get-docker-ip.py in a folder that in $PATH
# Run it with
# $ docker inspect <CONTAINER ID> | get-docker-ip.py
import json
import sys
sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])
अधिक जानकारी के लिए " डॉकर कंटेनर आईपी पते प्राप्त करने के 10 विकल्प " देखें ।
यह मेजबान पर सभी कंटेनर आईपी को सूचीबद्ध करेगा:
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
डॉकर सभी कंटेनर ips और इसके संबंधित नामों को प्रिंट करने के लिए उपयोग का निरीक्षण करता है
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
पूर्णता के लिए:
मुझे वास्तव में --format
विकल्प पसंद है , लेकिन पहले मुझे इसके बारे में पता नहीं था इसलिए मैंने समान पाने के लिए एक साधारण पायथन वन-लाइनर का उपयोग किया:
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
उपयोग:
docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
$ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
172.17.0.2
के लिए विंडोज कंटेनर उपयोग
docker exec <container> ipconfig
कंटेनर का नाम या आईडी कहां <container>
है ।
आप docker ps
कंटेनर की आईडी खोजने के लिए उपयोग कर सकते हैं ।
यदि आप कंटेनर आईडी भूल गए हैं या शेल कमांड के साथ हेरफेर नहीं करना चाहते हैं, तो पोर्टेनेर की तरह यूआई का उपयोग करना बेहतर है।
$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
वहां आप कंटेनर के बारे में सभी जानकारी भी पा सकते हैं आईपी।