Docker Linux konteyner bilgilerini konteynerin içinden nasıl alabilirim?


135

docker containersMeta veriler aracılığıyla EC2 bulut sunucuları hakkında bilgi edinebileceğiniz gibi , yapılandırmalarından da haberdar olmak istiyorum .

Kullanabilirim (sağlanan dockerbağlantı noktasında dinlemektir 4243)

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

verilerinin bir kısmını almak için, ancak en azından konteynerin tam kimliğini almanın daha iyi bir yolu olup olmadığını bilmek ister, çünkü HOSTNAMEaslında 12 karaktere kısaltılmıştır ve docker üzerinde "en iyi eşleşme" yapıyor gibi görünüyor.

Ayrıca, docker ana bilgisayarının harici IP'sini nasıl alabilirim (AWS'ye özgü EC2 meta verilerine erişim dışında)


2
DİKKAT: Konteyner içinde /var/run/docker.sock'u kullanmaya çalışan aşağıdaki yaklaşımlardan herhangi birini denemeden önce bu lvh.io/posts/… belgesini okumalısınız
harschware

1
@ Harschware'in bağlantısının kopması durumunda, burada özetleyeceğim: Konteynere erişim izni vererek, /var/run/docker.sockdocker tarafından sağlanan muhafazadan çıkmak ve ana makineye erişim elde etmek (önemsiz) mümkündür. Açıkçası bu potansiyel olarak tehlikelidir.
John

1
Çalıştırma komutuyla birlikte --hostname argümanı kullanılmışsa ve böylece basitçe "hostname" çalıştırıldığında artık size containerid verilmezse, Windows docker konteynerinde aynı bilgileri nasıl elde edeceğini bilen var mı ?
Timothy John Laird

Yanıtlar:


68

Kapsayıcı kimliğinin / proc / self / cgroup içinde bulunabileceğini öğrendim

Böylece kimliği şu şekilde alabilirsiniz:

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

15
Biraz cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
ince

5
Docker 1.6.2 için şunu kullanmalıydım:cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
Jay Taylor

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

24
Seviyorum basename "$(cat /proc/1/cpuset)"vebasename "$(head /proc/1/cgroup)"
madeddie

3
Gelecekte docker'da cgroup ad alanı ve cgroup v2 kullanılırsa, bu yöntem artık çalışmayabilir.
Jing Qiu

69

Geçersiz kılınmadıkça, ana bilgisayar adı Docker 1.12'deki kısa kapsayıcı kimliği gibi görünüyor.

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

haricen

$ 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
Evet, bu, nodejs'deki bilgileri benim için çekmeyi kolaylaştırdı. const os = require('os'); console.log(os.hostname());
pulkitsinghal

2
Java'da Kapsayıcı Kimliği ile eşleşen ana bilgisayar adını almak için kullanın InetAddress.getLocalHost().getHostName().
Nathan

2
Bazen ortam değişkeninin değerini okumak daha kolaydır $HOSTNAME(örneğin, kabuk komut dosyalarında).
Faheel

34

Docker Remote API aracılığıyla unix soketini kullanarak bir konteynerin içinden docker ile iletişim kurabilirsiniz:

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

Bir konteynerde, $HOSTNAMEenv var'ı inceleyerek kısaltılmış bir docker id'sini bulabilirsiniz . Dokümana göre küçük bir çarpışma şansı var, az sayıda konteyner için endişelenmenize gerek yok diye düşünüyorum. Doğrudan tam kimliği nasıl alacağımı bilmiyorum.

Banyan cevabında belirtildiği gibi kabı benzer şekilde inceleyebilirsiniz :

GET /containers/4abbef615af7/json HTTP/1.1

Tepki:

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

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

Alternatif olarak, docker kimliğini bir dosyadaki kapsayıcıya aktarabilirsiniz. Dosya "takılı birim" üzerinde bulunur, bu nedenle kapsayıcıya aktarılır:

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

Docker kimliği (kısaltılmış) kapsayıcıda /mydir/host1.txt dosyasında olacaktır.


2
Teşekkürler ama bu benim kullandığım yaklaşımın aynısı ve docker'ı çalıştırdığınızda ana bilgisayar adını -h ile ayarlarsanız bozulur.
Alessandro

@Alessandro Docker çalıştırmak için -cidfile parametresi hakkında bilgi ekledim. $ HOSTNAME yerine docker kimliğini kapsayıcıya geçirmenize yardımcı olabilir.
Jiri

