আমি কীভাবে ধারকটির মধ্যে থেকেই ডকার লিনাক্স কনটেইনার তথ্য পেতে পারি?


135

আমি docker containersতাদের কনফিগারেশন সম্পর্কে আমার সচেতন করে তুলতে চাই , একইভাবে আপনি মেটাডাটার মাধ্যমে ইসি 2 উদাহরণগুলির তথ্য পেতে পারেন।

আমি ব্যবহার করতে পারি (সরবরাহ dockerকরা বন্দরে শোনা যাচ্ছে 4243)

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

এর কিছু ডেটা পেতে, তবে কমপক্ষে কনটেইনারটির পূর্ণ আইডি পাওয়ার আরও ভাল কোনও উপায় আছে কিনা তা জানতে চাই কারণ HOSTNAMEবাস্তবে এটি ছোট করে দেওয়া হয়েছে 12 টি অক্ষর এবং ডকার তার উপর একটি "সেরা ম্যাচ" সম্পাদন করে বলে মনে হচ্ছে।

এছাড়াও, আমি কীভাবে ডকার হোস্টের বহিরাগত আইপি পেতে পারি (এডব্লিউএসের সাথে নির্দিষ্ট EC2 মেটাডেটা অ্যাক্সেস করা ব্যতীত)


2
সাবধানতা: ধারকটির ভিতরে /var/run/docker.sock ব্যবহার করার চেষ্টা করার নীচের যে কোনও পদ্ধতির চেষ্টা করার আগে আপনার এই lvh.io/posts/… পড়তে হবে
হার্শওয়্যার

1
@ হার্শওয়ারের লিঙ্কটি ব্রেক হওয়ার ক্ষেত্রে, আমি এখানে সংক্ষিপ্ত করে বলব: ধারকটিকে অ্যাক্সেস দেওয়ার মাধ্যমে, ডকারের সরবরাহিত কনটেন্টটি ভেঙে /var/run/docker.sockহোস্ট মেশিনে অ্যাক্সেস অর্জন করা (তুচ্ছ) সম্ভব। স্পষ্টতই এটি সম্ভাব্য বিপজ্জনক।
জন

1
কেউ যদি জানেন যে উইন্ডোজ ডকার পাত্রে একই তথ্য কীভাবে পাওয়া যায় - - হোস্টনেম আর্গুমেন্ট যদি রান কমান্ডের সাথে ব্যবহার করা হত যাতে কেবল 'হোস্টনেম' চালানো আপনাকে আর ধারক না দেয়?
টিমোথি জন লেয়ার্ড

উত্তর:


68

আমি জানতে পেরেছি যে ধারক আইডি / প্রো / স্ব / সিগ্রুপে পাওয়া যাবে

সুতরাং আপনি এই আইডিটি পেতে পারেন:

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

15
এটি একটি সামান্য টুইট করতে হয়েছিল, এটি ডকার 1.4.1 এ আমার জন্য কাজ করে 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
cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
Aaaaand

24
আমি এক মত basename "$(cat /proc/1/cpuset)"এবংbasename "$(head /proc/1/cgroup)"
ম্যাডেডি

3
ভবিষ্যতে, সিগ্রুপ নেমস্পেস এবং সিগ্রুপ ভি 2 যদি ডকারে ব্যবহার করা হয় তবে এই পদ্ধতিটি আর কাজ করতে পারে না।
জিং কিউউ

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
ধন্যবাদ তবে এটি একই পদ্ধতির আমি যাইহোক ব্যবহার করছি, এবং আপনি ডকার চালানোর সময় হোস্ট-নেমটি সেট করলে আপনি ভেঙে যাবেন।
আলেসান্দ্রো

@ আলেসান্দ্রো আমি ডকার চালাতে সিডফাইল প্যারামিটার সম্পর্কে তথ্য যুক্ত করেছি। এটি আপনাকে ock HOSTNAME ব্যবহারের পরিবর্তে ধারকটিতে ডকার আইডি পাস করতে সহায়তা করতে পারে।
জিরি

গ্রেট! হ্যাঁ এটি আমি ব্যবহার করতে পারে এমন কিছু! ধন্যবাদ!
আলেসান্দ্রো

অদ্ভুতভাবে, 1.11.2 এ মনে হচ্ছে এটি envতালিকাভুক্ত নয় HOSTNAME, তবে echo $HOSTNAMEকাজ করে।
জেসি গ্লিক

