1. Introducción a Docker Stack
En modo independiente, podemos usar Docker Compose para organizar múltiples servicios, mientras que Docker Swarm solo puede implementar una implementación simple de un único servicio. El protagonista de este artículo es Docker Stack. A través de Docker Stack, solo necesitamos modificar ligeramente el archivo de configuración docker-compose.yml existente para completar la orquestación multiservicio en un entorno de clúster Docker.
2. Caso de construcción del clúster Docker Stack
Implementar una APP de votación, que incluya los siguientes servicios:
- 5 servicios de aplicación: voto, redis, trabajador, db, resultado
- Servicios de herramientas: portainjerto y visualizador.
Primero cree un archivo docker-compose.yml, usando la sintaxis de Docker Compose v3
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
Implemente el servicio en el nodo administrador:
[root@swarm-manager example-voting-app]# docker stack deploy example --compose-file=docker-compose.yml
Creating network example_frontend
Creating network example_default
Creating network example_backend
Creating service example_result
Creating service example_worker
Creating service example_visualizer
Creating service example_portainer
Creating service example_redis
Creating service example_db
Creating service example_vote
1234567891011
Implementación completada:
[root@swarm-manager example-voting-app]# docker stack services example
ID NAME MODE REPLICAS IMAGE PORTS
cdmrhfag3zje example_vote replicated 2/2 dockersamples/examplevotingapp_vote:before *:5000->80/tcp
csjcltpwvpzs example_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
ihys1qvpz4i5 example_worker replicated 1/1 dockersamples/examplevotingapp_worker:latest
l0ufhl8n0ozg example_portainer replicated 1/1 portainer/portainer:latest *:9000->9000/tcp
m2icguw00ls9 example_db replicated 1/1 postgres:9.4
pu2h7rqzpaa0 example_redis replicated 2/2 redis:alpine *:30001->6379/tcp
tom14od7paf1 example_result replicated 1/1 dockersamples/examplevotingapp_result:before *:5001->80/tcp
123456789
[root@swarm-manager example-voting-app]# docker stack ps example
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
loj1h2dk9l1s example_vote.1 dockersamples/examplevotingapp_vote:before swarm-worker3 Running Running 2 minutes ago
kp4n980ldv49 example_db.1 postgres:9.4 swarm-manager Running Running 2 minutes ago
0hf6d80nwwyf example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Running Running 2 minutes ago
rnjnwhl86ro6 example_redis.1 redis:alpine swarm-worker1 Running Running 2 minutes ago
1376pp1lvrly example_portainer.1 portainer/portainer:latest swarm-manager Running Running 2 minutes ago
xj9a9iu9g2s8 example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Shutdown Failed 2 minutes ago "task: non-zero exit (1)"
g5ts3oiibrhn example_visualizer.1 dockersamples/visualizer:stable swarm-manager Running Running 3 minutes ago
kgcttt1xigu2 example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Shutdown Failed 3 minutes ago "task: non-zero exit (1)"
jpqdinh0st7b \_ example_worker.1 dockersamples/examplevotingapp_worker:latest swarm-manager Shutdown Failed 3 minutes ago "task: non-zero exit (1)"
ff9bq1vcgbz9 example_result.1 dockersamples/examplevotingapp_result:before swarm-manager Running Running 2 minutes ago
q27wp9nna0yc example_vote.2 dockersamples/examplevotingapp_vote:before swarm-worker1 Running Running 2 minutes ago
s6hvxlgdz77v example_redis.2 redis:alpine swarm-worker2 Running Running 2 minutes ago
1234567891011121314
Acceso al navegador:
vote ip:5000
result ip:5001
portainer ip:9000
visualizer ip:8080
1234
3. La diferencia entre Docker Stack y Docker Compose
- La pila de Docker ignora el comando "compilar" y no puede utilizar el comando de pila para crear una nueva imagen. Requiere que la imagen esté preconstruida. Por lo tanto, docker-compose es más adecuado para escenarios de desarrollo;
- Docker Compose es un proyecto de Python que, internamente, utiliza la especificación API de Docker para operar contenedores. Por lo tanto, es necesario instalar Docker-compose para usarlo con Docker en su computadora;
- La funcionalidad Docker Stack está incluida en Docker Engine. No necesita instalar paquetes adicionales para usarlo, las pilas acoplables son solo parte del modo enjambre.
- La pila Docker no admite docker-compose.yml escrito según la versión 2, lo que significa que la versión es al menos 3. Sin embargo, Docker Compose aún puede procesar archivos con las versiones 2 y 3;
- Docker Stack ha hecho todo el trabajo de Docker Compose, por lo que Docker Stack dominará. Al mismo tiempo, para la mayoría de los usuarios, cambiar al uso de la pila acoplable no es difícil ni requiere mucha sobrecarga. Si es nuevo en Docker o está eligiendo una tecnología para un nuevo proyecto, utilice Docker Stack.
这个命令就是docker stack,它看起来与docker-compose完全相同。 这是一个他们的用法比较:
$ docker-compose -f docker-compose up
$ docker stack deploy -c docker-compose.yml somestackname
4. Comandos comunes de Docker Stack
Orden | describir |
---|---|
implementación de la pila acoplable | Implementar una nueva pila o actualizar una pila existente |
pila acoplable ls | Listar pilas existentes |
pila acoplable ps | Enumere las tareas en la pila |
sala de pila acoplable | Eliminar una o más pilas |
servicios de pila acoplable | Listar los servicios en la pila. |