¿Alguna vez ha necesitado ver lo que sucede dentro de un contenedor Docker? Los contenedores están destinados a ser idempotentes:si hay un problema, vuelva a implementar un nuevo contenedor. A menudo, la vida no es tan simple. Debe ejecutar comandos en el contenedor para identificar el problema. Aquí es donde docker exec
comando puede ayudar.
Este artículo le enseñará cómo ejecutar comandos en un contenedor Docker en ejecución usando docker exec
comando.
Requisitos
Para seguir los ejemplos de este artículo, deberá cumplir con lo siguiente.
- Cualquier versión reciente de Docker Desktop funcionará en Windows, Linux o macOS. Este tutorial utiliza la versión 3.1.0 que se ejecuta en Windows 10.
Inicio de un contenedor NGINX
Docker exec
ejecuta comandos en contenedores. Pero, para hacer eso, primero debe tener un contenedor para ejecutar esos comandos. Empecemos descargando una imagen de Docker y creando un contenedor de demostración.
- Cree un nuevo directorio, este tutorial usa C:\gitrepos\test , para almacenar los archivos utilizados para el contenedor.
2. Cree un archivo, llamado dockerfile (sin extensión), que contenga el siguiente código. El Dockerfile define los pasos necesarios para crear un contenedor.
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
3. A continuación, cree un archivo, en el mismo directorio, llamado index.html que contiene el siguiente código. Este es un archivo HTML que, cuando se inicia el contenedor, mostrará un mensaje Hello World.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello World - Nginx Docker</title>
<style>
h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif;
}
</style>
</head>
<body>
<h1>
Hello World
</h1>
</body>
</html>
4. Ahora cree el contenedor Nginx Docker. Como el Dockerfile está en el directorio de trabajo actual, especifique .
para que el motor de Docker sepa que debe buscar allí. Además, asegúrese de etiquetar el contenedor con my-ngnix
usando el t
parámetro para asegurar una referencia más fácil en el futuro.
docker build -t my-nginx .

5. Ahora que el contenedor está construido, inícielo con el comando de ejecución de Docker.
# rm - Informs Docker to delete the container after it has stopped
# d - Return control of the command-line after the command has been executed
# p - Map the internal container port 80 to an external port 80 docker run --rm -d -p 80:80 my-nginx

6. Finalmente, abra su navegador web y vaya a http://localhost/
para ver lo siguiente.

Ejecución de comandos con Docker Exec
Al ejecutar comandos en un contenedor de Docker, es posible que deba ejecutar un comando de forma interactiva. Ejecutar comandos de forma interactiva significa escribir un comando, obtener comentarios, escribir otro comando, etc. Los comandos interactivos toman el control de su sesión y le impiden hacer cualquier otra cosa.
Pero, ¿qué sucede si ya conoce los comandos para enviar al contenedor con anticipación y desea ejecutar comandos en segundo plano? En ese caso, puede ejecutar comandos no interactivos. Los comandos no interactivos le permiten enviar un comando a Docker y devolver instantáneamente el control de la consola.
Ubicar el nombre y la identificación del contenedor
Ahora que tiene el contenedor construido, puede ejecutar comandos dentro del contenedor. Antes de ejecutar un comando, localice el nombre o ID del contenedor NGINX. El nombre o la ID funcionarán en los comandos de Docker. Con eso en mente, ¡recordar la identificación puede ser más difícil que el nombre!
Para mostrar cualquier información de contenedor en ejecución, ejecute Docker ps
Comando para generar la siguiente información.
docker ps

Copie el ID único, e17e4b6be01a
, o el nombre generado aleatoriamente mystifying_chandrasekhar
a su portapapeles para su uso posterior.
Ejecución de un comando no interactivo con Docker Exec
Como ejemplo de ejecución de un comando no interactivo, copie y ejecute el siguiente comando para obtener una lista de archivos en /var/log directorio con el ls -l
dominio. Pase todo después del nombre del contenedor, mystifying_chandrasekhar
, al Docker exec
comando.
docker exec mystifying_chandrasekhar ls -l /var/log

