मैं कंटेनर के भीतर से ही डोकर लिनक्स कंटेनर की जानकारी कैसे प्राप्त कर सकता हूं?


135

मैं docker containersउनके विन्यास से अवगत कराना चाहूंगा , इसी तरह आप मेटाडेटा के माध्यम से EC2 उदाहरणों के बारे में जानकारी प्राप्त कर सकते हैं।

मैं उपयोग कर सकता हूं (बशर्ते dockerपोर्ट पर सुन रहा हो 4243)

curl http://172.17.42.1:4243/containers/$HOSTNAME/json

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

इसके अलावा, मैं docker होस्ट का बाहरी IP कैसे प्राप्त कर सकता हूं (EC2 मेटाडेटा तक पहुंचने के अलावा, जो AWS के लिए विशिष्ट है)


2
सावधान: आपको इस lvh.io/posts/… को पढ़ने से पहले नीचे दिए गए किसी भी दृष्टिकोण का उपयोग करने से पहले कंटेनर के अंदर /var/run/docker.sock का उपयोग करने का प्रयास करना चाहिए
harschware

1
अगर @ harschware का लिंक टूट जाता है, तो मैं यहां संक्षेप में बताऊंगा: कंटेनर को एक्सेस देकर /var/run/docker.sock, यह संभव है (तुच्छ) कि डॉकटर द्वारा प्रदान की गई सामग्री से बाहर निकल जाएं और मेजबान मशीन तक पहुंच प्राप्त करें। जाहिर है कि यह संभावित खतरनाक है।
जॉन

1
क्या किसी को पता है कि विंडोज डॉकटर कंटेनर में समान जानकारी कैसे प्राप्त की जाती है यदि --होस्टनेम तर्क का उपयोग रन कमांड के साथ किया जाता है ताकि बस 'होस्टनाम' चल रहा हो और आपको कंटेनरड नहीं देता है?
टिमोथी जॉन लैयर्ड

जवाबों:


68

मुझे पता चला है कि कंटेनर आईडी को / proc / self / cgroup में पाया जा सकता है

तो आप आईडी प्राप्त कर सकते हैं:

cat /proc/self/cgroup | grep -o  -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"

15
इसे थोड़ा cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
मोड़ना था

5
डॉकटर 1.6.2 के लिए मुझे उपयोग करना था:cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
जे टेलर टेलर

14
Aaaaand Docker 1.12:cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
smets.kevin

24
की तरह की तरह मैं basename "$(cat /proc/1/cpuset)"औरbasename "$(head /proc/1/cgroup)"
madeddie

3
भविष्य में, यदि cgroup namepace और cgroup v2 का उपयोग docker में किया जाता है, तो यह विधि अब काम नहीं कर सकती है।
जिंग किउ

69

जब तक ओवरराइड नहीं किया जाता है, तब तक होस्टनाम को 1.12 डॉकर में शॉर्ट कंटेनर आईडी लगती है

root@d2258e6dec11:/project# cat /etc/hostname
d2258e6dec11

बाह्य

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED                 STATUS                      PORTS               NAMES
d2258e6dec11        300518d26271        "bash"              5 minutes ago       

$ docker -v
Docker version 1.12.0, build 8eab29e, experimental

4
हाँ, यह मेरे लिए नोडज में जानकारी खींचने के लिए आसान बना दिया। const os = require('os'); console.log(os.hostname());
पुलकितसिंघल

2
जावा में कंटेनर आईडी से मेल खाने वाला होस्टनाम प्राप्त करने के लिए, उपयोग करें InetAddress.getLocalHost().getHostName()
नाथन

2
कभी-कभी पर्यावरण चर $HOSTNAME(उदाहरण के लिए शेल स्क्रिप्ट में) के मूल्य को पढ़ना आसान होता है ।
फहील

34

आप डॉकटर रिमोट एपीआई के माध्यम से यूनिक्स सॉकेट का उपयोग कर एक कंटेनर के अंदर से डॉकटर के साथ संवाद कर सकते हैं:

