Docker Stack deploys multi-service clusters

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
    Insert image description here

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

Insert image description here
Insert image description here

Insert image description here
Insert image description here

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

Guess you like

Origin blog.csdn.net/qq_36306519/article/details/130877724