Introducción
Este completo tutorial de Docker proporciona a los desarrolladores y profesionales de TI una inmersión profunda en la tecnología de contenedorización. Al explorar los conceptos centrales de Docker, su arquitectura y estrategias de implementación prácticas, los participantes adquirirán habilidades prácticas en el empaquetado, la implementación y la gestión de aplicaciones en diferentes entornos informáticos.
Conceptos Fundamentales de Docker
¿Qué es Docker?
Docker es una potente plataforma de contenedorización que revoluciona la implementación y el desarrollo de aplicaciones. Como tecnología de código abierto, Docker permite a los desarrolladores empaquetar, distribuir y ejecutar aplicaciones de forma consistente en diferentes entornos informáticos.
Conceptos Fundamentales de Docker
Contenedores vs Máquinas Virtuales
graph TD
A[Hardware Físico] --> B[Contenedores Docker]
A --> C[Máquinas Virtuales]
B --> D[Ligero]
B --> E[Kernel del SO compartido]
C --> F[Pesado]
C --> G[Sobrecarga completa del SO]
| Característica | Contenedores Docker | Máquinas Virtuales |
|---|---|---|
| Uso de recursos | Ligero | Intenso en recursos |
| Tiempo de inicio | Segundos | Minutos |
| Nivel de aislamiento | Nivel de proceso | Sistema completo |
Arquitectura de Docker
Docker utiliza una arquitectura cliente-servidor con componentes clave:
- Demonio de Docker
- Cliente de Docker
- Registro de Docker
- Imágenes de Docker
- Contenedores de Docker
Comandos Básicos de Docker
Instalar Docker en Ubuntu 22.04:
## Actualizar paquetes del sistema
sudo apt update
## Instalar dependencias de Docker
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Agregar la clave GPG oficial de Docker
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## Configurar el repositorio de Docker
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
## Verificar la instalación de Docker
sudo docker --version
Ejecutando tu Primer Contenedor
## Extraer una imagen de Ubuntu
sudo docker pull ubuntu:latest
## Ejecutar un contenedor interactivo
sudo docker run -it ubuntu:latest /bin/bash
## Listar contenedores en ejecución
sudo docker ps
## Listar todos los contenedores
sudo docker ps -a
Administración de Imágenes
## Buscar imágenes
sudo docker search nginx
## Descargar una imagen
sudo docker pull nginx
## Listar imágenes locales
sudo docker images
Redes de Contenedores
Tipos de Redes Docker
graph TD
A[Tipos de Redes Docker] --> B[Red Puente]
A --> C[Red Anfitrión]
A --> D[Sin Red]
A --> E[Red Overlay]
| Tipo de Red | Descripción | Caso de Uso |
|---|---|---|
| Puente | Red predeterminada | Comunicación aislada entre contenedores |
| Anfitrión | Red del anfitrión directa | Aplicaciones con requisitos de rendimiento |
| Sin Red | Sin acceso a la red | Contenedores completamente aislados |
| Overlay | Red multi-anfitrión | Sistemas de contenedores distribuidos |
Técnicas de Mapeado de Puertos
Mapeado Básico de Puertos
## Mapear el puerto 80 del contenedor al puerto 8080 del anfitrión
sudo docker run -p 8080:80 nginx
## Mapear múltiples puertos
sudo docker run -p 8080:80 -p 3306:3306 myapp
Comandos de Administración de Redes
## Listar redes Docker
sudo docker network ls
## Crear una red personalizada
sudo docker network create mynetwork
## Conectar un contenedor a la red
sudo docker network connect mynetwork mycontainer
## Inspeccionar detalles de la red
sudo docker network inspect bridge
Escenario Avanzado de Redes
## Crear una red puente personalizada
sudo docker network create --driver bridge isolated_network
## Ejecutar contenedores en la red personalizada
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd
Estrategias de Aislamiento de Redes
## Deshabilitar el acceso a la red externa
sudo docker run --network none mycontainer
## Usar la red del anfitrión directamente
sudo docker run --network host mycontainer
Resolución DNS de Contenedores
## Habilitar la resolución DNS automática entre contenedores
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp
Técnicas Avanzadas de Docker
Administración de Recursos de Contenedores
graph TD
A[Administración de Recursos] --> B[Límites de CPU]
A --> C[Restricciones de Memoria]
A --> D[Cuotas de Almacenamiento]
Ejemplo de Asignación de Recursos
## Limitar el contenedor a 1 núcleo de CPU y 512MB de memoria
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash
## Establecer límites de memoria e intercambio
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash
Docker Compose para Implementación Multicontenedor
version: "3"
services:
web:
image: nginx
ports:
- "8080:80"
database:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
Buenas Prácticas de Seguridad
| Técnica de Seguridad | Implementación |
|---|---|
| Contenedores sin root | Usar la directiva USER en el Dockerfile |
| Sistema de archivos de solo lectura | Agregar el indicador :ro a los montajes de volumen |
| Limitar capacidades del contenedor | Usar --cap-drop y --cap-add |
Orquestación de Contenedores con Docker Swarm
## Inicializar el clúster Swarm
sudo docker swarm init
## Crear un servicio con réplicas
sudo docker service create --replicas 3 --name web nginx
## Escalar el servicio dinámicamente
sudo docker service scale web=5
Configuraciones Avanzadas de Redes
## Crear una red personalizada con subred
sudo docker network create \
--driver bridge \
--subnet 192.168.0.0/24 \
--gateway 192.168.0.1 \
custom_network
Monitoreo y Registro de Contenedores
## Registros de contenedores en tiempo real
sudo docker logs -f container_name
## Inspeccionar métricas del contenedor
sudo docker stats container_name
## Limitar el tamaño del archivo de registro
sudo docker run --log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
Técnicas de Optimización de Dockerfile
## Compilación multietapa
FROM maven:3.8.1-openjdk-11 AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Resumen
Docker representa un enfoque transformador para la implementación de software, ofreciendo soluciones de contenedorización ligeras, portátiles y eficientes. Al dominar los conceptos fundamentales, la arquitectura y las técnicas de línea de comandos de Docker, los desarrolladores pueden optimizar el desarrollo de aplicaciones, mejorar la consistencia del sistema y aumentar la escalabilidad y el rendimiento general de la infraestructura.



