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.