1. Introduction to Docker Stack
In stand-alone mode, we can use Docker Compose to orchestrate multiple services, while Docker Swarm can only implement simple deployment of a single service. The protagonist of this article is Docker Stack. Through Docker Stack, we only need to slightly modify the existing docker-compose.yml configuration file to complete multi-service orchestration in a Docker cluster environment.
2. Docker Stack cluster construction case
Deploy a voting APP, including the following services:
- 5 application services: vote, redis, worker, db, result
- Tool services: portainer and visualizer
First create a docker-compose.yml file, using Docker Compose v3 syntax
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
Deploy the service on the manager node:
[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
Deployment completed:
[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
Browser access:
vote ip:5000
result ip:5001
portainer ip:9000
visualizer ip:8080
1234
3. The difference between Docker Stack and Docker Compose
- Docker stack ignores the "build" command and cannot use the stack command to build a new image. It requires the image to be pre-built. Therefore, docker-compose is more suitable for development scenarios;
- Docker Compose is a Python project that, internally, uses the Docker API specification to operate containers. So Docker-compose needs to be installed for use with Docker on your computer;
- Docker Stack functionality is included in Docker Engine. You don't need to install additional packages to use it, docker stacks are just part of swarm mode.
- Docker stack does not support docker-compose.yml written based on version 2, which means that version is at least 3. However, Docker Compose can still process files with versions 2 and 3;
- Docker stack has done all the work of docker compose, so docker stack will dominate. At the same time, for most users, switching to using the docker stack is neither difficult nor requires much overhead. If you are new to Docker, or are choosing a technology for a new project, use docker stack.
这个命令就是docker stack,它看起来与docker-compose完全相同。 这是一个他们的用法比较:
$ docker-compose -f docker-compose up
$ docker stack deploy -c docker-compose.yml somestackname
4. Docker Stack common commands
Order | describe |
---|---|
docker stack deploy | Deploy a new stack or update an existing stack |
docker stack ls | List existing stacks |
docker stack ps | List the tasks in the stack |
docker stack rm | Delete one or more stacks |
docker stack services | List the services in the stack |