Evitar la salida de la consola con los comandos de Docker
Al devolver instantáneamente el control de la consola al usuario, las operaciones grandes evitan atar la consola. Renunciar a la salida de la consola con la d
separada opción. El siguiente comando crea el archivo /tmp/execWorks a través del touch
comando dentro del contenedor y no muestra ningún resultado en la consola.
docker exec -d mystifying_chandrasekhar touch /tmp/execWorks
Ejecución de comandos interactivos con Docker Exec
Hasta este momento, ha aprendido a ejecutar comandos no interactivos en un contenedor Docker con docker exec
. Sin embargo, es posible que se enfrente a un momento en el que deba solucionar problemas de un contenedor, por ejemplo, cuando necesite emitir comandos al contenedor de forma interactiva. En ese caso, debe ejecutar los comandos de forma interactiva.
Ejecutar comandos de forma interactiva con docker exec
requiere dos opciones, i
y t
. El i
La opción mantiene STDIN abierto, lo que permite enviar comandos al contenedor y el t
La opción asigna un pseudo-TTY (PTY), un canal de comunicación, para escribir comandos.
Copie y pegue 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 lo indica el cambio de aviso a / #
.
docker exec -it mystifying_chandrasekhar sh

Una vez en el shell, ahora ejecute los siguientes comandos para demostrar la lista de archivos desde dentro del contenedor. Finalmente, ejecutando exit
Comando para salir del shell interactivo.
ls -l /var/log
exit

Para abrir un indicador interactivo en un directorio específico, pase la ruta a
w
opción que indica a Docker que inicie el shell en un directorio específico.
Pasar variables ambientales a un contenedor en ejecución
Muchos programas usan variables de entorno para establecer configuraciones al inicio. Por ejemplo, la mayoría de las aplicaciones Java requieren el JAVA_HOME
variable ambiental para establecer la ruta de Java.
Puede pasar variables de entorno a una sesión utilizando e
opción. Por ejemplo, tal vez necesite completar una variable de entorno llamada MYVAR
en un contenedor en funcionamiento. Para hacer eso, use el e
opción y proporcione el par clave/valor de MYVAR="<some value>"
como se muestra a continuación.
docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR

Pasar variables de entorno con un archivo
Si tiene muchas variables ambientales o una configuración compartida, puede ser más fácil almacenar esas variables en un archivo. Pase el archivo a través de una ruta relativa o absoluta a Docker con --env-file
opción. Esta técnica se usa a menudo para proporcionar credenciales seguras a un contenedor. ¡Asegúrese de nunca enviar credenciales al control de versiones!
Cree un archivo de texto llamado env-vars.txt
con las variables ambientales a pasar y sus valores. Este archivo se puede llamar como quieras y no necesita el .txt
extensión de archivo.

Pase las variables ambientales a Docker con el env-file
opción. Verifica que las variables estén disponibles con el echo
comando como se muestra en la siguiente captura de pantalla.
# Pass the env-vars.txt file and open an interactive prompt
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verify that the environmental variables are available in the Docker container
echo $MYVAR
echo $FOO
echo $SOMETHING

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 debe hacerlo mientras prueba los comandos.
En este ejemplo, el contenedor Docker se ejecuta como nginx
usuario. Pase al usuario al w
opción para decirle a Docker que inicie el contenedor como nginx
cuenta. El whoami
comando, ejecutado desde dentro del contenedor, confirma que nginx
el usuario es de hecho utilizado.
docker exec -it -u nginx mystifying_chandrasekhar sh
whoami

Siguientes pasos
Ha aprendido a ejecutar comandos dentro de un contenedor en ejecución utilizando docker exec
dominio. Utilizando el exec
comando para ingresar e interrogar contenedores en ejecución, tiene una herramienta nueva y poderosa en su arsenal para solucionar problemas de contenedores Docker.
Ahora intente llevar lo que ha aprendido un paso más allá y use el control de versiones de Git para colocar 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.