Docker Exec: Tu Comando Goto para Ejecutar Comandos en Docker


¿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.

  1. 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.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

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.

<!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 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.

docker build -t my-nginx .
Creating a Docker container with the build command.

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

# rm: Informa a Docker que elimine el contenedor después de detenerlo 
# d: Devuelve el control de la línea de comandos después de que se haya ejecutado el comando 
# p: Mapea el puerto interno del contenedor 80 a un puerto externo 80 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

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

Output of the running NGINX container.

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.

docker ps
Displaying running Docker containers.

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.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

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.

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

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 / #.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

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.

ls -l /var/log
exit
Open an interactive command prompt to the container.

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.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

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.

Text file with environmental variables defined.

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.

# Pase el archivo env-vars.txt y abra un indicador interactivo
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verifique que las variables de entorno estén disponibles en el contenedor de Docker
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

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.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the 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.

Source:
https://adamtheautomator.com/docker-exec/