Harika! Evet bu benim kullanabileceğim bir şey! Teşekkür ederim!
Alessandro

İşin garibi, 1.11.2'de envlistelenmiyor gibi görünüyor HOSTNAMEama echo $HOSTNAMEçalışıyor.
Jesse Glick

Bu hiç çalışmıyor ve URL'niz bozuk ve şimdi yanlış belgelere yönlendiriyor. requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Cerin

24

Bu, bir kapsayıcı içinden tam kapsayıcı kimliğini alacaktır:

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


21

UYARI: Bu yöntemin güvenlik risklerini düşünmeden önce anlamalısınız . John'un risk özeti:

Konteynere erişim izni vererek, /var/run/docker.sockdocker tarafından sağlanan muhafazadan çıkmak ve ana makineye erişim elde etmek [çok kolaydır]. Açıkçası bu potansiyel olarak tehlikelidir.


Konteynırın içinde dockerId, ana bilgisayar adınızdır. Yani şunları yapabilirsiniz:

  • docker-io paketini , ana bilgisayarla aynı sürümle konteynerinize yükleyin
  • ile başla --volume /var/run/docker.sock:/var/run/docker.sock --privileged
  • son olarak, çalıştırın: docker inspect $(hostname)kabın içinde

Bundan kaçının. Bunu yalnızca riskleri anlıyorsanız ve riskler için net bir hafifletmeye sahipseniz yapın.


1
Docker çalıştırma --hostnameseçeneği kullanılmışsa bunun işe yaramayacağından şüpheleniyorum .
hairyhenderson

Eğer --hostnamebu cevap ve kabul yanıtında @Jay Taylor'dan yorumun bir kombinasyonunu kullanabilirsiniz ayarlanır: docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)çalışan kapsayıcı hakkında tüm bilgileri almak için.
Michael K.

docker-io'ya bir referans verebilir misiniz?
Brad P.

Npmjs.com/package/docker-io olduğunu varsayıyorum, ancak Google'ın bana söylediği şey buydu ve belki de kastettiğin bu değildi.
Brad P.

15

Basitleştirmek için,

  1. Container ID, docker'daki ana bilgisayar adınızdır
  2. Konteyner bilgileri / proc / self / cgroup içinde mevcuttur

Ana bilgisayar adını almak için,

hostname

veya

uname -n

veya

cat /etc/host

Çıktı herhangi bir dosyaya yönlendirilebilir ve uygulamadan geri okunabilir. Örn: # hostname > /usr/src//hostname.txt


10

17.09'da docker container'da bunu yapmanın en basit yolu olduğunu buldum:

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

Veya daha önce söylendiği gibi, daha kısa bir versiyon

$ cat /etc/hostname
4de1c09d3f19

Ya da sadece:

$ hostname
4de1c09d3f19

6

Docker, ana bilgisayar adını varsayılan olarak konteyner kimliğine ayarlar, ancak kullanıcılar bunu --hostname. Bunun yerine /procşunları inceleyin :

$ 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

İşte konteyner kimliğini çıkarmak için kullanışlı bir tek satırlık:

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

2

Bu komut satırını mevcut konteyner kimliğini belirlemek için kullanabilirsiniz (docker 1.9 ile test edilmiştir).

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

Ardından, tüm bilgileri almak için Docker API'ye küçük bir istek (/var/run/docker.sock'u paylaşabilirsiniz).


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

2

Biçimindeki değişiklikler nedeniyle yayınlanan bazı çözümler çalışmayı durdurdu /proc/self/cgroup. Burada, biçim değişikliklerine biraz daha sağlam olması gereken tek bir GNU grep komutu verilmiştir:

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

Referans için, bu komutla test edilmiş docker konteynerlerinin içinden / proc / self / cgroup parçacıkları aşağıda verilmiştir:

Linux 4.4:

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

Linux 4.8 - 4.13:

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

1
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup

0

Bir kenara, eğer konteynerin pid'ine sahipseniz ve bu konteynerin docker id'sini almak istiyorsanız, nsenter'ı yukarıdaki sed magic ile birlikte kullanmak iyi bir yoldur:

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


-19

Kullanın 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",
...

Aşağıdaki gibi ip alabilir.

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

5
Demek istediğim bu değil. Bu bilgiyi kabın içinden alabilmem gerekiyor . Temelde içeriden çalıştırdığım bir konteynerin kimliğini anlamak için bir yola ihtiyacım var mı?
Alessandro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.