Je voudrais me rendre docker containers
compte de leur configuration, de la même manière que vous pouvez obtenir des informations sur les instances EC2 via des métadonnées.
Je peux utiliser (à condition d' docker
écouter 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 un meilleur moyen au moins d'obtenir l'ID complet du conteneur, car il HOSTNAME
est en fait raccourci à 12 caractères et le docker semble effectuer une "meilleure correspondance" dessus.
En outre, comment puis-je obtenir l'adresse IP externe de l'hôte docker (autre que d'accéder aux métadonnées EC2, qui sont spécifiques à AWS)
/var/run/docker.sock
, il est possible (trivial) de sortir du confinement fourni par docker et d'accéder à la machine hôte. C'est évidemment potentiellement dangereux.Réponses:
J'ai découvert que l'identifiant du conteneur se trouve dans / proc / self / cgroup
Vous pouvez donc obtenir l'identifiant avec:
la source
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)"
etbasename "$(head /proc/1/cgroup)"
À moins d'être remplacé, le nom d'hôte semble être l'ID de conteneur court dans Docker 1.12
Extérieurement
la source
const os = require('os'); console.log(os.hostname());
InetAddress.getLocalHost().getHostName()
.$HOSTNAME
(par exemple dans les scripts shell).Vous pouvez communiquer avec docker depuis l'intérieur d'un conteneur en utilisant 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 docker raccourci en examinant
$HOSTNAME
env var. Selon la doc, il y a un petit risque de collision, je pense que pour un petit nombre de conteneur, vous n'avez pas à vous en soucier. Je ne sais pas comment obtenir directement une identité complète.Vous pouvez inspecter le conteneur de la même manière que celle décrite dans la réponse de banian :
Réponse:
Vous pouvez également transférer l'identifiant du docker vers le conteneur dans un fichier. Le fichier est situé sur le "volume monté", il est donc transféré vers le conteneur:
L'identifiant du docker (raccourci) sera dans le fichier /mydir/host1.txt dans le conteneur.
la source
env
ne pas listerHOSTNAME
, maisecho $HOSTNAME
fonctionne.requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Cela obtiendra l'ID de conteneur complet à partir d'un conteneur:
la source
Un commentaire de madeddie me semble le plus élégant:
la source
AVERTISSEMENT: vous devez comprendre les risques de sécurité de cette méthode avant de la considérer. Résumé du risque de John :
À 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 disposez d'une atténuation claire des risques.
la source
--hostname
option d' exécution du docker a été utilisée.--hostname
est défini, vous pouvez utiliser une combinaison de cette réponse et du commentaire de @Jay Taylor dans la réponse acceptée:docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)
pour obtenir toutes les informations sur le conteneur en cours d'exécution.Pour faire simple,
Pour obtenir le nom d'hôte,
ou
ou
La sortie peut être redirigée vers n'importe quel fichier et relue à partir de l'application Par exemple:
# hostname > /usr/src//hostname.txt
la source
J'ai trouvé que dans la version 17.09, il existe un moyen le plus simple de le faire dans le conteneur Docker:
Ou comme il a déjà été dit, une version plus courte avec
Ou simplement:
la source
Docker définit le nom d'hôte sur l'ID de conteneur par défaut, mais les utilisateurs peuvent remplacer cela avec
--hostname
. À la place, inspectez/proc
:Voici un one-liner pratique pour extraire l'ID du conteneur:
la source
Vous pouvez utiliser cette ligne de commande pour identifier l'ID de conteneur actuel (testé avec docker 1.9).
Ensuite, une petite requête à l'API Docker (vous pouvez partager /var/run/docker.sock) pour récupérer toutes les informations.
la source
Certaines solutions publiées ont cessé de fonctionner en raison de changements dans le format de
/proc/self/cgroup
. Voici une seule commande GNU grep qui devrait être un peu plus robuste aux changements de format:Pour référence, voici des extraits de / proc / self / cgroup à l'intérieur de conteneurs de docker qui ont été testés avec cette commande:
Linux 4.4:
Linux 4.8 - 4.13:
la source
la source
En passant, si vous avez le pid du conteneur et que vous souhaitez obtenir l'identifiant du docker de ce conteneur, un bon moyen est d'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/"
la source
Utilisez
docker inspect
.Peut obtenir ip comme suit.
la source