Los contenedores Docker han revolucionado la forma en que desarrollamos, distribuimos y ejecutamos aplicaciones. Proporcionan un entorno consistente y aislado para nuestras aplicaciones, lo que facilita la gestión de dependencias y la portabilidad entre diferentes sistemas. Una de las tareas más comunes que realizamos con los contenedores es ejecutar comandos dentro de ellos. En esta guía completa, exploraremos los diferentes métodos para ejecutar comandos dentro de un contenedor Docker.

1. Ejecución Interactiva

La forma más sencilla de ejecutar comandos dentro de un contenedor Docker es utilizando el comando docker exec. Este comando nos permite ejecutar comandos de forma interactiva dentro de un contenedor en ejecución. Por ejemplo, para ejecutar un shell dentro de un contenedor llamado mi_contenedor, podemos usar el siguiente comando:

docker exec -it mi_contenedor /bin/bash

Esto abrirá un shell dentro del contenedor, lo que nos permitirá ejecutar cualquier comando que esté disponible en él.

La ejecución interactiva utilizando docker exec -it <contenedor> <comando> es especialmente útil cuando necesitamos interactuar con el sistema de archivos del contenedor o ejecutar múltiples comandos consecutivos dentro de él. Esta forma nos permite abrir un shell dentro del contenedor y trabajar como si estuviéramos dentro de él directamente. Podemos instalar paquetes, editar archivos de configuración, o realizar cualquier tarea necesaria para depurar o administrar la aplicación que se esté ejecutando en el contenedor.

2. Ejecución de Comandos Únicos

En algunos casos, es posible que solo necesitemos ejecutar un comando único dentro de un contenedor sin necesidad de abrir un shell interactivo. Para hacer esto, podemos usar el siguiente comando:

docker exec mi_contenedor

Por ejemplo, para listar el contenido del directorio /app dentro del contenedor, podemos ejecutar:

docker exec mi_contenedor ls /app

La ejecución de comandos únicos es útil cuando solo necesitamos ejecutar un comando específico dentro del contenedor y no queremos abrir un shell interactivo completo. Esto puede ser útil en scripts de automatización o en situaciones donde solo se necesita realizar una acción rápida dentro del contenedor, como consultar el estado de un servicio o realizar una operación de mantenimiento.

3. Ejecución de Comandos como Usuario Específico

En ocasiones, puede ser necesario ejecutar comandos dentro de un contenedor como un usuario específico. Para lograr esto, podemos utilizar la opción -u de docker exec. Por ejemplo, para ejecutar el comando whoami como el usuario usuario1 dentro del contenedor, podemos usar:

docker exec -u usuario1 mi_contenedor whoami

Esto ejecutará el comando whoami como el usuario usuario1 dentro del contenedor mi_contenedor.

Docker nos permite especificar el usuario bajo el cual queremos ejecutar un comando dentro del contenedor utilizando la opción -u. Esto es útil cuando necesitamos simular el entorno de ejecución de una aplicación que corre con un usuario específico por razones de seguridad o permisos. Por ejemplo, podemos ejecutar comandos como el usuario root o cualquier otro usuario del sistema dentro del contenedor.

4. Ejecución de Comandos en Contenedores Detenidos

Incluso si un contenedor está detenido, aún podemos ejecutar comandos dentro de él utilizando el comando docker exec. Por ejemplo, para ejecutar el comando ls dentro de un contenedor detenido llamado mi_contenedor_detenido, podemos hacer lo siguiente:

docker exec mi_contenedor_detenido ls /

Esto listará el contenido del directorio raíz del contenedor detenido.
Incluso si un contenedor está detenido, aún podemos ejecutar comandos dentro de él utilizando docker exec. Esto puede ser útil para fines de depuración o para recuperar información de un contenedor que ya no está en ejecución. Sin embargo, es importante tener en cuenta que los cambios realizados dentro de un contenedor detenido no persistirán a menos que se haya guardado un nuevo estado de la imagen.

Además de estos métodos, también podemos combinar docker exec con otras funcionalidades de Docker, como la gestión de volúmenes, la redirección de puertos, y más, para adaptarnos a diferentes casos de uso y necesidades específicas de nuestras aplicaciones y entornos de desarrollo. La flexibilidad de Docker nos permite trabajar de manera eficiente y efectiva en entornos de contenedores, facilitando la gestión y la implementación de nuestras aplicaciones.