Introducción
Este completo tutorial de Docker proporciona a los desarrolladores y profesionales de TI una exploración en profundidad de la tecnología de contenedores. Al cubrir conceptos fundamentales, procedimientos de instalación y estrategias de implementación prácticas, la guía tiene como objetivo capacitar a los alumnos para utilizar eficazmente Docker para crear, gestionar y desplegar aplicaciones de software escalables.
Conceptos Básicos de Docker
Introducción a Docker
Docker es una potente tecnología de contenedores que revoluciona el despliegue y el desarrollo de software. Como plataforma de contenedorización, Docker permite a los desarrolladores empaquetar aplicaciones con todas sus dependencias, garantizando una entrega de software consistente y eficiente en diferentes entornos informáticos.
Conceptos Fundamentales de la Contenedorización
Los contenedores son paquetes ejecutables, autónomos y ligeros que incluyen todo lo necesario para ejecutar una aplicación: código, entorno de ejecución, herramientas del sistema, bibliotecas y configuraciones. A diferencia de las máquinas virtuales tradicionales, los contenedores comparten el kernel del sistema host, lo que los hace más eficientes en el uso de recursos.
graph TD
A[Código de la Aplicación] --> B[Contenedor Docker]
C[Dependencias] --> B
D[Bibliotecas del Sistema] --> B
E[Entorno de Ejecución] --> B
Arquitectura de Docker
| Componente | Descripción | Función |
|---|---|---|
| Docker Daemon | Servicio en segundo plano | Gestiona objetos Docker |
| Docker Cliente | Interfaz de línea de comandos | Envía comandos al Docker daemon |
| Docker Registry | Almacenamiento de imágenes | Permite compartir y distribuir imágenes |
Instalación en Ubuntu 22.04
## Actualizar el índice de paquetes
sudo apt update
## Instalar dependencias
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Añadir la clave GPG oficial de Docker
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## Configurar el repositorio estable
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## Instalar Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
Comandos Básicos de Docker
## Extraer una imagen
docker pull ubuntu:latest
## Listar imágenes
docker images
## Ejecutar un contenedor
docker run -it ubuntu:latest /bin/bash
## Listar contenedores en ejecución
docker ps
## Detener un contenedor
docker stop container_id
Ejemplo de Dockerfile
## Usar la imagen base oficial de Ubuntu
FROM ubuntu:22.04
## Establecer el directorio de trabajo
WORKDIR /app
## Instalar Python
RUN apt-get update && apt-get install -y python3
## Copiar archivos de la aplicación
COPY . /app
## Definir el comando para ejecutar
CMD ["python3", "app.py"]
Orquestación de Contenedores
Entendiendo la Orquestación de Contenedores
La orquestación de contenedores es un proceso crucial para gestionar múltiples contenedores en diferentes hosts, permitiendo el despliegue, escalado y gestión complejos de aplicaciones. Kubernetes y Docker Compose son herramientas principales para lograr una orquestación eficiente de contenedores.
Fundamentos de Docker Compose
Docker Compose permite definir y ejecutar aplicaciones multicontenedor a través de un único archivo de configuración. Simplifica la configuración de servicios y la red de contenedores.
graph TD
A[Docker Compose] --> B[Servicio 1]
A --> C[Servicio 2]
A --> D[Servicio 3]
B --> E[Red de Contenedores]
C --> E
D --> E
Configuración de Docker Compose
| Clave de Configuración | Propósito | Ejemplo |
|---|---|---|
| version | Formato del archivo Compose | 3.8 |
| services | Define los servicios de la aplicación | web, base de datos |
| networks | Configura las redes de contenedores | puente, overlay |
| volumes | Gestiona datos persistentes | almacenamiento base de datos |
Ejemplo de Docker Compose
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- app_network
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: secretpassword
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app_network
networks:
app_network:
driver: puente
volumes:
postgres_data:
Desplegando una Aplicación Multicontenedor
## Instalar Docker Compose
sudo apt update
sudo apt install docker-compose
## Validar la configuración
docker-compose config
## Iniciar servicios
docker-compose up -d
## Listar servicios en ejecución
docker-compose ps
## Detener y eliminar contenedores
docker-compose down
Conceptos de Redes de Contenedores
## Crear una red personalizada
docker network create app_network
## Conectar un contenedor a la red
docker network connect app_network container_name
## Inspeccionar detalles de la red
docker network inspect app_network
Configuración Avanzada de Servicios
services:
web:
build:
context: ./web
dockerfile: Dockerfile
depends_on:
- database
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "
interval: 30s
timeout: 10s
Flujos de Trabajo de Producción
Integración Continua y Despliegue
Los flujos de trabajo de producción con Docker se centran en crear estrategias de despliegue escalables, eficientes y confiables. La integración de la contenedorización en las tuberías CI/CD permite una entrega de software sin problemas y una gestión de entornos consistente.
graph LR
A[Comprobar Código] --> B[Construir Imagen Docker]
B --> C[Pruebas Automatizadas]
C --> D[Publicar en el Registro]
D --> E[Desplegar en Entorno de Pruebas]
E --> F[Despliegue de Producción]
Registro Docker y Gestión de Imágenes
| Tipo de Registro | Descripción | Caso de Uso |
|---|---|---|
| Docker Hub | Registro público | Imágenes de código abierto |
| Registro Privado | Autohospedado | Seguridad empresarial |
| Registros en la Nube | Servicios gestionados | AWS ECR, Azure ACR |
Estrategias de Despliegue
services:
web:
image: myapp:${VERSION}
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
order: stop-first
Configuración de Escalabilidad
## Escalar servicios dinámicamente
docker-compose up -d --scale web=5
## Monitorizar recursos de contenedores
docker stats
## Limitar recursos de contenedores
docker run -it --cpus=0.5 --memory=512m nginx
Script de Integración Continua
#!/bin/bash
## Script de la Tubería CI/CD
## Construir la imagen Docker
docker build -t myapp:${GITHUB_SHA} .
## Ejecutar pruebas automatizadas
docker run --rm myapp:${GITHUB_SHA} npm test
## Publicar en el registro
docker push registry.example.com/myapp:${GITHUB_SHA}
## Desplegar en Kubernetes
kubectl set image deployment/myapp myapp=myapp:${GITHUB_SHA}
Configuración Avanzada de Monitorización
services:
monitoring:
image: prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
networks:
- monitoring_network
Mejores Prácticas de Orquestación de Contenedores
## Implementación de comprobación de estado
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f || exit 1
## Estrategia de actualización gradual
docker service update \
--update-parallelism 2 \
--update-delay 10s \
myservice
Consideraciones de Seguridad
## Imagen mínima con usuario no root
FROM alpine:latest
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
WORKDIR /app
Resumen
Docker representa un enfoque transformador para el desarrollo y despliegue de software, ofreciendo una contenedorización ligera y eficiente que simplifica los desafíos complejos de infraestructura. Al comprender la arquitectura central de Docker, dominar los comandos esenciales e implementar las mejores prácticas, los desarrolladores pueden lograr una consistencia y portabilidad sin precedentes en diferentes entornos informáticos, acelerando en última instancia la entrega de software y reduciendo la complejidad operativa.



