Los Fundamentos de Docker: Guía Completa para Desarrolladores
Descubre los conceptos esenciales de Docker, cómo crear y gestionar contenedores, y las mejores prácticas para la integración continua y el despliegue.
InSkillCoach
Los Fundamentos de Docker: Guía Completa para Desarrolladores
Docker ha revolucionado la forma en que desarrollamos, desplegamos y ejecutamos aplicaciones. Esta guía te presenta los conceptos fundamentales de Docker y cómo utilizarlo de forma eficaz en tu flujo de trabajo de desarrollo.
¿Qué es Docker?
Docker es una plataforma de contenedorización que permite empaquetar una aplicación y sus dependencias en un “contenedor” aislado, que podrá ejecutarse en cualquier servidor. A diferencia de las máquinas virtuales, los contenedores no necesitan un hipervisor y se ejecutan directamente sobre el kernel de la máquina anfitriona.
Ventajas de Docker
- Coherencia de entorno: “Funciona en mi máquina” se convierte en “Funciona en todas partes”
- Aislamiento: Las aplicaciones se ejecutan de forma aislada sin interferir entre sí
- Eficiencia de recursos: Más ligero que las VM tradicionales
- Despliegue rápido: Los contenedores arrancan rápidamente
- Escalado sencillo: Replicación simple de los contenedores
Arquitectura de Docker
La arquitectura de Docker comprende varios componentes clave:
- Docker Daemon (dockerd): El servicio que gestiona los contenedores
- Docker Client: La interfaz de línea de comandos
- Docker Registry: El repositorio donde se almacenan las imágenes (por ejemplo, Docker Hub)
- Docker Images: Plantillas de solo lectura utilizadas para crear contenedores
- Docker Containers: Instancias en ejecución de las imágenes
Instalación de Docker
Windows
# Instalar Docker Desktop para Windows
# Descargar desde https://www.docker.com/products/docker-desktop
# Seguir las instrucciones de instalación
Linux (Ubuntu)
# Actualizar la lista de paquetes
sudo apt-get update
# Instalar los requisitos previos
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# Añadir la clave GPG oficial de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Configurar el repositorio estable
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalar Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# Añadir tu usuario al grupo docker
sudo usermod -aG docker $USER
macOS
# Instalar Docker Desktop para Mac
# Descargar desde https://www.docker.com/products/docker-desktop
# Seguir las instrucciones de instalación
Comandos Esenciales de Docker
Gestión de Imágenes
# Descargar una imagen
docker pull ubuntu:latest
# Listar las imágenes
docker images
# Construir una imagen a partir de un Dockerfile
docker build -t mon-app:1.0 .
# Eliminar una imagen
docker rmi ubuntu:latest
Gestión de Contenedores
# Crear e iniciar un contenedor
docker run -d -p 8080:80 --name mon-conteneur nginx
# Listar los contenedores en ejecución
docker ps
# Listar todos los contenedores (incluidos los detenidos)
docker ps -a
# Detener un contenedor
docker stop mon-conteneur
# Iniciar un contenedor existente
docker start mon-conteneur
# Eliminar un contenedor
docker rm mon-conteneur
Interacción con los Contenedores
# Ejecutar un comando en un contenedor en ejecución
docker exec -it mon-conteneur bash
# Mostrar los logs de un contenedor
docker logs mon-conteneur
# Copiar archivos hacia/desde un contenedor
docker cp mon-fichier.txt mon-conteneur:/chemin/destination
docker cp mon-conteneur:/chemin/source/fichier.txt .
Creación de un Dockerfile
Un Dockerfile es un archivo de texto que contiene todos los comandos para construir una imagen de Docker.
# Utilizar una imagen base
FROM node:14-alpine
# Definir el directorio de trabajo
WORKDIR /app
# Copiar los archivos de dependencias
COPY package*.json ./
# Instalar las dependencias
RUN npm install
# Copiar el resto de los archivos
COPY . .
# Exponer un puerto
EXPOSE 3000
# Definir el comando que se ejecutará al iniciar el contenedor
CMD ["npm", "start"]
Mejores Prácticas para los Dockerfiles
- Utilizar imágenes base ligeras como Alpine Linux
- Combinar los comandos RUN para reducir el número de capas
- Limpiar las cachés tras la instalación de los paquetes
- Utilizar .dockerignore para excluir los archivos innecesarios
- Especificar versiones precisas para las dependencias
- Utilizar usuarios no root para ejecutar la aplicación
Docker Compose
Docker Compose es una herramienta para definir y ejecutar aplicaciones multicontenedor.
Ejemplo de docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- ./app:/app
depends_on:
- db
environment:
- DATABASE_URL=postgres://postgres:password@db:5432/app
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=postgres
- POSTGRES_DB=app
volumes:
postgres_data:
Comandos de Docker Compose
# Iniciar todos los servicios definidos en docker-compose.yml
docker-compose up -d
# Detener todos los servicios
docker-compose down
# Ver los logs de todos los servicios
docker-compose logs
# Reconstruir las imágenes e iniciar
docker-compose up -d --build
Redes de Docker
Docker crea por defecto varias redes:
- bridge: Red por defecto para los contenedores
- host: Elimina el aislamiento de red entre el contenedor y el host
- none: Desactiva la red
Creación y Gestión de Redes
# Crear una red
docker network create mon-reseau
# Listar las redes
docker network ls
# Conectar un contenedor a una red
docker network connect mon-reseau mon-conteneur
# Inspeccionar una red
docker network inspect mon-reseau
Volúmenes de Docker
Los volúmenes permiten persistir los datos fuera de los contenedores.
Tipos de Volúmenes
- Volumen con nombre: Gestionado por Docker
- Volumen de enlace (bind mount): Vinculado a una ruta específica del host
- Volumen tmpfs: Almacenado en memoria (no persistente)
Comandos de Gestión de Volúmenes
# Crear un volumen con nombre
docker volume create mon-volume
# Listar los volúmenes
docker volume ls
# Utilizar un volumen al iniciar un contenedor
docker run -d -v mon-volume:/data --name mon-conteneur ubuntu
# Asociar un directorio del host a un contenedor
docker run -d -v /chemin/hote:/data --name mon-conteneur ubuntu
# Eliminar un volumen
docker volume rm mon-volume
Docker Registry
Un registry es un servicio de almacenamiento y distribución de imágenes de Docker.
Interacción con Docker Hub
# Iniciar sesión en Docker Hub
docker login
# Etiquetar una imagen
docker tag mon-app:1.0 utilisateur/mon-app:1.0
# Subir una imagen a Docker Hub
docker push utilisateur/mon-app:1.0
# Descargar una imagen desde Docker Hub
docker pull utilisateur/mon-app:1.0
Desplegar un Registry Privado
# Iniciar un registry local
docker run -d -p 5000:5000 --name registry registry:2
# Etiquetar una imagen para el registry local
docker tag mon-app:1.0 localhost:5000/mon-app:1.0
# Subir al registry local
docker push localhost:5000/mon-app:1.0
Seguridad en Docker
Buenas Prácticas
- Mantener Docker actualizado para beneficiarse de los parches de seguridad
- Escanear las imágenes para detectar vulnerabilidades (con Docker Scout o Trivy)
- Limitar las capacidades de los contenedores
- Utilizar usuarios no root en los contenedores
- Firmar las imágenes con Docker Content Trust
- Restringir los recursos (CPU, memoria) de los contenedores
Configuración Segura
# Ejecutar un contenedor con restricciones de recursos
docker run -d --name mon-conteneur --memory="512m" --cpus="0.5" nginx
# Ejecutar un contenedor con un usuario específico
docker run -d --user 1000:1000 --name mon-conteneur nginx
# Ejecutar un contenedor en modo de solo lectura
docker run -d --read-only --name mon-conteneur nginx
Casos de Uso Habituales
Aplicaciones Web
# Ejecutar una aplicación web Node.js
docker run -d -p 3000:3000 --name node-app node-app:1.0
# Ejecutar un servidor Nginx como proxy inverso
docker run -d -p 80:80 --name nginx -v ./nginx.conf:/etc/nginx/nginx.conf nginx
Bases de Datos
# Iniciar una base de datos MySQL
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=password -v mysql_data:/var/lib/mysql mysql:8.0
# Iniciar una base de datos PostgreSQL
docker run -d --name postgres -e POSTGRES_PASSWORD=password -v postgres_data:/var/lib/postgresql/data postgres:13
CI/CD
# Ejecutar pruebas en un contenedor
docker run --rm -v $(pwd):/app -w /app node:14 npm test
# Construir una aplicación en un contenedor
docker run --rm -v $(pwd):/app -w /app maven:3.8-openjdk-11 mvn package
Integración con Kubernetes
Docker funciona muy bien con Kubernetes, el orquestador de contenedores:
- Crear imágenes de Docker para tu aplicación
- Subir las imágenes a un registry accesible
- Definir manifiestos de Kubernetes para desplegar los contenedores
- Utilizar kubectl para gestionar los despliegues
Conclusión
Docker ha transformado el desarrollo de software al hacer que las aplicaciones sean más portables, más fáciles de desplegar y de escalar. Dominar Docker se ha convertido en una competencia esencial para los desarrolladores y los profesionales de DevOps.
Siguiendo esta guía, has adquirido los conocimientos fundamentales para:
- Comprender los conceptos clave de Docker
- Crear y gestionar contenedores
- Trabajar con imágenes y volúmenes
- Utilizar Docker Compose para aplicaciones multicontenedor
- Seguir las mejores prácticas de seguridad
Para ir más lejos, explora la orquestación de contenedores con Kubernetes, los pipelines de CI/CD basados en Docker y la arquitectura de microservicios.
Acerca de InSkillCoach
Experto en formación y tecnologías
Coach especializado en tecnologías avanzadas e IA, impulsado por GNeurone Inc.
Certificaciones:
- AWS Certified Solutions Architect – Professional
- Certificaciones de Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentarios
Los comentarios funcionan con GitHub Discussions
Inicia sesión con GitHub para participar en la discusión