web-dev-qa-db-fra.com

Docker, comment obtenir des informations sur le conteneur depuis le conteneur?

Je tiens à informer mes docker containers de leur configuration, de la même manière que vous pouvez obtenir des informations sur les instances EC2 au moyen de métadonnées.

Je peux utiliser (à condition que docker écoute sur le port 4243)

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

pour obtenir certaines de ses données, mais aimerait savoir s’il existe au moins une meilleure façon de récupérer l’identifiant complet du conteneur, car HOSTNAME est en fait réduit à 12 caractères et le menu fixe semble effectuer une "meilleure correspondance" " dessus.

De plus, comment puis-je obtenir l'adresse IP externe du docker Host (autre que l'accès aux métadonnées EC2, qui est spécifique à AWS)

105
Alessandro

J'ai découvert que l'ID de conteneur peut être trouvé dans/proc/self/cgroup

Ainsi, vous pouvez obtenir l'identifiant avec:

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

À moins d'être remplacé, le nom d'hôte semble être l'ID de conteneur abrégé dans Docker 1.12.

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

Extérieurement

$ 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

Vous pouvez communiquer avec docker depuis l'intérieur d'un conteneur à l'aide d'un socket UNIX via l'API Docker Remote:

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

Dans un conteneur, vous pouvez trouver un identifiant de menu fixe en examinant $HOSTNAME env var. Selon la doc, il y a un faible risque de collision, je pense que pour un petit nombre de conteneurs, vous n'avez pas à vous en préoccuper. Je ne sais pas comment obtenir un identifiant complet directement.

Vous pouvez inspecter le conteneur de la même manière, comme indiqué dans la réponse Banyan :

GET /containers/4abbef615af7/json HTTP/1.1

Réponse:

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

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

Vous pouvez également transférer l'identifiant de menu fixe dans le conteneur dans un fichier. Le fichier est situé sur "volume monté", il est donc transféré au conteneur:

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

L'identifiant du menu fixe (abrégé) sera dans le fichier/mydir/Host1.txt du conteneur.

32
Jiri

Cela obtiendra l'identifiant de conteneur complet à partir d'un conteneur:

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

AVERTISSEMENT: Vous devez comprendre les risques de sécurité de cette méthode avant de l’envisager. John Résumé du risque:

En donnant au conteneur l'accès à /var/run/docker.sock, il est [trivialement facile] de sortir de l'enceinte fournie par le menu fixe et d'accéder à la machine hôte. Évidemment, cela est potentiellement dangereux.


À l'intérieur du conteneur, le dockerId est votre nom d'hôte. Donc, vous pourriez:

  • installez le paquet docker-io dans votre conteneur avec la même version que l'hôte
  • lancez-le avec --volume /var/run/docker.sock:/var/run/docker.sock --privileged
  • enfin, lancez: docker inspect $(hostname) à l'intérieur du conteneur

Évitez cela. Ne le faites que si vous comprenez les risques et avez une atténuation claire des risques.

18
Omar Marquez

Pour faire simple,

  1. L'ID de conteneur est votre nom d'hôte dans docker
  2. Les informations sur les conteneurs sont disponibles dans/proc/self/cgroup

Pour obtenir le nom d'hôte,

hostname

ou

uname -n

ou

cat /etc/Host

La sortie peut être redirigée vers n’importe quel fichier et relue depuis l’application E.g .: # hostname > /usr/src//hostname.txt

9
Tejas jain

J'ai trouvé qu'en 17.09, il y a un moyen plus simple de le faire dans un conteneur docker:

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

Ou comme on l’a déjà dit, une version plus courte avec

$ cat /etc/hostname
4de1c09d3f19

Ou simplement:

$ hostname
4de1c09d3f19
9
Adrian Antunez

Un commentaire de madeddie me semble le plus élégant:

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

Docker définit le nom d'hôte sur l'ID de conteneur par défaut, mais les utilisateurs peuvent le remplacer par --hostname. Au lieu de cela, inspectez /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

Voici un one-liner pratique pour extraire l'ID de conteneur:

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

Vous pouvez utiliser cette ligne de commande pour identifier l'ID de conteneur actuel (testé avec docker 1.9).

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

Ensuite, une petite requête à l'API Docker (vous pouvez partager /var/run/docker.sock) pour récupérer toutes les informations.

2
Baptiste Donaux

Certaines solutions publiées ont cessé de fonctionner en raison de modifications du format de /proc/self/cgroup. Voici une seule commande GNU grep qui devrait être un peu plus robuste pour les changements de format:

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

Pour référence, voici des extraits de/proc/self/cgroup provenant de conteneurs de menu fixe qui ont été testés avec cette commande:

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

En passant, si vous avez le pid du conteneur et souhaitez obtenir l'identifiant du menu fixe de ce conteneur, vous pouvez utiliser nsenter en combinaison avec la magie sed ci-dessus:

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

0
anbhat