3. Conceptos fundamentales de Docker

Para trabajar con Docker de manera efectiva, es indispensable dominar sus cinco conceptos centrales: Imágenes, Contenedores, Repositorios, Dockerfiles y Volúmenes/Redes.

Imágenes: La plantilla de solo lectura

Una imagen es un paquete ejecutable y ligero que incluye todo lo necesario para ejecutar una aplicación: el código, un entorno de ejecución, librerías, variables de entorno y archivos de configuración. Es, en esencia, una plantilla de solo lectura.

  • Capas (Layers): Las imágenes se construyen en una serie de capas apiladas. Cada instrucción en un Dockerfile (que veremos más adelante) crea una nueva capa. Por ejemplo, una capa puede ser el sistema operativo base, otra la instalación de una dependencia y una tercera nuestro código fuente.
  • Almacenamiento en caché: Este sistema de capas es muy eficiente. Si construyes una imagen y luego modificas solo la última capa (tu código), Docker reutiliza las capas anteriores que no han cambiado (el SO, las dependencias), haciendo que las reconstrucciones sean extremadamente rápidas.

Piensa en una imagen como una "receta" o un "molde" para crear instancias de tu aplicación.

Contenedores: La instancia en ejecución

Un contenedor es una instancia en ejecución de una imagen. Si la imagen es la clase, el contenedor es el objeto. Puedes crear, iniciar, detener, mover y eliminar múltiples contenedores a partir de una misma imagen.

Cuando se lanza un contenedor, Docker añade una capa superior escribible sobre las capas de la imagen. Cualquier cambio que se realice dentro del contenedor (crear archivos, modificar configuraciones) se escribe en esta capa. Los datos en esta capa son efímeros: si el contenedor se elimina, los datos se pierden.

Ciclo de vida de un contenedor:

  1. Crear (create): Se crea el contenedor a partir de una imagen, pero no se inicia. Se prepara su sistema de archivos y configuración.
    docker create ubuntu
  2. Ejecutar (run): Es el comando más común. Crea y arranca el contenedor en un solo paso.
    docker run ubuntu
  3. Detener (stop/kill): Detiene un contenedor en ejecución. `stop` envía una señal de apagado ordenado, mientras que `kill` lo detiene de forma abrupta.
    docker stop <id_contenedor>
  4. Eliminar (rm): Borra un contenedor detenido, liberando los recursos que utilizaba. La capa escribible se destruye.
    docker rm <id_contenedor>

Repositorios: El lugar de las imágenes

Un repositorio (o registro) es un lugar donde se almacenan y distribuyen las imágenes Docker. El más conocido es Docker Hub, el registro público oficial de Docker.

  • Docker Hub: Contiene miles de imágenes oficiales y de la comunidad. Por ejemplo, si necesitas una base de datos PostgreSQL, en lugar de instalarla desde cero, simplemente descargas la imagen oficial `postgres` de Docker Hub.
  • Registros Privados: Las empresas suelen utilizar registros privados (como Amazon ECR, Google Container Registry o GitLab Container Registry) para almacenar sus imágenes propietarias de forma segura.

Los comandos `docker pull` (descargar) y `docker push` (subir) se usan para interactuar con estos repositorios.

Dockerfile: La receta para construir imágenes

Un Dockerfile es un archivo de texto sin extensión llamado `Dockerfile` que contiene una serie de instrucciones sobre cómo construir una imagen de Docker personalizada. Es la "receta" que automatiza la creación de imágenes.

Un ejemplo simple de Dockerfile para una aplicación Python:

# Usar una imagen base oficial de Python
FROM python:3.9-slim

# Establecer el directorio de trabajo dentro del contenedor
WORKDIR /app

# Copiar los archivos de requisitos e instalarlos
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copiar el resto del código de la aplicación
COPY . .

# Comando que se ejecutará al iniciar el contenedor
CMD ["python", "app.py"]

Con el comando `docker build`, Docker lee este archivo y ejecuta las instrucciones una por una, creando una capa por cada instrucción, para generar la imagen final.

Volúmenes y Redes: Persistencia y Comunicación

Volúmenes

Como mencionamos, los datos dentro de un contenedor son efímeros. Para solucionar esto, Docker ofrece los volúmenes. Un volumen es un mecanismo para persistir los datos generados por un contenedor. Los volúmenes son gestionados por Docker y se almacenan en una parte del sistema de archivos del host.

Son la forma recomendada de manejar datos de bases de datos, logs o cualquier información que deba sobrevivir al ciclo de vida del contenedor.

Redes

Por defecto, los contenedores pueden comunicarse con el mundo exterior, pero están aislados entre sí. Docker proporciona un sistema de redes para permitir la comunicación entre contenedores.

Puedes crear redes personalizadas y conectar varios contenedores a la misma red. Esto les permite descubrirse y comunicarse por su nombre. Por ejemplo, un contenedor de una aplicación web (`frontend`) puede conectarse a un contenedor de base de datos (`database`) simplemente usando el nombre `database` como si fuera un dominio.