4. Primeros pasos prácticos con contenedores

Ahora que conocemos los conceptos teóricos, es hora de empezar a trabajar con contenedores. En esta sección, veremos cómo descargar imágenes de Docker Hub y cómo gestionar el ciclo de vida de los contenedores.

Descargar y ejecutar imágenes oficiales

El comando `docker run` es el más versátil. Si la imagen no existe localmente, la descarga (`pull`) y luego crea y ejecuta (`run`) un contenedor a partir de ella.

Ejemplo 1: Ejecutar un servidor web Nginx

Nginx es un servidor web muy popular. Podemos levantarlo con un solo comando:

docker run --name mi-servidor-web -p 8080:80 -d nginx
Página de bienvenida de Nginx accediendo desde el navegador
Página de bienvenida de Nginx ejecutándose en un contenedor Docker.

Desglosemos los parámetros:

  • --name mi-servidor-web: Le asigna un nombre legible al contenedor para identificarlo fácilmente.
  • -p 8080:80: Mapea un puerto. Publica el puerto 80 del contenedor (el puerto por defecto de Nginx) en el puerto 8080 de nuestra máquina (host). Así, podemos acceder al servidor desde nuestro navegador.
  • -d: Modo "detached" o desacoplado. Ejecuta el contenedor en segundo plano y nos devuelve el control de la terminal.
  • nginx: El nombre de la imagen que queremos usar.

Ahora, si abres tu navegador y vas a http://localhost:8080, verás la página de bienvenida de Nginx. ¡Has desplegado un servidor web en segundos!

Salida del comando docker run para Nginx
Docker descarga la imagen de Nginx y devuelve el ID del contenedor.

Ejemplo 2: Usar una imagen mínima con Alpine

Alpine es una distribución de Linux extremadamente ligera (ocupa unos 5 MB). Es muy usada como base para crear imágenes personalizadas.

docker run alpine echo "Hola desde un contenedor Alpine"

En este caso, el contenedor se inicia, ejecuta el comando `echo`, imprime el mensaje en la terminal y se detiene, ya que su tarea ha finalizado.

Salida del comando echo en un contenedor Alpine
Resultado de ejecutar un comando simple en un contenedor Alpine.

Ejecutar comandos interactivos en un contenedor

A veces necesitamos "entrar" en un contenedor para explorar su sistema de archivos, depurar un problema o ejecutar comandos. Para esto, usamos los flags -it.

  • -i (interactivo): Mantiene la entrada estándar (STDIN) abierta, permitiéndonos escribir comandos.
  • -t (TTY): Asigna un pseudo-terminal, lo que nos da una shell interactiva.

Vamos a iniciar un contenedor con Ubuntu y obtener una terminal de `bash`:

docker run -it --name mi-ubuntu ubuntu bash

Después de ejecutar este comando, tu prompt cambiará. Estarás dentro del contenedor como usuario `root`. Ahora puedes ejecutar comandos de Linux como si estuvieras en una máquina Ubuntu real:

# Dentro del contenedor
ls -la
pwd
apt-get update && apt-get install -y curl
exit

Al escribir exit, el proceso `bash` termina y el contenedor se detiene.

Terminal interactiva dentro de un contenedor Ubuntu
Prompt de la terminal después de iniciar una sesión interactiva en un contenedor Ubuntu.

Administrar contenedores en ejecución

Una vez que tenemos contenedores (en ejecución o detenidos), necesitamos comandos para gestionarlos.

Listar contenedores: `docker ps`

El comando `docker ps` (process status) muestra los contenedores que están actualmente en ejecución.

docker ps

Verás una tabla con el ID del contenedor, la imagen, el comando, cuándo fue creado, su estado, los puertos y su nombre (como `mi-servidor-web`).

Salida del comando docker ps
Lista de contenedores en ejecución mostrada por 'docker ps'.

Para ver todos los contenedores, incluyendo los detenidos (como `mi-ubuntu`), usa el flag -a:

docker ps -a
Salida del comando docker ps -a
Lista de todos los contenedores (en ejecución y detenidos) con 'docker ps -a'.

Detener un contenedor: `docker stop`

Para detener el servidor Nginx que dejamos corriendo en segundo plano, usamos `docker stop` seguido del nombre o ID del contenedor.

docker stop mi-servidor-web

Si ahora visitas http://localhost:8080, la página no cargará. El contenedor está detenido, pero no eliminado.

Salida del comando docker stop

Eliminar un contenedor: `docker rm`

Los contenedores detenidos siguen ocupando espacio en disco. Para eliminarlos permanentemente, usamos `docker rm`.

# Primero eliminamos el de nginx
docker rm mi-servidor-web

# Ahora el de ubuntu
docker rm mi-ubuntu

Si intentas eliminar un contenedor en ejecución, Docker te dará un error. Debes detenerlo primero, o forzar la eliminación con el flag -f: docker rm -f <nombre_contenedor>.

Ciclo completo de vida

Resumamos el flujo de trabajo básico con un contenedor:

  1. Crear y ejecutar: docker run -d --name test-container alpine tail -f /dev/null (el comando `tail` mantiene el contenedor vivo).
  2. Verificar que está en ejecución: docker ps.
  3. Detener: docker stop test-container.
  4. Verificar que está detenido: docker ps -a.
  5. Eliminar: docker rm test-container.
  6. Verificar que fue eliminado: docker ps -a (ya no debería aparecer).