Шаг 1: Подготовьте свои ноды
В моей настройке у меня есть один управляющий узел ( manager ) и два рабочих узла (worker).
На каждом хосте настройте файл hosts, чтобы включить все остальные узлы.
sudo vim /etc/hosts
Добавьте в файл следующий контент
192.168.1.10 manager
192.168.1.11 worker-01
192.168.1.12 worker-02
Шаг 2: Установка Docker CE на Ubuntu 20.04
Мы собираемся установить Docker CE на все хосты.
Чтобы установить Docker CE в Ubuntu 20.04, выполните следующие действия:
Установите пакеты зависимостей с помощью следующей команды
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Обновим пакеты:
sudo apt-get update
$ apt-cache policy docker-ce
docker-ce:
Installed: (none)
Candidate: 5:19.03.13~3-0~ubuntu-focal
Version table:
5:19.03.13~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
5:19.03.12~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
5:19.03.11~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
5:19.03.10~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
5:19.03.9~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Package
Установим Docker CE на Ubuntu 20.04
sudo apt install docker-ce
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-10-17 16:28:08 EAT; 57s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 2807 (dockerd)
Tasks: 8
Memory: 37.5M
CGroup: /system.slice/docker.service
└─2807 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Добавьте своего пользователя в группу Docker, чтобы не вводить sudo каждый раз, когда вы запускаете команды Docker.
sudo usermod -aG docker ${USER}
Шаг 3. Создайте кластер Docker Swarm
Чтобы настроить Swarm-кластер, нам сначала нужно инициализировать режим Docker Swarm на управляющем узле, а затем добавить рабочие узлы в кластер.
Выполните приведенную ниже команду, чтобы инициализировать узел Docker Swarm на ноде менеджера:
$ sudo docker swarm init --advertise-addr 192.168.1.10
Swarm initialized: current node (fsuaqqpihi2eabmmq8gldzhpv) is now a manager.
To add a worker to this swarm, run the following command:
sudo docker swarm join --token SWMTKN-1-018kvdektwa74z8fajb5c1u6jyz6qfk4ood8u4qotw7go9jj0p-cfpnh7omy86xcgoh45vau2kaj 192.168.1.10:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Теперь мы собираемся добавить узлы «worker-01» и worker-02 в кластер, используя «join-token» из узла «manager» кластера.
Запустите команду, показанную в выходных данных команды init.
$ sudo docker swarm join --token SWMTKN-1-13xo81gxpb3ttjh5e335pfrmz9fbnliikgfys7u8l4r8k4m575-2gsjwjs3y1i4kgeua2yu840hw 192.168.1.10:2377
This node joined a swarm as a worker.
Убедитесь, что воркер ноды успешно добавлены в кластер, выполнив следующую команду на менеджере:
$ sudo docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
etx5xc5guzftmsqx4naqwvump worker-02 Ready Active 19.03.13
xop4jvrkywz4ldsgwqmfacssc * manager Ready Active Leader 19.03.13
bghrkp7ll1b9lb0ikv8x51gzy worker-01 Ready
Шаг 4: Разверните приложение в кластере
Давайте создадим веб-сервер Nginx для работы на http-порте 80 по умолчанию, а затем предоставим ему порт 8080 на хосте.
$ sudo docker service create --name web-server --publish 8080:80 nginx:1.13-alpine
pq5txw0p9c1qcjrrl2lw3mh5p
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
Подтвердите созданную службу, выполнив следующую команду:
$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
pq5txw0p9c1q web-server replicated 1/1 nginx:1.13-alpine *:8080->80/tcp
Шаг 5: Реплики и масштабирование службы.
Мы собираемся сделать 3 реплики службы веб-сервера, чтобы она была доступна для менеджера и двух рабочих узлов.
$sudo docker service scale web-server=3
web-server scaled to 3
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
pq5txw0p9c1q web-server replicated 3/3 nginx:1.13-alpine *:8080->80/tcp