Настройка и Установка 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

Материалы

  1. Более подробно о других полезных командах Docker
  2. Установка Docker на Ubuntu 18.04
  3. Установка Docker на Centos 7
  4. Описание файла compose.yaml
  5. Список шаблонов сервиса
  6. Установите Ubuntu 18.04 на VirtualBox
  7. Описание работы сети в Docker

Остались вопросы?

Если вы хотите получить консультацию или оставить комментарий, опубликуйте свой вопрос на нашем форуме.