¿Cómo puedo entrar en el shell de un contenedor Docker?

Estoy empezando a trabajar con Docker. Estoy usando la imagen base de WordPress y docker-compose.

Estoy tratando de entrar en uno de los contenedores para inspeccionar los archivos/directorios que se crearon durante la construcción inicial. Intenté ejecutar docker-compose run containername ls -la, pero no hizo nada. Aunque lo hiciera, preferiría tener una consola en la que pudiera recorrer la estructura de directorios, en lugar de ejecutar un único comando. ¿Cuál es la forma correcta de hacer esto con Docker?

Solución

docker attach te permitirá conectarte a tu contenedor Docker, pero esto no es realmente lo mismo que ssh. Si tu contenedor está ejecutando un servidor web, por ejemplo, docker attach probablemente te conectará al stdout del proceso del servidor web. No necesariamente te dará un shell.

El comando docker exec es probablemente lo que estás buscando; esto te permitirá ejecutar comandos arbitrarios dentro de un contenedor existente. Por ejemplo:

docker exec -it  bash

Por supuesto, cualquier comando que estés ejecutando debe existir en el sistema de archivos del contenedor.

En el comando anterior `es el nombre o ID del contenedor de destino. No importa si estás usandodocker composeo no; simplemente ejecutadocker ps` y usa el ID (una cadena hexadecimal mostrada en la primera columna) o el nombre (mostrado en la última columna). Por ejemplo, dado:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

puedo ejecutar:

$ docker exec -it web ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

Podría lograr lo mismo ejecutando

$ docker exec -it d2d4a89aaee9 ip addr

Del mismo modo, podría iniciar un shell en el contenedor;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
Comentarios (8)

docker exec será sin duda una solución. Una forma fácil de trabajar con la pregunta que has hecho es montar el directorio dentro de Docker al directorio del sistema local.

Así podrás ver los cambios en la ruta local al instante.


docker run -v /Users/<path>:/
Comentarios (2)

Otra opción es utilizar nsenter.

PID=$(docker inspect --format {{.State.Pid}} )
nsenter --target $PID --mount --uts --ipc --net --pid
Comentarios (4)