He notado con Docker que necesito entender qué está sucediendo dentro de un contenedor o qué archivos existen allí. Un ejemplo es la descarga de imágenes desde el índice de docker: no tiene idea de lo que contiene la imagen, por lo que es imposible iniciar la aplicación.
Lo que sería ideal es poder introducirse en ellos o equivalentes. ¿Existe una herramienta para hacer esto o mi conceptualización de Docker es errónea al pensar que debería ser capaz de hacerlo?
linux
docker
filesystems
usuario2668128
fuente
fuente
docker exec <container> bash
. Entonces, solo abres un caparazón dentro del contenedor.docker exec <container> ls <dir path>
ydocker exec <container> cat <file path>
. Para bash, sin embargo, agregue las-it
opciones.docker image save image_name > image.tar
lo indicado en la respuesta de @ Gaurav24.Respuestas:
ACTUALIZAR El
método más fácil: usar docker exec
Docker versión 1.3 o posterior admite el comando
exec
que se comporta de manera similar ansenter
. Este comando puede ejecutar un nuevo proceso en un contenedor que ya se está ejecutando (el contenedor debe tener el proceso PID 1 ejecutándose ya). Puede ejecutar/bin/bash
para explorar el estado del contenedor:ver la documentación de la línea de comandos de Docker
Método alternativo 1
Instantánea
Puede evaluar el sistema de archivos del contenedor de esta manera:
De esta manera, puede evaluar el sistema de archivos del contenedor en ejecución en el momento preciso. El contenedor aún se está ejecutando, no se incluyen cambios futuros.
Más tarde, puede eliminar la instantánea utilizando (¡el sistema de archivos del contenedor en ejecución no se ve afectado!):
Método alternativo 2
ssh
Si necesita acceso continuo, puede instalar sshd en su contenedor y ejecutar el demonio sshd:
De esta manera, puede ejecutar su aplicación usando ssh (conectarse y ejecutar lo que quiera).
ACTUALIZACIÓN: Método alternativo 3
nsenter
Uso
nsenter
, consulte https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/fuente
Option 1
.RUN apk update && apk add bash
(tamaño: ~ 4MB)docker exec -t -i mycontainer /bin/sh
ACTUALIZACIÓN: ¡EXPLORANDO!
Este comando debería permitirle explorar un contenedor acoplable en ejecución :
El equivalente para esto en docker-compose sería:
(web es el nombre del servicio en este caso y tiene tty por defecto).
Una vez que esté adentro, haga:
o cualquier otro comando bash como:
Este comando debería permitirle explorar una imagen acoplable :
una vez dentro hacer:
o cualquier otro comando bash como:
Los
-it
soportes para interactivo ... y tty.Este comando debería permitirle inspeccionar un contenedor o imagen acoplable en ejecución :
docker inspect name-of-container-or-image
Es posible que desee hacer esto y averiguar si hay alguno
bash
osh
allí. Busque el punto de entrada o cmd en el retorno json.ver la documentación de Docker Exec
ver la documentación de Docker-compose exec
ver docker inspeccionar documentación
fuente
docker exec -ti <name> powershell
( fuente )docker exec -ti <name> cmd
funcionó. Y para otros novatos como yo, asegúrese de usar el nombre de instancia del contenedordocker ps
(algo así como 070494393ca5) en lugar del nombre legible que le asignó.En caso de que su contenedor se detenga o no tenga un shell (por ejemplo,
hello-world
mencionado en la guía de instalación o noalpine
traefik
), este es probablemente el único método posible para explorar el sistema de archivos.Puede archivar el sistema de archivos de su contenedor en un archivo tar:
O enumere los archivos:
Tenga en cuenta que, dependiendo de la imagen, puede llevar algo de tiempo y espacio en disco.
fuente
export
ejemplo anterior dio en el clavo:docker export adoring_kowalevski | tar tf -
f -
al final de su comando, las lecturas de tar de la entrada estándar de forma predeterminada. Simplementedocker export adoring_kowalevski | tar t
funciona.tar f
depende de la configuración de uno. Una parte es laTAPE
variable de entorno. Otros son controlados como parte de la construcción. El efecto neto es que uno nunca debe suponer que lee stdin o escribe stdout, sino que siempre lo declara explícitamente.El sistema de archivos del contenedor está en la carpeta de datos de docker, normalmente en / var / lib / docker. Para iniciar e inspeccionar un sistema de archivos de contenedores en ejecución, haga lo siguiente:
Y ahora el directorio de trabajo actual es la raíz del contenedor.
fuente
Antes de la creación de contenedores:
Si desea explorar la estructura de la imagen que se monta dentro del contenedor, puede hacer
Esto le daría la visibilidad de todas las capas de una imagen y su configuración que está presente en los archivos json.
Después de la creación del contenedor:
Para esto ya hay muchas respuestas anteriores. mi forma preferida de hacer esto sería:
fuente
La respuesta más votada funciona para mí cuando el contenedor se inicia realmente, pero cuando no es posible ejecutarlo y, por ejemplo, desea copiar archivos del contenedor, esto me ha salvado antes:
Gracias a docker cp ( enlace ) puede copiar directamente desde el contenedor, ya que era cualquier otra parte de su sistema de archivos. Por ejemplo, recuperar todos los archivos dentro de un contenedor:
Tenga en cuenta que no necesita especificar que desea copiar de forma recursiva.
fuente
En Ubuntu 14.04 con Docker 1.3.1 , encontré el sistema de archivos raíz del contenedor en la máquina host en el siguiente directorio:
Información completa de la versión de Docker:
fuente
devicemapper
directorio). El archivo existe bajo/var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...
. No estoy seguro de cuán portátil / seguro es acceder a los archivos allídirect-lvm
por ejemplo.Intenta usar
Es posible que bash no esté implementado. para eso puedes usar
fuente
Utilizo otro truco sucio que es independiente de aufs / devicemapper.
Miro el comando de que el contenedor se está ejecutando, por ejemplo,
docker ps
y si es un apache ojava
simplemente hago lo siguiente:y voilá estás dentro del contenedor.
Básicamente, puede hacer un CD de raíz en la
/proc/<PID>/root/
carpeta siempre que el proceso ejecute ese proceso. Tenga cuidado con los enlaces simbólicos no tendrá sentido mientras use ese modo.fuente
La respuesta más votada es buena, excepto si su contenedor no es un sistema Linux real.
Muchos contenedores (especialmente los basados en Go) no tienen ningún binario estándar (no
/bin/bash
o/bin/sh
). En ese caso, deberá acceder al archivo de contenedores real directamente:Funciona de maravilla:
Nota: debe ejecutarlo como root.
fuente
En mi caso, no se admitía ningún shell en el contenedor, excepto
sh
. Entonces, esto funcionó como un encantofuente
puedes usar dive para ver el contenido de la imagen de forma interactiva con TUI
https://github.com/wagoodman/dive
fuente
Esto lanzará una sesión bash para la imagen:
docker run --rm -it --entrypoint = / bin / bash
fuente
Para mí, este funciona bien (gracias a los últimos comentarios por señalar el directorio / var / lib / docker / ):
Aquí, 2465790aa2c4 es la ID corta del contenedor en ejecución (como lo muestra docker ps ), seguido de una estrella.
fuente
En las versiones más recientes de Docker, puede ejecutar
docker exec [container_name]
un shell dentro de su contenedorPara obtener una lista de todos los archivos en un contenedor simplemente ejecute
docker exec [container_name] ls
fuente
Para el controlador docker aufs:
El script encontrará el directorio raíz del contenedor (Prueba en docker 1.7.1 y 1.10.3)
fuente
Ninguna de las respuestas existentes aborda el caso de un contenedor que salió (y no se puede reiniciar) y / o no tiene ningún shell instalado (por ejemplo, los que no tienen distribución). Este funciona siempre que tenga acceso de root al host Docker.
Para una inspección manual real, descubra primero las ID de capa:
En la salida, deberías ver algo como
Navegue a esta carpeta (como root) para encontrar el estado visible actual del sistema de archivos del contenedor.
fuente
Esta respuesta ayudará a aquellos (como yo) que quieran explorar el sistema de archivos de volumen de Docker incluso si el contenedor no se está ejecutando.
Lista de contenedores de Docker en ejecución:
docker ps
=> ID DEL CONTENEDOR "4c721f1985bd"
Mire los puntos de montaje de volumen de Docker en su máquina física local ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
Esto me dice que el directorio de la máquina física local / tmp / container-garren está asignado al destino del volumen del acoplador / tmp.
Conocer el directorio de la máquina física local (/ tmp / container-garren) significa que puedo explorar el sistema de archivos si el contenedor docker se está ejecutando o no. Esto fue fundamental para ayudarme a descubrir que había algunos datos residuales que no deberían haber persistido incluso después de que el contenedor no se estaba ejecutando.
fuente
Otro truco es utilizar la herramienta atómica para hacer algo como:
La imagen de Docker se montará en / path / to / mnt para que pueda inspeccionarla.
fuente
Solo para LINUX
La forma más simple que utilicé fue usar el directorio de proceso, que es el contenedor que se debe ejecutar para inspeccionar los archivos del contenedor de Docker.
Descubra la identificación del proceso (PID) del contenedor y almacénelo en alguna variable
Asegúrese de que el proceso del contenedor se esté ejecutando y use el nombre de la variable para ingresar a la carpeta del contenedor
Si desea pasar por el directorio sin encontrar el número PID simplemente usando este comando largo
Consejos:
Una vez que ingrese al contenedor, todo lo que haga afectará el proceso real del contenedor, como detener el servicio o cambiar el número de puerto.
Espero eso ayude
Nota:
Este método solo funciona si el contenedor aún se está ejecutando, de lo contrario el directorio ya no existiría si el contenedor se hubiera detenido o eliminado
fuente
Mi forma preferida de entender lo que sucede dentro del contenedor es:
exponer -p 8000
Iniciar servidor dentro de él
fuente
Para un contenedor que ya se está ejecutando, puede hacer:
Debes ser root para ingresar en ese directorio. Si no es root, intente 'sudo su' antes de ejecutar el comando.
Editar: Siguiendo v1.3, vea la respuesta de Jiri: es mejor.
fuente
Si está utilizando Docker v19.03, siga los pasos a continuación.
fuente
Si está utilizando el controlador de almacenamiento AUFS, puede usar mi script de capa acoplable para encontrar la raíz del sistema de archivos de cualquier contenedor (mnt) y la capa readwrite:
Editar 2018-03-28:
docker-layer ha sido reemplazado por docker-backup
fuente
El
docker exec
comando para ejecutar un comando en un contenedor en ejecución puede ayudar en múltiples casos.Por ejemplo :
1) Acceder en bash al sistema de archivos del contenedor en ejecución:
2) Acceder en bash al sistema de archivos del contenedor en ejecución como root para poder tener los derechos requeridos:
Esto es particularmente útil para poder hacer algo de procesamiento como root en un contenedor.
3) Acceder en bash al sistema de archivos del contenedor en ejecución con un directorio de trabajo específico:
fuente
Puede ejecutar un bash dentro del contenedor con esto:
$ docker run -it ubuntu /bin/bash
fuente