¿Alguna vez has necesitado ver lo que está sucediendo dentro de un contenedor Docker? Los contenedores están destinados a ser idempotentes: si hay un problema, vuelve a implementar un nuevo contenedor. A menudo, la vida no es tan simple. Necesitas ejecutar comandos en el contenedor para identificar el problema. Aquí es donde el comando docker exec
puede ayudar.
Este artículo te enseñará cómo ejecutar comandos en un contenedor Docker en ejecución utilizando el comando docker exec
.
Prerrequisitos
Para seguir los ejemplos en este artículo, deberás cumplir con lo siguiente.
- Cualquier versión reciente de Docker Desktop funcionará en Windows, Linux o macOS. Este tutorial utiliza la v3.1.0 ejecutándose en Windows 10.
Iniciar un contenedor NGINX
docker exec
ejecuta comandos en contenedores. Pero, para hacer eso, primero debes tener un contenedor para ejecutar esos comandos. Comencemos descargando una imagen de Docker y creando un contenedor de demostración.
- Crea un nuevo directorio, este tutorial utiliza C:\gitrepos\test, para contener los archivos utilizados para el contenedor.
2. Crea un archivo, llamado dockerfile (sin extensión), que contenga el siguiente código. El Dockerfile define los pasos necesarios para crear un contenedor.
3. A continuación, crea un archivo en el mismo directorio, llamado index.html, que contenga el siguiente código. Este es un archivo HTML que, cuando se inicia el contenedor, mostrará un mensaje de Hello World.
4. Ahora crea el contenedor Docker de Nginx. Dado que el Dockerfile está en el directorio de trabajo actual, especifica .
para que el motor de Docker sepa buscar allí. Además, asegúrate de etiquetar el contenedor con my-nginx
usando el parámetro t
para facilitar su referencia en el futuro.

5. Ahora que el contenedor está construido, inicia el contenedor con el comando Docker run.

6. Por último, abre tu navegador web y ve a http://localhost/
para ver lo siguiente.

Ejecución de Comandos con Docker Exec
Cuando ejecutas comandos en un contenedor de Docker, es posible que necesites ejecutar un comando de forma interactiva. Ejecutar comandos de manera interactiva implica escribir un comando, recibir comentarios, escribir otro comando, etc. Los comandos interactivos toman el control de tu sesión y te impiden hacer cualquier otra cosa.
Pero, ¿qué pasa si ya conoces los comandos que quieres enviar al contenedor de antemano y deseas ejecutarlos en segundo plano? En ese caso, puedes ejecutar comandos no interactivos. Los comandos no interactivos te permiten enviar un comando a Docker y devolver instantáneamente el control de la consola.
Localizando el Nombre e ID del Contenedor
Ahora que tienes el contenedor construido, puedes ejecutar comandos dentro del contenedor. Antes de ejecutar un comando, localiza el nombre o ID del contenedor NGINX. Tanto el nombre como el ID funcionarán en los comandos de Docker. ¡Dicho esto, recordar el ID puede ser más desafiante que el nombre!
Para mostrar cualquier información del contenedor en ejecución, ejecuta el comando Docker ps
para obtener la siguiente información.

Copia ya sea el ID único, e17e4b6be01a
, o el nombre generado aleatoriamente mystifying_chandrasekhar
en tu portapapeles para usarlo más tarde.
Ejecutando un Comando No Interactivo con Docker Exec
Como ejemplo de ejecutar un comando no interactivo, copia y ejecuta el siguiente comando para obtener una lista de archivos en el directorio /var/log con el comando ls -l
. Pasa todo después del nombre del contenedor, mystifying_chandrasekhar
, al comando exec
de Docker.

