Skip to content

Docker Swarn

Docker Swarn es una herramienta de orquestación nativa de Docker que permite gestionar múltiples contenedores desplegados en varios servidores (nodos) como si fueran un solo sistema. Esto facilita la implementación, escalado y administración de aplicaciones en contenedores.

Se utiliza para crear y administrar un clúster de nodos Docker, donde cada nodo puede ejecutar uno o más contenedores. Docker Swarm proporciona características como balanceo de carga, descubrimiento de servicios, alta disponibilidad y escalabilidad automática en un grado apropiado (distinto para volúmentes de grandes empresas).

Este documento tiene un alcance sencillo y ágil a modo de abre bocas.

Instalación y configuración inicial

Requisitos previos

Docker Swarm viene incluido con Docker Engine, por lo que no requiere instalación adicional:

bash
# Verificar que Docker esté instalado
docker --version

# Verificar que Swarm esté disponible
docker swarm --help

Inicializar el cluster

bash
# Inicializar Swarm en el nodo manager
docker swarm init --advertise-addr <IP_DEL_MANAGER>

# Ejemplo con IP específica
docker swarm init --advertise-addr 192.168.1.100

# Para una sola máquina (desarrollo)
docker swarm init

Agregar nodos worker

bash
# En el nodo manager, obtener el token
docker swarm join-token worker

# En los nodos worker, ejecutar el comando mostrado
docker swarm join --token SWMTKN-1-xxx... 192.168.1.100:2377

Comandos básicos

bash
# Ver nodos del cluster
docker node ls

# Ver servicios
docker service ls

# Ver tareas de un servicio
docker service ps <service_name>

# Salir del swarm
docker swarm leave --force

Ejemplo de archivo Docker Compose para Swarm

Crear docker-compose.yml:

yaml
version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.role == worker
    networks:
      - webnet

  api:
    image: node:alpine
    command: |
      sh -c "echo 'const http = require(\"http\");
      const server = http.createServer((req, res) => {
        res.writeHead(200, {\"Content-Type\": \"application/json\"});
        res.end(JSON.stringify({message: \"Hello from \" + require(\"os\").hostname()}));
      });
      server.listen(3000, () => console.log(\"API running on port 3000\"));' > app.js && node app.js"
    ports:
      - "3000:3000"
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    networks:
      - webnet

  redis:
    image: redis:alpine
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager
    networks:
      - webnet

networks:
  webnet:
    driver: overlay

volumes:
  redis-data:
    driver: local

Desplegar el stack

bash
# Desplegar el stack
docker stack deploy -c docker-compose.yml myapp

# Ver servicios del stack
docker stack services myapp

# Ver tareas del stack
docker stack ps myapp

# Escalar un servicio
docker service scale myapp_web=5

# Actualizar un servicio
docker service update --image nginx:latest myapp_web

# Eliminar el stack
docker stack rm myapp

Ejemplo sencillo paso a paso

1. Inicializar Swarm

bash
docker swarm init

2. Crear servicio simple

bash
# Crear servicio web con 3 réplicas
docker service create \
  --name web \
  --replicas 3 \
  --publish 8080:80 \
  nginx:alpine

# Verificar el servicio
docker service ls
docker service ps web

3. Escalar el servicio

bash
# Escalar a 5 réplicas
docker service scale web=5

# Verificar escalado
docker service ps web

4. Actualizar el servicio

bash
# Actualizar imagen
docker service update --image nginx:latest web

5. Limpiar

bash
# Eliminar servicio
docker service rm web

# Salir del swarm
docker swarm leave --force

Configuración de red

bash
# Crear red overlay
docker network create --driver overlay mynetwork

# Listar redes
docker network ls

# Crear servicio en red específica
docker service create \
  --name app \
  --network mynetwork \
  --replicas 2 \
  nginx:alpine

Secretos y configuraciones

bash
# Crear secreto
echo "mysecretpassword" | docker secret create db_password -

# Crear configuración
docker config create nginx_config nginx.conf

# Usar en servicio
docker service create \
  --name webapp \
  --secret db_password \
  --config source=nginx_config,target=/etc/nginx/nginx.conf \
  nginx:alpine

¿Por qué continuar abordando Docker Swarm?

Para resumir, Docker Swarn nos ofrece...

  • Simplicidad: Fácil de configurar y usar
  • Integrado: Viene con Docker Engine
  • Escalabilidad: Escalado automático de servicios
  • Alta disponibilidad: Tolerancia a fallos de nodos
  • Balanceo de carga: Distribución automática de tráfico
  • Rolling updates: Actualizaciones sin tiempo de inactividad
  • Seguridad: Comunicación encriptada entre nodos

Docker Swarm es ideal para equipos que buscan orquestación simple sin la complejidad de Kubernetes, perfecto para aplicaciones de tamaño medio y entornos de desarrollo.