SwarmMode - aleksei-khitev/knowledge_base GitHub Wiki

Swarm Mode

Введен в версии 1.12
Нативно управляемый кластер движков Docker-а
При помози Docker CLI можно создавать swarm, разворачивать приложения в нем и управлять swarm-ом
Swarm - опциональная фича и он должен быть включен

Справка

~$ sudo docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

Run 'docker swarm COMMAND --help' for more information on a command.

Курс Docker for Java Developers

Инициализация Swarm

~$ sudo docker swarm init
Swarm initialized: current node (imwnn40tterwda728n17i16q3) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4me23telenzbzhmqu7ulzvzx0ihluls3x1s0mx136s7qszab4h-3h8akp81c4fk15vsivwjjer0v 192.168.1.28:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Для Windows нужно еще добавить --advertise-addr <ip хоста>
Курс Docker for Java Developers

Информация о Swarm в docker info

~$ sudo docker info
...
Swarm: active
  NodeID: imwnn40tterwda728n17i16q3
  Is Manager: true
  ClusterID: z2n54wk3vvs3wmo8m4lyw7cbh
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 192.168.1.28
  Manager Addresses:
   192.168.1.28:2377
...

Курс Docker for Java Developers

Закрытие (leave) Swarm

~$ sudo docker swarm leave
[sudo] пароль для aleksei_khitev: 
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` to ignore this message.

Но если попытаться сделать leave с ноды с менеджером, то возникнет ошибка.
В этом случае нужно использовать аттрибут --force

~$ sudo docker swarm leave --force
Node left the swarm.

Курс Docker for Java Developers

Создание сервисов с несколькими репликами

~$ sudo docker service create --replicas 3 --name web jboss/wildfly
tjjdyb9p1xjr56lzpufe2q2hg
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
tjjdyb9p1xjr   web       replicated   3/3        jboss/wildfly:latest

Курс Docker for Java Developers

Удаление сервиса

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
tjjdyb9p1xjr   web       replicated   3/3        jboss/wildfly:latest

~$ sudo docker service rm tjjdyb9p1xjr
tjjdyb9p1xjr

~$ sudo docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS

Курс Docker for Java Developers

Создание сервиса с определенным портом

$ sudo docker service create --replicas 3 --name web -p 8080:8080 jboss/wildfly
d8s01vw5r06zsy1xsps2jlvx1
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
d8s01vw5r06z   web       replicated   3/3        jboss/wildfly:latest   *:8080->8080/tcp

Курс Docker for Java Developers

Получение подробной информации о сервисе

$ sudo docker service inspect web
[
    {
        "ID": "d8s01vw5r06zsy1xsps2jlvx1",
        "Version": {
            "Index": 27
        },
        "CreatedAt": "2021-07-14T15:04:09.136017245Z",
        "UpdatedAt": "2021-07-14T15:04:09.138790092Z",
        "Spec": {
...
},
        "Endpoint": {
            "Spec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 8080,
                        "PublishedPort": 8080,
                        "PublishMode": "ingress"
                    }
                ]
            },
            "Ports": [
                {
                    "Protocol": "tcp",
                    "TargetPort": 8080,
                    "PublishedPort": 8080,
                    "PublishMode": "ingress"
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "1659fmovi6bvxckewnszrhg49",
                    "Addr": "10.0.0.3/24"
                }
            ]
        }
    }
]

Курс Docker for Java Developers

Получение информации о репликах сервиса

~$ sudo docker service ps web
ID             NAME      IMAGE                  NODE         DESIRED STATE   CURRENT STATE           ERROR     PORTS
il8oxr48a6sd   web.1     jboss/wildfly:latest   aleksei-PC   Running         Running 4 minutes ago             
0gvmcsov55q0   web.2     jboss/wildfly:latest   aleksei-PC   Running         Running 4 minutes ago             
ma9e91n26i99   web.3     jboss/wildfly:latest   aleksei-PC   Running         Running 4 minutes ago

Курс Docker for Java Developers

Автоподъем новых реплик в случае проблем

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
d8s01vw5r06z   web       replicated   3/3        jboss/wildfly:latest   *:8080->8080/tcp

~$ sudo docker service ps web
ID             NAME      IMAGE                  NODE         DESIRED STATE   CURRENT STATE               ERROR     PORTS
il8oxr48a6sd   web.1     jboss/wildfly:latest   aleksei-PC   Running         Running about an hour ago             
0gvmcsov55q0   web.2     jboss/wildfly:latest   aleksei-PC   Running         Running about an hour ago             
ma9e91n26i99   web.3     jboss/wildfly:latest   aleksei-PC   Running         Running about an hour ago

~$ sudo docker container ls
CONTAINER ID   IMAGE                  COMMAND                  CREATED             STATUS             PORTS      NAMES
c031e9fd01cb   jboss/wildfly:latest   "/opt/jboss/wildfly/…"   About an hour ago   Up About an hour   8080/tcp   web.2.0gvmcsov55q0jf8c8qb373mu4
e73256081a45   jboss/wildfly:latest   "/opt/jboss/wildfly/…"   About an hour ago   Up About an hour   8080/tcp   web.1.il8oxr48a6sdej8cxbpwphqvz
4488b9817710   jboss/wildfly:latest   "/opt/jboss/wildfly/…"   About an hour ago   Up About an hour   8080/tcp   web.3.ma9e91n26i99t0623jsl0m1lk

~$ sudo docker container rm -f e73256081a45
e73256081a45

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
d8s01vw5r06z   web       replicated   2/3        jboss/wildfly:latest   *:8080->8080/tcp

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
d8s01vw5r06z   web       replicated   3/3        jboss/wildfly:latest   *:8080->8080/tcp

~$ sudo docker service ps web
ID             NAME        IMAGE                  NODE         DESIRED STATE   CURRENT STATE               ERROR                         PORTS
raz52pwicvcm   web.1       jboss/wildfly:latest   aleksei-PC   Running         Running 33 seconds ago                                    
il8oxr48a6sd    \_ web.1   jboss/wildfly:latest   aleksei-PC   Shutdown        Failed 38 seconds ago       "task: non-zero exit (137)"   
0gvmcsov55q0   web.2       jboss/wildfly:latest   aleksei-PC   Running         Running about an hour ago                                 
ma9e91n26i99   web.3       jboss/wildfly:latest   aleksei-PC   Running         Running about an hour ago

Новая реплика автоматически создалась, когда реплик стало 2/3
Курс Docker for Java Developers

Скалирование реплик до определенного числа

~$ sudo docker service ls
[sudo] пароль для aleksei_khitev: 
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
d8s01vw5r06z   web       replicated   3/3        jboss/wildfly:latest   *:8080->8080/tcp

~$ sudo docker service scale web=6
web scaled to 6
overall progress: 6 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: running   [==================================================>] 
3/6: running   [==================================================>] 
4/6: running   [==================================================>] 
5/6: running   [==================================================>] 
6/6: running   [==================================================>] 
verify: Service converged

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                  PORTS
d8s01vw5r06z   web       replicated   6/6        jboss/wildfly:latest   *:8080->8080/tcp

Курс Docker for Java Developers

Накатывание обновлений на реплики

Пусть есть сервис с контейнерами из версии #1

~$ sudo docker service create --replicas 6 --name web -p 8080:8080 arungupta/wildfly-app:1
26qnc8ewcj77ufqistmqf35xk
overall progress: 6 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: running   [==================================================>] 
3/6: running   [==================================================>] 
4/6: running   [==================================================>] 
5/6: running   [==================================================>] 
6/6: running   [==================================================>] 
verify: Service converged

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                     PORTS
26qnc8ewcj77   web       replicated   6/6        arungupta/wildfly-app:1   *:8080->8080/tcp

~$ curl http://localhost:8080/app/index.jsp
<html>
<body style="background-color:green;">
<h1>Simple Web Application - v1</h1>
<table>
<tr><td><b>Timestamp<b></td><td> Fri Jul 16 13:08:22 UTC 2021 </td></tr>
<tr><td><b>Local address<b></td><td> 10.0.0.93 </td></tr>
<tr><td><b>Host name<b></td><td> 53ec7ea5f907 </td></tr>
</table>
</body>
</html>

При обновлении указываются:

  • --image - образ docker до которого нужно обновить
  • --update-parallelism - сколько реплик обновляется одновременно
  • --update-delay - сколько выждать между обновлениями реплик
~$ sudo docker service update web --image arungupta/wildfly-app:2 --update-parallelism 2 --update-delay 10s
web
overall progress: 6 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: running   [==================================================>] 
3/6: running   [==================================================>] 
4/6: running   [==================================================>] 
5/6: running   [==================================================>] 
6/6: running   [==================================================>] 
verify: Service converged

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                     PORTS
26qnc8ewcj77   web       replicated   6/6        arungupta/wildfly-app:2   *:8080->8080/tcp

Курс Docker for Java Developers

Работа с кластером

Для работы с кластером используется

$ sudo docker stack --help

Usage:  docker stack [OPTIONS] COMMAND

Manage Docker stacks

Options:
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)

Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

Run 'docker stack COMMAND --help' for more information on a command.

Курс Docker for Java Developers

Деплой приложения в кластер

Деплой выполняется командой
$ sudo docker stack deploy --help

Usage:  docker stack deploy [OPTIONS] STACK

Deploy a new stack or update an existing stack

Aliases:
  deploy, up

Options:
  -c, --compose-file strings   Path to a Compose file, or "-" to read from stdin
      --orchestrator string    Orchestrator to use (swarm|kubernetes|all)
      --prune                  Prune services that are no longer referenced
      --resolve-image string   Query the registry to resolve image digest and supported platforms ("always"|"changed"|"never") (default "always")
      --with-registry-auth     Send registry authentication details to Swarm agents

К примеру

$ ls
docker-compose.yml

$ sudo docker stack deploy --compose-file=docker-compose.yml webapp
Creating network webapp_default
Creating service webapp_web
Creating service webapp_db

$ sudo docker stack ls
NAME      SERVICES   ORCHESTRATOR
webapp    2          Swarm

$ sudo docker service ls
ID             NAME         MODE         REPLICAS   IMAGE                               PORTS
62mzr8dmha7e   webapp_db    replicated   1/1        arungupta/couchbase:travel          *:8091-8093->8091-8093/tcp, *:11210->11210/tcp
ub0vg8fi00t8   webapp_web   replicated   1/1        arungupta/couchbase-javaee:travel   *:8080->8080/tcp, *:9990->9990/tcp

Выполняться должно на manager-е, а не на worker-ах Курс Docker for Java Developers

Удаление стэка из кластера

$ sudo docker stack rm webapp
Removing service webapp_db
Removing service webapp_web
Removing network webapp_default

$ sudo docker stack ls
NAME      SERVICES   ORCHESTRATOR

Курс Docker for Java Developers

Просмотр логов сервиса

$ sudo docker service ls
ID             NAME         MODE         REPLICAS   IMAGE                               PORTS
62mzr8dmha7e   webapp_db    replicated   1/1        arungupta/couchbase:travel          *:8091-8093->8091-8093/tcp, *:11210->11210/tcp
ub0vg8fi00t8   webapp_web   replicated   1/1        arungupta/couchbase-javaee:travel   *:8080->8080/tcp, *:9990->9990/tcp

$ sudo docker service logs webapp_web
webapp_web.1.stqmastz6e8g@aleksei-PC    | =========================================================================
webapp_web.1.stqmastz6e8g@aleksei-PC    | 
webapp_web.1.stqmastz6e8g@aleksei-PC    |   JBoss Bootstrap Environment
...

Курс Docker for Java Developers

Выключить ноду из работы

К примеру, для расширения памяти или замены диска

sudo node update --availability drain <nodename>

Курс Docker for Java Developers

Поставить ноду на паузу

Для дебага к примеру

sudo node update --availability pause <nodename>

Курс Docker for Java Developers

Вернуть активность

sudo node update --availability active <nodename>

Курс Docker for Java Developers

Создание сети

~$ sudo docker network create -d overlay couchbase
[sudo] пароль для aleksei_khitev: 
vrvx33w9w0l2gh0v24nijvval

~$ sudo docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
cfb13df764d9   bridge              bridge    local
vrvx33w9w0l2   couchbase           overlay   swarm
943181c6bb6b   docker_gwbridge     bridge    local
0387e7365798   hellojava_default   bridge    local
ee7a9450757b   host                host      local
1659fmovi6bv   ingress             overlay   swarm
add46023e1f0   none                null      local

-d overlay позволит узлам общаться между собой
Курс Docker for Java Developers

Удаление сети

$ sudo docker network rm couchbase
couchbase

$ sudo docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
cfb13df764d9   bridge              bridge    local
943181c6bb6b   docker_gwbridge     bridge    local
0387e7365798   hellojava_default   bridge    local
ee7a9450757b   host                host      local
1659fmovi6bv   ingress             overlay   swarm
add46023e1f0   none                null      local

Курс Docker for Java Developers

Назад к docker

⚠️ **GitHub.com Fallback** ⚠️