https://docs.docker.com/engine/reference/api/docker_remote_api/

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

आप बरगद के उत्तर में उल्लिखित तरीके से कंटेनर का निरीक्षण कर सकते हैं :

GET /containers/4abbef615af7/json HTTP/1.1

उत्तर:

HTTP/1.1 200 OK
Content-Type: application/json

{
         "Id": "4abbef615af7......  ",
         "Created": "2013.....",
         ...
}

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

docker run -t -i -cidfile /mydir/host1.txt -v /mydir:/mydir ubuntu /bin/bash

डॉकटर आईडी (छोटा) कंटेनर में फ़ाइल /mydir/host1.txt में होगा।


2
धन्यवाद, लेकिन यह वही दृष्टिकोण है जो मैं वैसे भी उपयोग कर रहा हूं, और यदि आप docker चलाते हैं, तो -h के साथ hostname सेट करते हैं तो यह टूट जाएगा।
एलेसेंड्रो

@Alessandro I ने doc चलाने के लिए -idfile पैरामीटर के बारे में जानकारी जोड़ी है। यह आपको $ HOSTNAME का उपयोग करने के बजाय कंटेनर में docker id पास करने में मदद कर सकता है।
जिरी

महान! हाँ, कुछ ऐसा है जो मैं इस्तेमाल कर सकता हूँ! धन्यवाद!
एलेसांड्रो

अजीब तरह से, 1.11.2 में ऐसा लगता है envकि यह सूची नहीं है HOSTNAME, लेकिन echo $HOSTNAMEकाम करता है।
जेसी ग्लिक

यह बिल्कुल काम नहीं करता है, और आपका URL टूट गया है और अब गलत प्रलेखन पर पुनर्निर्देशित करता है। requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
सेरिन

24

यह एक कंटेनर के भीतर से पूर्ण कंटेनर आईडी प्राप्त करेगा:

cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'


21

चेतावनी: इस पर विचार करने से पहले आपको इस पद्धति के सुरक्षा जोखिमों को समझना चाहिए । जॉन के जोखिम का सारांश:

कंटेनर को एक्सेस देने के लिए /var/run/docker.sock, यह डॉकटर द्वारा प्रदान की गई रोक से बाहर निकलने और मेजबान मशीन तक पहुंच प्राप्त करने के लिए [तुच्छ रूप से आसान] है। जाहिर है कि यह संभावित खतरनाक है।


कंटेनर के अंदर, dockerId आपका होस्टनाम है। तो, आप कर सकते हैं:

  • होस्ट के समान संस्करण के साथ अपने कंटेनर में docker-io पैकेज स्थापित करें
  • इसके साथ शुरू करो --volume /var/run/docker.sock:/var/run/docker.sock --privileged
  • अंत में, भागो: docker inspect $(hostname)कंटेनर के अंदर

इससे बचें। केवल तभी करें जब आप जोखिमों को समझते हैं और जोखिमों के लिए एक स्पष्ट शमन है।


1
मुझे संदेह है कि यह काम नहीं करेगा अगर docker रन --hostnameविकल्प का उपयोग किया गया है।
हेयरहाइंडरसन

यदि --hostnameसेट किया गया है तो आप इस उत्तर से एक संयोजन का उपयोग कर सकते हैं और स्वीकृत उत्तर में @ टेलर से टिप्पणी: docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)चल रहे कंटेनर के बारे में सभी जानकारी प्राप्त करने के लिए।
माइकल के।

क्या आप docker-io का संदर्भ डाल सकते हैं?
ब्रैड पी।

मैं इसके npmjs.com/package/docker-io को मानता हूं, लेकिन यह वही था जो Google ने मुझे बताया था और शायद इसका मतलब यह नहीं है।
ब्रैड पी।

15

इसे सरल बनाने के लिए,

  1. कंटेनर आईडी docker के अंदर आपका होस्ट नाम है
  2. कंटेनर की जानकारी / proc / self / cgroup के अंदर उपलब्ध है

होस्ट नाम प्राप्त करने के लिए,

hostname

या

uname -n

