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)
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/"
À 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
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.
Cela obtiendra l'identifiant de conteneur complet à partir d'un conteneur:
cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'
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:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
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.
Pour faire simple,
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
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
Un commentaire de madeddie me semble le plus élégant:
CID=$(basename $(cat /proc/1/cpuset))
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
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.
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
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup
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/"