এটি মোটেও কাজ করে না এবং আপনার ইউআরএলটি ভেঙে গেছে এবং এখন ভুল ডকুমেন্টেশনে পুনর্নির্দেশ করে। 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, ডকারের সরবরাহ করা কনটেন্টটি ভেঙে এবং হোস্ট মেশিনে অ্যাক্সেস অর্জন করা [তুচ্ছভাবে সহজ] is স্পষ্টতই এটি সম্ভাব্য বিপজ্জনক।


ধারকটির ভিতরে, ডকারআইডিটি আপনার হোস্ট-নেম। সুতরাং, আপনি করতে পারেন:

  • হোস্টের মতো একই সংস্করণ সহ আপনার ধারকটিতে ডকার-আইও প্যাকেজ ইনস্টল করুন
  • এটি দিয়ে শুরু --volume /var/run/docker.sock:/var/run/docker.sock --privileged
  • অবশেষে, চালান: docker inspect $(hostname)ধারক ভিতরে

এড়িয়ে চলুন। আপনি যদি ঝুঁকিগুলি বোঝেন এবং ঝুঁকিগুলির জন্য একটি স্পষ্ট প্রশমন পেতে থাকেন তবেই এটি করুন।


1
আমি সন্দেহ করি যে ডকার রান --hostnameবিকল্পটি ব্যবহার করা হলে এটি কাজ করবে না ।
হেয়ারহেন্ডারসন

যদি --hostnameসেট করা থাকে তবে আপনি এই উত্তরটি থেকে সম্মতিটি এবং গ্রহণযোগ্য উত্তরে @ জা টেলরের মন্তব্য: docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)চলমান ধারক সম্পর্কে সমস্ত তথ্য পেতে পারেন।
মাইকেল কে।

আপনি কি ডকার-আইও-তে একটি রেফারেন্স রাখতে পারেন?
ব্র্যাড পি।

আমি ধরে নিলাম এর এনপিজেজেড / প্যাকেজ / ডকার-io কিন্তু গুগল আমাকে যা বলেছিল ঠিক এটি ছিল এবং সম্ভবত আপনি কী বোঝাতে চেয়েছিলেন তা নয়।
ব্র্যাড পি।

15

এটিকে সহজ করতে,

  1. কনটেইনার আইডি হ'ল ডকের ভিতরে থাকা আপনার হোস্টের নাম
  2. কনটেইনার তথ্য / proc / স্ব / সিগ্রুপের ভিতরে উপলব্ধ

হোস্টের নাম পেতে,

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

আপনি বর্তমান কন্টেইনার আইডি সনাক্ত করতে এই কমান্ড লাইনটি ব্যবহার করতে পারেন (ডকার 1.9 দিয়ে পরীক্ষিত)।

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

তারপরে, সমস্ত তথ্য পুনরুদ্ধার করতে ডকার এপিআই (আপনি /var/run/docker.sock ভাগ করে নিতে পারেন) এর জন্য একটি অনুরোধ।


1
awk -F "- | /।" '/ 1: / {মুদ্রণ $ 3}' / প্রচার / স্ব /
সিগ্রুপ

2

কিছু পোস্ট সমাধান সমাধানের ফর্ম্যাটের পরিবর্তনের কারণে কাজ বন্ধ করে দিয়েছে /proc/self/cgroup। এখানে একটি একক GNU গ্রেপ কমান্ড যা পরিবর্তনগুলি ফর্ম্যাট করতে কিছুটা বেশি দৃust় হওয়া উচিত:

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

রেফারেন্সের জন্য, এই কমান্ডটি দিয়ে পরীক্ষা করা হয়েছে এমন ডকারের পাত্রে অভ্যন্তর থেকে / proc / স্ব / সিগ্রুপের স্নিপিটগুলি রয়েছে:

লিনাক্স ৪.৪:

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 -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
এটি আমি যা বোঝাতে চাইছি তা নয়। আমার ধারকটির ভিতরে থেকে এই তথ্যটি পেতে সক্ষম হতে হবে । মূলত আমি ভিতরে থেকে চালাচ্ছি এমন একটি ধারকটির আইডি বোঝার জন্য আমার একটি উপায় প্রয়োজন।
আলেসান্দ্রো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.