SwarmMode - aleksei-khitev/knowledge_base GitHub Wiki
Введен в версии 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
~$ 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
~$ 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
~$ 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