Buscar..


Introducción

Un enjambre es un número de Docker Engines (o nodos ) que despliegan servicios colectivamente. Swarm se utiliza para distribuir el procesamiento en muchas máquinas físicas, virtuales o en la nube.

Sintaxis

Observaciones

El modo enjambre implementa las siguientes características:

  • Gestión de clústeres integrada con Docker Engine.
  • Diseño descentralizado
  • Modelo de servicio declarativo
  • Escalada
  • Reconciliación del estado deseado
  • Redes multi-host
  • Descubrimiento de servicio
  • Balanceo de carga
  • Diseño seguro por defecto
  • Actualizaciones de rodadura

Para obtener más documentación oficial de Docker con respecto a Swarm visit: descripción general del modo Swarm


Comandos CLI en modo enjambre

Haga clic en la descripción de comandos para la documentación

Inicializar un enjambre

docker swarm init [OPTIONS]

Unirse a un enjambre como nodo y / o administrador.

docker swarm join [OPTIONS] HOST:PORT

Crear un nuevo servicio

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

Mostrar información detallada sobre uno o más servicios

docker service inspect [OPTIONS] SERVICE [SERVICE...]

Servicios de lista

docker service ls [OPTIONS]

Eliminar uno o más servicios

docker service rm SERVICE [SERVICE...]

Escala uno o múltiples servicios replicados

docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]

Listar las tareas de uno o más servicios.

docker service ps [OPTIONS] SERVICE [SERVICE...]

Actualizar un servicio

docker service update [OPTIONS] SERVICE

Crea un enjambre en Linux usando docker-machine y VirtualBox

# Create the nodes
# In a real world scenario we would use at least 3 managers to cover the fail of one manager.
docker-machine create -d virtualbox manager
docker-machine create -d virtualbox worker1

# Create the swarm
# It is possible to define a port for the *advertise-addr* and *listen-addr*, if none is defined the default port 2377 will be used.
docker-machine ssh manager \
    docker swarm init \
    --advertise-addr $(docker-machine ip manager)
    --listen-addr $(docker-machine ip manager)

# Extract the Tokens for joining the Swarm
# There are 2 different Tokens for joining the swarm.
MANAGER_TOKEN=$(docker-machine ssh manager docker swarm join-token manager --quiet)
WORKER_TOKEN=$(docker-machine ssh manager docker swarm join-token worker --quiet)


# Join a worker node with the worker token
docker-machine ssh worker1 \
    docker swarm join \
    --token $WORKER_TOKEN \
    --listen-addr $(docker-machine ip worker1) \
    $(docker-machine ip manager):2377



Averiguar trabajador y gerente unirse token

Al automatizar el aprovisionamiento de nuevos nodos en un enjambre, necesita saber cuál es el token de unión correcto para el enjambre, así como la dirección anunciada del administrador. Puede averiguarlo ejecutando los siguientes comandos en cualquiera de los nodos de administrador existentes:

# grab the ipaddress:port of the manager (second last line minus the whitespace)
export MANAGER_ADDRESS=$(docker swarm join-token worker | tail -n 2 |  tr -d '[[:space:]]')

# grab the manager and worker token
export MANAGER_TOKEN=$(docker swarm join-token manager -q)
export WORKER_TOKEN=$(docker swarm join-token worker -q)

La opción -q genera solo el token. Sin esta opción, obtienes el comando completo para registrarte en un enjambre.

Luego, en los nodos recién aprovisionados, puede unirse al enjambre utilizando.

docker swarm join --token $WORKER_TOKEN $MANAGER_ADDRESS

Hola aplicación mundial

Por lo general, desearía crear una pila de servicios para formar una aplicación replicada y orquestada.

Una aplicación web moderna típica consiste en una base de datos, api, frontend y proxy inverso.

Persistencia

La base de datos necesita persistencia, por lo que necesitamos un sistema de archivos que se comparta entre todos los nodos de un enjambre. Puede ser NAS, servidor NFS, GFS2 o cualquier otra cosa. Configurarlo está fuera de alcance aquí. Actualmente Docker no contiene y no administra la persistencia en un enjambre. Este ejemplo asume que hay /nfs/ ubicación compartida montada en todos los nodos.

Red

Para poder comunicarse entre sí, los servicios en un enjambre deben estar en la misma red.

Elija un rango de IP (aquí 10.0.9.0/24 ) y el nombre de la red ( hello-network ) y ejecute un comando:

docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --opt encrypted \
  hello-network

Base de datos

El primer servicio que necesitamos es una base de datos. Usemos postgresql como ejemplo. Cree una carpeta para una base de datos en nfs/postgres y ejecute esto:

docker service create --replicas 1 --name hello-db \
       --network hello-network -e PGDATA=/var/lib/postgresql/data \
       --mount type=bind,src=/nfs/postgres,dst=/var/lib/postgresql/data \
       kiasaki/alpine-postgres:9.5

Tenga en cuenta que hemos utilizado las --network hello-network y --mount .

API

La creación de API está fuera del alcance de este ejemplo, así que supongamos que tiene una imagen de API bajo username/hello-api .

docker service create --replicas 1 --name hello-api \
       --network hello-network \
       -e NODE_ENV=production -e PORT=80 -e POSTGRESQL_HOST=hello-db \
       username/hello-api

Tenga en cuenta que hemos pasado un nombre de nuestro servicio de base de datos. El enjambre Docker tiene un servidor DNS de round-robin integrado, por lo que la API podrá conectarse a la base de datos utilizando su nombre DNS.

Proxy inverso

Creemos el servicio nginx para servir nuestra API a un mundo exterior. Cree archivos de configuración nginx en una ubicación compartida y ejecute esto:

docker service create --replicas 1 --name hello-load-balancer \
       --network hello-network \
       --mount type=bind,src=/nfs/nginx/nginx.conf,dst=/etc/nginx/nginx.conf \
       -p 80:80 \
       nginx:1.10-alpine

Note que hemos usado la opción -p para publicar un puerto. Este puerto estaría disponible para cualquier nodo en un enjambre.

Disponibilidad de nodos

Disponibilidad del nodo de modo de enjambre:

  • Activo significa que el programador puede asignar tareas a un nodo.
  • Pausa significa que el programador no asigna nuevas tareas al nodo, pero las tareas existentes siguen ejecutándose.
  • Drenar significa que el programador no asigna nuevas tareas al nodo. El programador cierra todas las tareas existentes y las programa en un nodo disponible.

Para cambiar la disponibilidad del modo:

#Following commands can be used on swarm manager(s)
docker node update --availability drain node-1
#to verify:
docker node ls

Promover o degradar nodos enjambre

Para promocionar un nodo o un conjunto de nodos, ejecute el programa de la docker node promote desde un nodo administrador:

docker node promote node-3 node-2

Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.

Para degradar un nodo o conjunto de nodos, ejecute docker node demote desde un nodo administrador:

docker node demote node-3 node-2

Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.

Dejando el enjambre

Nodo trabajador:

#Run the following on the worker node to leave the swarm.

docker swarm leave
Node left the swarm.

Si el nodo tiene el rol de administrador , recibirá una advertencia sobre el mantenimiento del quórum de administradores. Puede usar --force para salir en el nodo del administrador:

#Manager Node

docker swarm leave --force
Node left the swarm.

Los nodos que dejaron el Swarm seguirán apareciendo en la salida docker node ls .

Para eliminar nodos de la lista:

docker node rm node-2

node-2


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow