Swarm
С помощью команды
root@idudin-swarm-01:~# docker system info | grep Swarm
Swarm: inactive
Мы можем увидеть включен ли сворм на сервере с докером
Включаем если не включен
root@idudin-swarm-01:~# docker swarm init
Swarm initialized: current node (gnf236u9n3gnor2926ro2retb) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0d3es2bdhqlaozr8qzi7w9gu91bcr2m97pdr81e9n0mfeb29sw-4haan920y2de2z45n4jkyzr5f 172.28.103.198:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Подключаем вторую ноду
root@idudin-swarm-02:~# docker swarm join --token SWMTKN-1-0d3es2bdhqlaozr8qzi7w9gu91bcr2m97pdr81e9n0mfeb29sw-4haan920y2de2z45n4jkyzr5f 172.28.103.198:2377
This node joined a swarm as a worker.
Видим что все круто
root@idudin-swarm-01:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
gnf236u9n3gnor2926ro2retb * idudin-swarm-01 Ready Active Leader 20.10.12
uwj0b9w0ussmfhkjmdgev9j19 idudin-swarm-02 Ready Active 20.10.12
- Node - это наши виртуальные машины, на которых установлен docker. Есть
manager
иworkers
ноды. Manager нода управляет workers нодами. Она отвечает за создание/обновление/удаление сервисов на workers, а также за их масштабирование и поддержку в требуемом состоянии. Workers ноды используются только для выполнения поставленных задач и не могут управлять кластером - Stack - это набор сервисов, которые логически связаны между собой. По сути это набор сервисов, которые мы описываем в обычном compose файле. Части stack (services) могут располагаться как на одной ноде, так и на разных
- Service - это как раз то, из чего состоит
stack
. Service является описанием того, какие контейнеры будут создаваться. Если вы пользовалисьdocker-compose.yaml
, то уже знакомы с этой сущностью. Кроме стандартных полей docker в режимеswarm
поддерживает ряд дополнительных, большинство из которых находятся внутри секцииdeploy
- Task - это непосредственно созданный контейнер, который docker создал на основе той информации, которую мы указали при описании
service
. Swarm будет следить за состоянием контейнера и при необходимости его перезапускать или перемещать на другую ноду
Деплоим стэк с wordpress'ом
root@idudin-swarm-01:~# cat wordpress-stack.yaml
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
root@idudin-swarm-01:~# docker stack deploy -c wordpress-stack.yaml wordpress
Ignoring unsupported options: restart
Creating network wordpress_default
Creating service wordpress_db
Creating service wordpress_wordpress
Проверяем
root@idudin-swarm-01:~# docker stack ls
NAME SERVICES ORCHESTRATOR
wordpress 2 Swarm
root@idudin-swarm-01:~# docker stack services wordpress
ID NAME MODE REPLICAS IMAGE PORTS
4arvtnm8p1t6 wordpress_db replicated 1/1 mysql:5.7
pbgau50cuvj8 wordpress_wordpress replicated 1/1 wordpress:latest *:8080->80/tcp
Dockerd повесился на порт 8080 на обеих нодах кластера
root@idudin-swarm-01:~# ss -tlpn | grep 8080
LISTEN 0 4096 *:8080 *:* users:(("dockerd",pid=421243,fd=46))
...
root@idudin-swarm-02:~# ss -tlpn | grep 8080
LISTEN 0 4096 *:8080 *:* users:(("dockerd",pid=1894,fd=35))
То есть можно ставить балансер перед кластером и пулять трафик на любую ноду кластера
🚀 curl -I 172.28.103.198:8080/wp-admin/install.php
HTTP/1.1 200 OK
Date: Mon, 27 Feb 2023 07:38:30 GMT
Server: Apache/2.4.54 (Debian)
X-Powered-By: PHP/8.0.28
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8
🚀 curl -I 172.28.103.98:8080/wp-admin/install.php
HTTP/1.1 200 OK
Date: Mon, 27 Feb 2023 07:38:34 GMT
Server: Apache/2.4.54 (Debian)
X-Powered-By: PHP/8.0.28
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8
No Comments