Avoidar la salida de la consola con comandos de Docker
Al devolver el control de la terminal al usuario de inmediato, las operaciones grandes evitan bloquear la consola. Omite la salida de la consola con la opción d
para ejecutar en segundo plano. El siguiente comando crea el archivo /tmp/execWorks mediante el comando touch
dentro del contenedor y no muestra ninguna salida en la consola.
Ejecutar comandos interactivos con Docker Exec
Hasta este punto, has aprendido cómo ejecutar comandos no interactivos en un contenedor de Docker con docker exec
. Pero, podrías enfrentarte a situaciones en las que necesitas solucionar problemas con un contenedor, por ejemplo, cuando necesitas emitir comandos de manera interactiva. En ese caso, necesitas ejecutar comandos de forma interactiva.
Ejecutar comandos de forma interactiva con docker exec
requiere dos opciones, i
y t
. La opción i
mantiene abierto STDIN, permitiendo enviar comandos al contenedor, y la opción t
asigna un pseudo-terminal (PTY), un canal de comunicación, para escribir comandos.
Copia y pega el siguiente comando para abrir un símbolo del sistema interactivo en el contenedor de Docker en ejecución con el shell Bourne (sh), como indica el cambio del indicador a / #
.

Una vez en la terminal, ejecuta los comandos siguientes para mostrar la lista de archivos desde el interior del contenedor. Finalmente, ejecuta el comando exit
para salir del shell interactivo.

Para abrir un indicador interactivo en un directorio específico, pasa la ruta a la opción
w
indicando a Docker que inicie la shell en un directorio especificado.
Pasar Variables de Entorno a un Contenedor en Ejecución
Muchos programas utilizan variables de entorno para configurar al inicio. Por ejemplo, la mayoría de las aplicaciones Java requieren que la variable de entorno JAVA_HOME
se configure con la ruta de Java.
Puedes pasar variables de entorno a una sesión utilizando la opción e
. Por ejemplo, quizás necesites agregar una variable de entorno llamada MYVAR
a un contenedor en ejecución. Para hacerlo, utiliza la opción e
y proporciona el par clave/valor de MYVAR="<some value>"
como se muestra a continuación.

Pasar Variables de Entorno con un Archivo
Si tienes muchas variables de entorno o una configuración compartida, puede ser más fácil almacenar esas variables en un archivo. Pasa el archivo a Docker mediante una ruta relativa o absoluta con la opción --env-file
. Esta técnica se utiliza a menudo para proporcionar credenciales seguras a un contenedor. ¡Asegúrate de nunca comprometer credenciales en el control de versiones!
Crea un archivo de texto llamado env-vars.txt
con las variables de entorno y sus valores. Este archivo puede tener el nombre que desees y no necesita la extensión de archivo .txt
.

Pasa las variables de entorno a Docker con la opción env-file
. Verifica que las variables estén disponibles con el comando echo
, como se muestra en la captura de pantalla a continuación.

Interactuando con un Contenedor en Ejecución como un Usuario Diferente
En producción, las aplicaciones a menudo se ejecutan como un usuario específico para restringir su acceso. Si está ejecutando aplicaciones como un usuario específico en producción, también debería hacerlo al probar comandos.
En este ejemplo, el contenedor de Docker se ejecuta como el usuario nginx
. Pase el usuario a la opción w
para indicar a Docker que inicie el contenedor como la cuenta nginx
. El comando whoami
, ejecutado desde dentro del contenedor, confirma que se utiliza el usuario nginx
.

nginx
user.Pasos Siguientes
Ha aprendido cómo ejecutar comandos dentro de un contenedor en ejecución utilizando el comando docker exec
. Utilizando el comando exec
para ingresar e interrogar contenedores en ejecución, tiene una nueva y potente herramienta en su arsenal para solucionar problemas con contenedores Docker.
Ahora intente llevar lo que ha aprendido un paso más allá y use el control de versiones Git para extraer un sitio web estático en el contenedor, en lugar de copiar un solo archivo. Si Git es nuevo para usted, entonces el artículo Una Guía para Principiantes de Visual Studio Code y Git es un excelente lugar para comenzar.