Acceso a contenedores con Exec

DockerBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a entrar en un contenedor de Docker en ejecución. Esta es una habilidad fundamental para la depuración porque, aunque los contenedores están diseñados para ser desechables, a menudo es necesario inspeccionar un entorno activo para comprender qué está ocurriendo.

Para inspeccionar archivos, comprobar los procesos en ejecución o solucionar problemas dentro de un contenedor, normalmente necesita un intérprete de comandos dentro del entorno de ese contenedor. El comando docker exec permite iniciar un comando adicional dentro de un contenedor que ya está en ejecución, sin reconstruirlo ni reiniciarlo.

La palabra «adicional» es importante. docker exec no reemplaza el proceso principal del contenedor. Inicia otro proceso dentro de los mismos espacios de nombres del contenedor, mientras el servicio original continúa ejecutándose.

En este laboratorio, realizará los siguientes pasos:

  • Iniciar un contenedor de Nginx en segundo plano.
  • Usar docker exec para iniciar un intérprete de comandos Bash interactivo dentro del contenedor.
  • Ejecutar comandos dentro del contenedor para identificar su sistema operativo.
  • Salir del contenedor y volver al terminal del equipo anfitrión.

Iniciar un contenedor en segundo plano

En este paso, iniciará un contenedor de Docker nuevo mediante la imagen de Nginx. Lo ejecutará en modo «detached» para que funcione en segundo plano y le asignará un nombre específico para poder referirse a él más fácilmente después.

Ejecute el siguiente comando en el terminal:

docker run -d --name web1 nginx

Desglose del comando:

  • docker run: comando para crear e iniciar un contenedor.
  • -d: ejecuta el contenedor en modo detached (segundo plano).
  • --name web1: asigna el nombre web1 al contenedor.
  • nginx: imagen que se utilizará.

Compruebe que el contenedor está en ejecución:

docker ps

Debería ver web1 en la lista de contenedores activos.

El contenedor debe estar en ejecución porque docker exec funciona entrando en el contexto de un contenedor activo existente. No puede iniciar un intérprete de comandos dentro de un contenedor que ya se haya detenido.

Entrar en el contenedor

Ahora que el contenedor está en ejecución, usará el comando docker exec para iniciar una sesión de intérprete de comandos dentro de él. Esto equivale, en la práctica, a «iniciar sesión» en el contenedor, de forma similar a conectarse mediante SSH a un servidor remoto.

Ejecute el siguiente comando:

docker exec -it web1 bash

Desglose del comando:

  • docker exec: ejecuta un comando dentro de un contenedor existente.
  • -it: esta combinación es esencial para las sesiones interactivas.
    • -i (interactive): mantiene abierto el flujo de entrada.
    • -t (tty): asigna un pseudo-terminal para que se comporte como un indicador de comandos real.
  • web1: nombre del contenedor de destino.
  • bash: comando que se ejecutará dentro del contenedor. En este caso, inicia el intérprete de comandos Bash.

Por tanto, docker exec significa realmente «ejecute este comando dentro del contenedor». Un intérprete de comandos es solo uno de los usos habituales; el comando también podría ser ls, cat o una herramienta de depuración.

Observe el cambio:

Después de ejecutar este comando, cambiará el indicador de comandos. Tendrá un aspecto similar a root@<container-id>:/#.

Esto indica que ahora está ejecutando comandos dentro del contenedor, aislado del equipo anfitrión.

Este aislamiento suele incluir la vista del sistema de archivos, el espacio de nombres de procesos y el contexto de red. Sigue utilizando el mismo kernel, pero ahora está viendo el entorno delimitado del contenedor en lugar del entorno completo del equipo anfitrión.

Inspeccionar el entorno del contenedor

Ahora está dentro del contenedor. El sistema de archivos que ve pertenece al contenedor, no a su entorno de LabEx. Puede comprobarlo consultando la información del sistema operativo.

Ejecute el siguiente comando dentro del intérprete de comandos del contenedor:

cat /etc/os-release

Verá información sobre la distribución de Linux utilizada por la imagen de Nginx, normalmente Debian.

Salida de ejemplo:

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
...

Esto confirma que el contenedor tiene su propio entorno de sistema operativo aislado, independiente del equipo anfitrión.

Más concretamente, tiene su propio sistema de archivos de espacio de usuario y su propio entorno de procesos. No tiene un kernel independiente, pero desde dentro puede parecer un pequeño sistema Linux separado.

Salir y volver al equipo anfitrión

Cuando termine de depurar o inspeccionar el contenedor, debe salir de la sesión del intérprete de comandos para volver al equipo anfitrión.

Escriba el siguiente comando dentro del contenedor:

exit

Después de pulsar Enter, el indicador de comandos debería volver al indicador de usuario estándar de LabEx.

¿Qué ha ocurrido?

Ha cerrado el proceso de Bash que se ejecutaba dentro del contenedor. Sin embargo, el contenedor (web1) sigue funcionando en segundo plano porque el proceso principal, Nginx, continúa activo.

Esta es la lección clave sobre el ciclo de vida de docker exec: cerrar el intérprete de comandos interactivo no detiene el contenedor, a menos que ese intérprete fuera el proceso principal que definía la vida del contenedor.

Puede confirmarlo ejecutando:

docker ps

web1 todavía aparece en la lista.

Para limpiar el entorno, puede detener y eliminar el contenedor:

docker rm -f web1

Resumen

En este laboratorio, aprendió a acceder a un contenedor en ejecución mediante docker exec -it. Practicó lo siguiente:

  • Iniciar un contenedor en segundo plano.
  • Entrar en el contenedor mediante un intérprete de comandos Bash interactivo.
  • Verificar el entorno dentro del contenedor.
  • Salir de forma segura mientras el servicio continúa en ejecución.

Esta es una habilidad fundamental para trabajar con Docker, ya que permite solucionar problemas de las aplicaciones e inspeccionar directamente los entornos de los contenedores.