docker-ejecutar-comandos-con-exec

Ejecutar comandos en contenedores con Exec

  • 3 min

El comando docker exec es una herramienta que nos permite ejecutar un nuevo proceso dentro de un contenedor que ya se encuentra en estado de ejecución.

Imagina esta situación: Tienes tu servidor Nginx corriendo perfectamente en segundo plano (-d). Todo parece ir bien, pero de repente, la web da un Error 500.

Necesitas ver el archivo de configuración, comprobar si el disco está lleno o hacer un ping a la base de datos desde dentro.

En el mundo de las Máquinas Virtuales, te conectarías por SSH. Pero en Docker, SSH no se usa. En su lugar, tenemos un comando mucho más potente y directo: docker exec.

¿Por qué no usar SSH?

Es una pregunta clásica. ¿Por qué no instalo openssh-server en mi imagen de Docker para conectarme con PuTTY? Porque es un anti-patrón.

  1. Peso innecesario: Estás añadiendo un servicio pesado a un contenedor que debería ser ligero.
  2. Seguridad: Tienes que gestionar claves, usuarios y abrir el puerto 22. Más vectores de ataque.
  3. Complejidad: Tienes que configurar systemd o supervisord para correr dos procesos a la vez (tu app + ssh), lo cual va contra la filosofía de “un contenedor, un proceso”.

Docker ya tiene su propia puerta trasera segura: es el Socket de Docker a través de docker exec. Úsalo.

¿Qué es docker exec?

Este comando nos permite ejecutar un proceso nuevo dentro de un contenedor que ya está funcionando.

docker exec [OPCIONES] <NOMBRE_CONTENEDOR> <COMANDO>
Copied!
  • <NOMBRE_CONTENEDOR>: El nombre o ID del contenedor en el que queremos ejecutar el comando.
  • <COMANDO>: El comando que deseamos ejecutar dentro del contenedor.
  • [OPCIONES]: Opciones adicionales para personalizar la ejecución del comando.

Ejemplo básico Supongamos que tenemos un contenedor en ejecución llamado mi_contenedor que está ejecutando un servidor web. Si queremos ver los archivos dentro del contenedor, podemos usar docker exec para listar el contenido del directorio actual:

docker exec mi_contenedor ls -l
Copied!

Este comando ejecutará ls -l dentro del contenedor mi_contenedor y mostrará el listado de archivos en la terminal.