Cómo Construir y Administrar Contenedores Docker de Forma Eficiente

DockerBeginner
Practicar Ahora

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.