Docker, ¿cómo obtener información del contenedor desde el interior del contenedor?


Me gustaría hacer que mi docker containers sea consciente de su configuración, de la misma manera que puede obtener información sobre las instancias EC2 a través de metadatos.

Puedo usar (siempre que docker esté escuchando en el puerto 4243)

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

Para obtener algunos de sus datos, pero me gustaría saber si hay una mejor manera al menos de obtener el ID completo del contenedor, porque HOSTNAME en realidad se acorta a 12 caracteres y docker parece realizar una "mejor coincidencia" en él.

También, ¿cómo puedo obtener la IP externa del host de docker (distinto del acceso a los metadatos EC2, que es específico de AWS)

 87
Author: Alessandro, 2014-01-08

13 answers

He descubierto que el id del contenedor se puede encontrar en /proc/self/cgroup

Así que puedes obtener el id con:

cat /proc/self/cgroup | grep -o  -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
 59
Author: Thomas A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-08 17:14:21

Puede comunicarse con docker desde el interior de un contenedor utilizando un socket unix a través de Docker Remote API:

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

En un contenedor, puede encontrar un id de docker acortado examinando $HOSTNAME env var. Según doc, hay una pequeña posibilidad de colisión, creo que para un pequeño número de contenedores, no tiene que preocuparse por ello. No se como conseguir una identificación completa directamente.

Puede inspeccionar contenedor de manera similar como se describe en banyan respuesta:

GET /containers/4abbef615af7/json HTTP/1.1

Respuesta:

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

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

Alternativamente, puede transferir docker id al contenedor en un archivo. El archivo se encuentra en el "volumen montado" por lo que se transfiere al contenedor:

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

El id de docker (abreviado) estará en file /mydir/host1.txt en el contenedor.

 33
Author: Jiri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-23 12:19:54

A menos que se anule, el nombre de host parece ser el id de contenedor corto en Docker 1.12

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

Externamente

$ 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
 33
Author: ardochhigh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-09 03:42:36

Esto obtendrá el id de contenedor completo dentro de un contenedor:

cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'
 18
Author: Prisoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 16:57:40

ADVERTENCIA: Debe comprender los riesgos de seguridad de este método antes de considerarlo. El resumen del riesgo de John :

Al dar acceso al contenedor a /var/run/docker.sock, es [trivialmente fácil] salir de la contención proporcionada por docker y obtener acceso a la máquina host. Obviamente esto es potencialmente peligroso.


Dentro del contenedor, el dockerId es su nombre de host. Por lo tanto, usted podría:

  • instale el paquete docker-io en su contenedor con la misma versión que el host
  • comience con --volume /var/run/docker.sock:/var/run/docker.sock --privileged
  • finalmente, ejecute: docker inspect $(hostname) dentro del contenedor

Evita esto. Solo hágalo si comprende los riesgos y tiene una clara mitigación de los riesgos.

 18
Author: Omar Marquez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-31 07:27:42

He encontrado que en 17.09 hay una forma más sencilla de hacerlo dentro del contenedor docker:

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

O como ya se ha dicho, una versión más corta con

$ cat /etc/hostname
4de1c09d3f19

O simplemente:

$ hostname
4de1c09d3f19
 6
Author: Adrian Antunez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-05 13:30:33

Para hacerlo simple,

  1. El ID del contenedor es su nombre de host dentro de docker
  2. La información del contenedor está disponible dentro de/proc/self / cgroup

Para obtener el nombre de host,

hostname

O

uname -n

O

cat /etc/host

La salida se puede redirigir a cualquier archivo y leer de nuevo desde la aplicación E. g.: # hostname > /usr/src//hostname.txt

 5
Author: Tejas jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-13 20:10:03

Docker establece el nombre de host en el ID del contenedor de forma predeterminada, pero los usuarios pueden sobrescribirlo con --hostname. En su lugar, inspeccione /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

Aquí hay un práctico one-liner para extraer el ID del contenedor:

$ grep "memory:/" < /proc/self/cgroup | sed 's|.*/||'
7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
 5
Author: Wilfred Hughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-21 16:51:56

Puede usar esta línea de comandos para identificar el ID del contenedor actual (probado con docker 1.9).

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

Luego, una pequeña petición a la API de Docker (puede compartir /var/run/docker.sock) para recuperar toda la información.

 2
Author: Baptiste Donaux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-18 10:18:34

Algunas soluciones publicadas han dejado de funcionar debido a cambios en el formato de /proc/self/cgroup. Aquí hay un solo comando grep de GNU que debería ser un poco más robusto para formatear los cambios:

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

Como referencia, aquí hay fragmentos de / proc / self / cgroup de los contenedores docker que se han probado con este comando:

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
Author: kanaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-29 16:15:46
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup
 0
Author: Andrew Wolfe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-08 13:59:49

Como un aparte, si tiene el pid del contenedor y desea obtener el id de docker de ese contenedor, una buena manera es usar nsenter en combinación con la magia de sed anterior:

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

 0
Author: anbhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 14:27:39

Use docker inspect.

$ docker ps # get conteiner id
$ docker inspect 4abbef615af7
[{
    "ID": "4abbef615af780f24991ccdca946cd50d2422e75f53fb15f578e14167c365989",
    "Created": "2014-01-08T07:13:32.765612597Z",
    "Path": "/bin/bash",
    "Args": [
        "-c",
        "/start web"
    ],
    "Config": {
        "Hostname": "4abbef615af7",
...

Puede obtener ip de la siguiente manera.

$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 2a5624c52119
172.17.0.24
 -17
Author: banyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-08 13:47:14