Me gustaría informarme docker containers
de su configuración, de la misma manera que puede obtener información sobre instancias de 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 de obtener al menos la identificación completa del contenedor, porque en HOSTNAME
realidad se acorta a 12 caracteres y la ventana acoplable parece realizar una "mejor coincidencia".
Además, ¿cómo puedo obtener la IP externa del host del acoplador (aparte de acceder a los metadatos EC2, que es específico de AWS)
/var/run/docker.sock
, es posible (trivial) salir de la contención proporcionada por la ventana acoplable y obtener acceso a la máquina host. Obviamente esto es potencialmente peligroso.Respuestas:
Descubrí que la identificación del contenedor se puede encontrar en / proc / self / cgroup
Para que pueda obtener la identificación con:
fuente
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)"
ybasename "$(head /proc/1/cgroup)"
A menos que se anule, el nombre de host parece ser el ID de contenedor corto en Docker 1.12
Externamente
fuente
const os = require('os'); console.log(os.hostname());
InetAddress.getLocalHost().getHostName()
.$HOSTNAME
(por ejemplo, en los scripts de shell).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 una ID de acoplador acortada examinando
$HOSTNAME
env var. Según el documento, hay una pequeña posibilidad de colisión, creo que para un pequeño número de contenedores, no tiene que preocuparse por eso. No sé cómo obtener la identificación completa directamente.Puede inspeccionar el contenedor de manera similar a la descrita en la respuesta de Banyan :
Respuesta:
Alternativamente, puede transferir la ID de Docker al contenedor en un archivo. El archivo se encuentra en el "volumen montado", por lo que se transfiere al contenedor:
La identificación del acoplador (acortada) estará en el archivo /mydir/host1.txt en el contenedor.
fuente
env
que no apareceHOSTNAME
, peroecho $HOSTNAME
funciona.requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Esto obtendrá la identificación del contenedor completo desde dentro de un contenedor:
fuente
Un comentario de madeddie me parece más elegante:
fuente
ADVERTENCIA: Debe comprender los riesgos de seguridad de este método antes de considerarlo. Resumen del riesgo de John :
Dentro del contenedor, el dockerId es su nombre de host. Entonces, podrías:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
docker inspect $(hostname)
dentro del contenedorEvita esto. Solo hágalo si comprende los riesgos y tiene una mitigación clara para los riesgos.
fuente
--hostname
se ha utilizado la opción de ejecución de Docker .--hostname
está configurado, puede usar una combinación de esta respuesta y el comentario de @Jay Taylor en la respuesta aceptada:docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)
para obtener toda la información sobre el contenedor en ejecución.Para hacerlo simple,
Para obtener el nombre de host,
o
o
La salida se puede redirigir a cualquier archivo y volver a leer desde la aplicación, por ejemplo:
# hostname > /usr/src//hostname.txt
fuente
Descubrí que en 17.09 hay una forma más sencilla de hacerlo dentro del contenedor acoplable:
O como ya se ha dicho, una versión más corta con
O simplemente:
fuente
Docker establece el nombre de host en la ID del contenedor de forma predeterminada, pero los usuarios pueden anular esto con
--hostname
. En cambio, inspeccione/proc
:Aquí hay un práctico one-liner para extraer la ID del contenedor:
fuente
Puede usar esta línea de comando para identificar la ID del contenedor actual (probado con Docker 1.9).
Luego, una pequeña solicitud a Docker API (puede compartir /var/run/docker.sock) para recuperar toda la información.
fuente
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:Como referencia, aquí hay fragmentos de / proc / self / cgroup desde dentro de los contenedores acoplables que se han probado con este comando:
Linux 4.4:
Linux 4.8 - 4.13:
fuente
fuente
Por otro lado, si tiene el pid del contenedor y desea obtener la identificación del acoplador de ese contenedor, una buena manera es usar nsenter en combinación con la magia sed anterior:
nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
fuente
Uso
docker inspect
.Puede obtener ip de la siguiente manera.
fuente