या

cat /etc/host

आउटपुट को किसी भी फ़ाइल पर रीडायरेक्ट किया जा सकता है और एप्लिकेशन से वापस पढ़ा जा सकता है जैसे: # hostname > /usr/src//hostname.txt


10

मैंने पाया है कि 17.09 में डॉकटर कंटेनर में इसे करने का सबसे सरल तरीका है:

$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3
4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c

या जैसा कि पहले ही बताया जा चुका है, एक छोटा संस्करण

$ cat /etc/hostname
4de1c09d3f19

या केवल:

$ hostname
4de1c09d3f19

6

डॉकर डिफ़ॉल्ट रूप से होस्टनाम को कंटेनर आईडी पर सेट करता है, लेकिन उपयोगकर्ता इसके साथ ओवरराइड कर सकते हैं --hostname। इसके बजाय, निरीक्षण करें /proc:

$ more /proc/self/cgroup
14:name=systemd:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
13:pids:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
12:hugetlb:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
11:net_prio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
10:perf_event:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
9:net_cls:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
8:freezer:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
7:devices:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
6:memory:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
5:blkio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
4:cpuacct:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
3:cpu:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
2:cpuset:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
1:name=openrc:/docker

कंटेनर आईडी निकालने के लिए यहां एक आसान लाइनर है:

$ grep "memory:/" < /proc/self/cgroup | sed 's|.*/||'
7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605

2

आप वर्तमान कंटेनर ID (docker 1.9 के साथ परीक्षण) की पहचान करने के लिए इस कमांड लाइन का उपयोग कर सकते हैं।

awk -F"-|/." '/1:/ {print $3}' /proc/self/cgroup

फिर, डॉकर एपीआई (आप /var/run/docker.sock साझा कर सकते हैं) के लिए एक छोटा सा अनुरोध सभी informations को पुनः प्राप्त करने के लिए।


1
awk -F "- | /।" '/ 1: / {{प्रिंट $ 3}' / proc / self / cgroup
usil

2

के प्रारूप में बदलाव के कारण कुछ पोस्टेड समाधानों ने काम करना बंद कर दिया है /proc/self/cgroup। यहाँ एक एकल GNU grep कमांड है जो प्रारूप परिवर्तनों के लिए थोड़ा और अधिक मजबूत होना चाहिए:

grep -o -P -m1 'docker.*\K[0-9a-f]{64,}' /proc/self/cgroup

संदर्भ के लिए, इस आदेश के साथ परीक्षण किए गए डॉक कंटेनर के अंदर से / proc / self / cgroup के स्निपिट हैं:

लिनक्स 4.4:

11:pids:/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope
...
1:name=systemd:/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope

लिनक्स 4.8 - 4.13:

11:hugetlb:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013
...
1:name=systemd:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013


0

एक तरफ के रूप में, अगर आपके पास कंटेनर की पिड है और उस कंटेनर की डॉक आईडी प्राप्त करना चाहते हैं, तो एक अच्छा तरीका यह है कि ऊपर दिए गए जादू के साथ संयोजन में nsenter का उपयोग करें:

nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"


-19

का उपयोग करें docker inspect

$ docker ps # get conteiner id
$ docker inspect 4abbef615af7
[{
    "ID": "4abbef615af780f24991ccdca946cd50d2422e75f53fb15f578e14167c365989",
    "Created": "2014-01-08T07:13:32.765612597Z",
    "Path": "/bin/bash",
    "Args": [
        "-c",
        "/start web"
    ],
    "Config": {
        "Hostname": "4abbef615af7",
...

निम्नानुसार आईपी प्राप्त कर सकते हैं।

$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 2a5624c52119
172.17.0.24

5
यह मेरा मतलब नहीं है। मुझे कंटेनर के अंदर से यह जानकारी प्राप्त करने में सक्षम होने की आवश्यकता है । क्या मूल रूप से मुझे एक कंटेनर की आईडी को समझने की ज़रूरत है जो मैं अंदर से चला रहा हूं।
एलेसेंड्रो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.