Ich möchte mich 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 am Port 4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
um einige seiner Daten zu erhalten, möchte aber wissen, ob es einen besseren Weg gibt, zumindest die vollständige ID des Containers zu erhalten, da dieser HOSTNAME
tatsächlich auf 12 Zeichen verkürzt ist und Docker eine "beste Übereinstimmung" damit zu erzielen scheint.
Wie kann ich auch die externe IP des Docker-Hosts abrufen (außer auf die für AWS spezifischen EC2-Metadaten zuzugreifen)?
/var/run/docker.sock
ist es möglich (trivial), aus dem vom Docker bereitgestellten Containment auszubrechen und Zugriff auf den Host-Computer zu erhalten. Offensichtlich ist dies möglicherweise gefährlich.Antworten:
Ich habe herausgefunden, dass sich die Container-ID in / proc / self / cgroup befindet
So können Sie die ID erhalten mit:
quelle
cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
basename "$(cat /proc/1/cpuset)"
undbasename "$(head /proc/1/cgroup)"
Sofern nicht überschrieben, scheint der Hostname die kurze Container-ID in Docker 1.12 zu sein
Äußerlich
quelle
const os = require('os'); console.log(os.hostname());
InetAddress.getLocalHost().getHostName()
.$HOSTNAME
(z. B. in Shell-Skripten).Sie können mit Docker aus einem Container heraus über einen Unix-Socket über die Docker Remote-API kommunizieren:
https://docs.docker.com/engine/reference/api/docker_remote_api/
In einem Container können Sie eine kurzgeschlossene Docker-ID ermitteln, indem Sie
$HOSTNAME
env var untersuchen. Laut doc besteht eine geringe Kollisionsgefahr. Ich denke, dass Sie sich bei einer kleinen Anzahl von Containern keine Sorgen machen müssen. Ich weiß nicht, wie ich die vollständige ID direkt erhalten soll.Sie können den Behälter auf ähnliche Weise untersuchen, wie in der Antwort von Banyan beschrieben :
Antwort:
Alternativ können Sie die Docker-ID in einer Datei in den Container übertragen. Die Datei befindet sich auf "gemountetem Volume" und wird in den Container übertragen:
Die Docker-ID (gekürzt) befindet sich in der Datei /mydir/host1.txt im Container.
quelle
env
es in 1.11.2 nicht aufzulistenHOSTNAME
, aber esecho $HOSTNAME
funktioniert.requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Dadurch wird die vollständige Container-ID aus einem Container abgerufen:
quelle
Ein Kommentar von madeddie sieht für mich am elegantesten aus:
quelle
WARNUNG: Sie sollten die Sicherheitsrisiken dieser Methode verstehen , bevor Sie sie in Betracht ziehen. Johns Zusammenfassung des Risikos:
Innerhalb des Containers ist die Docker-ID Ihr Hostname. Sie könnten also:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
docker inspect $(hostname)
im ContainerVermeiden Sie dies. Tun Sie dies nur, wenn Sie die Risiken verstehen und die Risiken klar mindern.
quelle
--hostname
verwendet wurde.--hostname
festgelegt, können Sie eine Kombination aus dieser Antwort und dem Kommentar von @Jay Taylor in der akzeptierten Antwort verwenden:docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)
um alle Informationen über den laufenden Container abzurufen .Um es einfach zu machen,
Um den Hostnamen zu erhalten,
oder
oder
Die Ausgabe kann in eine beliebige Datei umgeleitet und von der Anwendung zurückgelesen werden. ZB:
# hostname > /usr/src//hostname.txt
quelle
Ich habe festgestellt, dass es in 17.09 einen einfachsten Weg gibt, dies innerhalb des Docker-Containers zu tun:
Oder wie schon gesagt wurde, eine kürzere Version mit
Oder einfach:
quelle
Docker setzt den Hostnamen standardmäßig auf die Container-ID, aber Benutzer können dies mit überschreiben
--hostname
. Überprüfen Sie stattdessen/proc
:Hier ist ein praktischer Einzeiler zum Extrahieren der Container-ID:
quelle
Mit dieser Befehlszeile können Sie die aktuelle Container-ID identifizieren (getestet mit Docker 1.9).
Anschließend eine kleine Anfrage an die Docker-API (Sie können /var/run/docker.sock freigeben), um alle Informationen abzurufen.
quelle
Einige veröffentlichte Lösungen funktionieren aufgrund von Änderungen im Format von nicht mehr
/proc/self/cgroup
. Hier ist ein einzelner GNU-grep-Befehl, der gegenüber Formatänderungen etwas robuster sein sollte:Als Referenz finden Sie hier Ausschnitte aus / proc / self / cgroup aus Docker-Containern, die mit diesem Befehl getestet wurden:
Linux 4.4:
Linux 4.8 - 4.13:
quelle
quelle
Abgesehen davon, 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 oben genannten sed magic zu verwenden:
nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
quelle
Verwenden Sie
docker inspect
.Kann IP wie folgt bekommen.
quelle