Настройка и Установка Docker Swarm
Docker Swarm — это простой кластер виртуальных машин. Для его создания нужно несколько серверов (нод)
Все сервера должны быть Ubuntu версией не ниже 18.04. Сделайте сначала базовую настройка Ubuntu Server 18.04.
Для локального тестирования можно установить Docker Swarm в LXC.
Инструкция по запуску Docker Swarm
Установите Docker на всех хостах:
curl -sSL https://get.docker.com | sh
systemctl enable docker
systemctl start docker
apt-get install docker-compose
Добавьте правила в IPTables:
iptables -A INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 4789 -j ACCEPT
или пропишите в файл /etc/iptables/rules.v4 перед строчкой -A ALLOW-INPUT -j RETURN
# Разрешаем входящие соединения Docker swarm
-A ALLOW-INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
-A ALLOW-INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
-A ALLOW-INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
-A ALLOW-INPUT -p udp -m udp --dport 7946 -j ACCEPT
-A ALLOW-INPUT -p udp -m udp --dport 4789 -j ACCEPT
# Разрешаем DNS для кластера Docker
-A ALLOW-INPUT -i docker0 -p udp -m udp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker0 -p tcp -m tcp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker_gwbridge -p udp -m udp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker_gwbridge -p tcp -m tcp --dport 53 -j ACCEPT
Подключитесь к одному (главному) серверу и выполните команду:
docker swarm init --advertise-addr ВНЕШНИЙ-IP-АДРЕС
Выдаст ключ подключения к Docker swarm. Если вы забыли Token, то введите команду docker swarm join-token manager на primary node
Подключитесь к остальным серверам и выполните команду:
docker swarm join --token TOKEN IP-АДРЕС-ГЛАВНОГО-СЕРВЕРА
Установите dnsmasq
На каждый хост установите dnsmasq.
Автоматическое удаление остановленных контейнеров
При создании новых сервисов, docker не удаляет старые контейнеры. Чтобы они удалялись, в крон пропишите строчку:
0 0 * * * yes | docker container prune -y > /dev/null
0 0 * * * yes | docker image prune -y > /dev/null
Логи сервера
Для хранения логов рекомендуется journald. В файле /etc/docker/daemon.json пропишите:
{
"log-driver": "journald",
"log-opts": {
"labels":"com.docker.swarm.service.name"
},
"dns": ["172.17.0.1"]
}
Также следует ограничить максимальный размер логово journald. Пропишите в /etc/systemd/journald.conf строчку:
SystemMaxUse=10G
Это строчка ограничивает максимальный размер логов в 10 гигабайт
Перезагрузите конфигурацию докер и сервис systemd:
service docker reload
systemctl daemon-reload
Проверка работы кластера
Перейдите в домашнюю папку:
cd ~
Узнайте ID ноды:
docker node inspect self --pretty
Установите ноде label dev
docker node update --label-add type=dev ID-НОДЫ
Создайте файл nano compose.yaml
version: "3.3"
services:
nginx:
image: nginx:latest
labels:
name: nginx
version: 1.0
deploy:
replicas: 1
update_config:
parallelism: 1
failure_action: rollback
delay: 5s
restart_policy:
condition: "on-failure"
delay: 10s
window: 120s
placement:
constraints:
- "node.labels.type == dev"
ports:
- "80:80"
networks:
- backend
logging:
driver: journald
networks:
backend:
driver: overlay
attachable: true
Запустите сервис:
docker stack deploy --compose-file compose.yaml dev
Подождите некоторое время и проверьте запустился ли контейнер командой docker ps
root@ubuntu-vbox:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0c9613fd4bc nginx:latest "nginx -g 'daemon of…" 50 seconds ago Up 49 seconds 80/tcp dev_nginx.1.uxoz1ajcuhcex0clccbhb7q7o
Откройте браузер и проверьте работу nginx http://IP-АДРЕС-НОДЫ/
После того, как проверили работу, удалите dev stack:
docker stack rm dev
Ошибки ноды
Если при вызове команды docker node ls выходит ошибка
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
то нужно пересоздать кластер.
docker swarm init --force-new-cluster --advertise-addr SERVER_IP
иногда может потребоваться перезагрузить докер
service stop docker
service start docker
Ошибка сертификата
Бывает если долго не запускать кластер, то сертификат кластера может быть просрочен, и тогда кластер не запуститься. Нужно будет его заново пересоздать.
Проверка сертификата:
openssl x509 -in /var/lib/docker/swarm/certificates/swarm-node.crt -text
Продлить сертификат на 1 год:
docker swarm update --cert-expiry 8760h