it-swarm.com.de

Docker, wie bekomme ich Containerinformationen aus dem Container?

Ich möchte meinen docker containers Auf ihre Konfiguration aufmerksam machen, genauso wie Sie Informationen über EC2-Instanzen über Metadaten erhalten können.

Ich kann verwenden (vorausgesetzt, docker lauscht auf Port 4243)

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

um einige seiner Daten zu erhalten, aber würde gerne wissen, ob es einen besseren Weg gibt, zumindest die vollständige ID des Containers zu erhalten, da HOSTNAME tatsächlich auf 12 Zeichen verkürzt ist und Docker eine "Bestleistung" zu erbringen scheint Spiel "drauf.

Wie kann ich auch die externe IP des Docker-Hosts abrufen (außer auf die EC2-Metadaten zuzugreifen, die für AWS spezifisch sind)?

105
Alessandro

Ich habe herausgefunden, dass die Container-ID in/proc/self/cgroup zu finden ist

So können Sie die ID erhalten mit:

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

Sofern nicht überschrieben, scheint der Hostname die kurze Container-ID in Docker 1.12 zu sein

[email protected]:/project# cat /etc/hostname
d2258e6dec11

Äußerlich

$ 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
49
ardochhigh

Sie können über die Docker Remote-API mit Docker innerhalb eines Containers über einen Unix-Socket kommunizieren:

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

In einem Container können Sie eine verkürzte Docker-ID herausfinden, indem Sie $HOSTNAME env var. Laut doc gibt es eine geringe Kollisionsgefahr, ich denke, dass man sich für eine geringe Anzahl von Containern keine Sorgen machen muss. Ich weiß nicht, wie ich direkt zum vollständigen Ausweis kommen soll.

Sie können den Container auf ähnliche Weise wie in der Antwort Banyan beschrieben untersuchen:

GET /containers/4abbef615af7/json HTTP/1.1

Antwort:

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

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

Alternativ können Sie die Docker-ID in einer Datei in den Container übertragen. Die Datei befindet sich auf dem "gemounteten Volume" und wird in den Container übertragen:

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

Die Docker-ID (gekürzt) befindet sich in der Datei /mydir/Host1.txt im Container.

32
Jiri

Dadurch wird die vollständige Container-ID aus einem Container abgerufen:

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

WARNUNG: Sie sollten die Sicherheitsrisiken dieser Methode verstehen, bevor Sie darüber nachdenken. John s Zusammenfassung des Risikos:

Indem Sie dem Container Zugriff auf /var/run/docker.sock Gewähren, ist es [trivial einfach], aus dem vom Docker bereitgestellten Containment auszubrechen und Zugriff auf den Hostcomputer zu erhalten. Offensichtlich ist dies möglicherweise gefährlich.


In dem Container ist die Docker-ID Ihr Hostname. Sie könnten also:

  • installieren Sie das Docker-io-Paket in Ihrem Container mit der gleichen Version wie der Host
  • starte es mit --volume /var/run/docker.sock:/var/run/docker.sock --privileged
  • führen Sie schließlich Folgendes aus: docker inspect $(hostname) im Container

Vermeiden Sie dies. Tun Sie es nur, wenn Sie die Risiken verstehen und eine klare Risikominderung haben.

18
Omar Marquez

Um es einfach zu machen,

  1. Die Container-ID ist Ihr Hostname im Docker
  2. Containerinformationen sind in/proc/self/cgroup verfügbar

Um den Hostnamen zu erhalten,

hostname

oder

uname -n

oder

cat /etc/Host

Die Ausgabe kann in eine beliebige Datei umgeleitet und von der Anwendung zurückgelesen werden. Beispiel: # hostname > /usr/src//hostname.txt

9
Tejas jain

Ich habe festgestellt, dass es in 17.09 eine einfachste Möglichkeit gibt, dies im Docker-Container zu tun:

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

Oder wie es schon gesagt wurde, eine kürzere Version mit

$ cat /etc/hostname
4de1c09d3f19

Oder einfach:

$ hostname
4de1c09d3f19
9
Adrian Antunez

Ein Kommentar von madeddie sieht für mich am elegantesten aus:

CID=$(basename $(cat /proc/1/cpuset))
8
sirex

Docker setzt den Hostnamen standardmäßig auf die Container-ID. Benutzer können dies jedoch mit --hostname Überschreiben. Überprüfen Sie stattdessen /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

Hier ist ein praktischer Einzeiler zum Extrahieren der Container-ID:

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

Mit dieser Befehlszeile können Sie die aktuelle Container-ID identifizieren (getestet mit Docker 1.9).

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

Dann eine kleine Anfrage an die Docker-API (Sie können /var/run/docker.sock freigeben), um alle Informationen abzurufen.

2
Baptiste Donaux

Einige veröffentlichte Lösungen funktionieren aufgrund von Änderungen im Format /proc/self/cgroup Nicht mehr. Hier ist ein einzelner GNU grep Befehl, der etwas robuster sein sollte, um Änderungen zu formatieren:

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

Als Referenz sind hier Ausschnitte von/proc/self/cgroup aus Docker-Containern, die mit diesem Befehl getestet wurden:

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
kanaka
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup
1
Andrew Wolfe

Nebenbei bemerkt, wenn Sie die PID des Containers haben und die Docker-ID dieses Containers erhalten möchten, ist es eine gute Möglichkeit, nsenter in Kombination mit der obigen sed-Magie zu verwenden:

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

0
anbhat