Primeros pasos con Docker: Contenedores en Linux

Introducción a Docker en Linux

Docker se ha convertido en una de las tecnologías más importantes en el mundo del deploy y la devops. Gracias a su capacidad para empaquetar aplicaciones junto con todas sus dependencias en contenedores, garantiza que el software se ejecute de forma consistente en distintos entornos. En este artículo examinaremos los primeros pasos con Docker en Linux, desde la instalación hasta las prácticas recomendadas de seguridad y redes avanzadas con VPN.

1. ¿Qué es Docker

Docker es una plataforma open source que automatiza el despliegue de aplicaciones en contenedores. Un contenedor es una unidad estandarizada de software que agrupa el código de la aplicación y todas sus dependencias, asegurando que la aplicación se ejecute de forma rápida y fiable en cualquier entorno.

1.1 Arquitectura básica

  • Docker Daemon: Servicio en segundo plano que gestiona contenedores e imágenes.
  • Docker Client: Interfaz de línea de comandos (CLI) para interactuar con el daemon.
  • Imágenes: Instantáneas inmutables que contienen el sistema de archivos y configuración.
  • Contenedores: Instancias en ejecución de imágenes, aisladas entre sí.

1.2 Contenedores vs Máquinas Virtuales

Característica Contenedores Máquinas Virtuales
Sobrecarga Ligera Alta
Arranque Milisegundos Minutos
Aislamiento Kernel compartido Kernel propio

2. Instalación de Docker en Linux

La instalación puede variar ligeramente según la distribución, pero los pasos generales para distribuciones basadas en Debian/Ubuntu son:

  1. Actualizar índices de paquetes:
    sudo apt-get update
  2. Instalar dependencias:
    sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
  3. Añadir 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
  4. 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 gt/dev/null
  5. Instalar Docker Engine:
    sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
  6. Verificar instalación:
    sudo docker version

3. Primeros comandos de Docker

Una vez instalado, los comandos básicos permiten familiarizarse rápidamente:

  • sudo docker run hello-world: Verifica la instalación.
  • sudo docker ps: Lista contenedores en ejecución.
  • sudo docker ps -a: Lista todos los contenedores.
  • sudo docker images: Lista imágenes descargadas.
  • sudo docker pull ubuntu:latest: Descarga la imagen oficial de Ubuntu.
  • sudo docker stop ltcontainer_idgt: Detiene un contenedor.
  • sudo docker rm ltcontainer_idgt: Elimina un contenedor detenido.

4. Creación de un Dockerfile

Un Dockerfile es un fichero de texto que define paso a paso cómo construir una imagen personalizada. Veamos un ejemplo para una aplicación Node.js:

FROM node:14-alpine

# Crear directorio de la aplicación
WORKDIR /usr/src/app

# Copiar dependencias e instalarlas
COPY package.json ./
RUN npm install --only=production

# Copiar el código de la aplicación
COPY . .

# Exponer el puerto de la app
EXPOSE 3000

# Comando para iniciar la app
CMD [node, server.js]
  

Para construir la imagen:

sudo docker build -t mi-aplicacion-node:1.0 .

5. Gestión de redes y VPN en Docker

Docker proporciona varios drivers de red (bridge, host, overlay, etc.). Para entornos distribuidos y seguros, a veces se integran soluciones de VPN en o fuera de los contenedores.

5.1 Redes por defecto

  • bridge: Red interna aislada.
  • host: Comparte la interfaz de red con el host.
  • none: Sin red.
  • overlay: Red para múltiples hosts Docker.

5.2 Integración con VPN

Para comunicaciones seguras entre contenedores en distintos hosts puedes usar:

  • OpenVPN: Solución madura para túneles seguros.
  • WireGuard: Protocol eficiente y moderno, fácil de configurar.
  • strongSwan: Implementación de IPSec de alto rendimiento.

Ejemplo de implementación básica de WireGuard en un host Docker:

  1. Instalar wireguard-tools.
  2. Generar pares de claves:
    wg genkey gt private.key
    wg pubkey lt private.key gt public.key
  3. Configurar /etc/wireguard/wg0.conf con keys y IPs.
  4. Levantar interfaz:
    sudo wg-quick up wg0
  5. Crear red Docker personalizada:
    sudo docker network create --driver=bridge --subnet=10.10.0.0/16 red_wg
  6. Levantar contenedores conectados a red_wg.

6. Volúmenes y persistencia de datos

Los contenedores son efímeros: si se borran, los datos internos desaparecen. Para mantener datos:

  • Volúmenes gestionados por Docker: Independientes del filesystem del host.
  • Bind mounts: Carpetas específicas del host.

Ejemplo de volumen en docker run:

sudo docker run -d -v mi_volumen:/var/lib/mysql mysql:5.7

7. Imágenes y publicación en Docker Hub

Para compartir imágenes:

  1. Login en Docker Hub:
    sudo docker login
  2. Etiquetar imagen:
    sudo docker tag mi-aplicacion-node:1.0 usuario/mi-aplicacion-node:1.0
  3. Enviar imagen:
    sudo docker push usuario/mi-aplicacion-node:1.0

8. Buenas prácticas y seguridad

  • Usar imágenes oficiales y actualizadas.
  • Limitar privilegios de contenedor: evitar --privileged si no es necesario.
  • Configurar user namespaces: mapea IDs de usuario para prevenir escaladas.
  • Escanear vulnerabilidades: herramientas como docker scan o Clair.
  • Revisar políticas de red: usar network policies y firewall en el host.

Conclusión

Docker en Linux ofrece un modelo ligero y potente para desplegar aplicaciones de forma consistente. Desde la instalación hasta la creación de redes seguras con soluciones de VPN como OpenVPN, WireGuard o strongSwan, este artículo cubre los primeros pasos y las mejores prácticas. Con estos conocimientos podrás elaborar arquitecturas más complejas, orquestar con Kubernetes o Docker Swarm, y mantener tus despliegues robustos y seguros.

  • Hola 👋 , soy la IA de Linuxmind.dev, te puedo ayudar a aprender.
Gathering thoughts ...

Leave a Reply

Your email address will not be published. Required fields are marked *