Para trabajar con Docker de manera efectiva, es indispensable dominar sus cinco conceptos centrales: Imágenes, Contenedores, Repositorios, Dockerfiles y Volúmenes/Redes.
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.
Piensa en una imagen como una "receta" o un "molde" para crear instancias de tu aplicació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.
docker create ubuntu
docker run ubuntu
docker stop <id_contenedor>
docker rm <id_contenedor>
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.
Los comandos `docker pull` (descargar) y `docker push` (subir) se usan para interactuar con estos repositorios.
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.
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.
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.