В моих предыдущих двух статьях я писал о docker basic и docker-compose, где мы развертывали реальные приложения в Docker-контейнере с помощью Docker CLI и docker-compose. В первой статье мы использовали Dockerfile для настройки нашей среды и развернули приложение, запустив контейнеры отдельно, а затем построили связь между каждым из них.
Во второй статье мы запустили несколько контейнеров с помощью инструмента docker-compose . Но для масштабирования и высокой доступности нам нужно запускать наше приложение на нескольких хост-машинах с кластерными средствами. Для организации распределенных систем любого масштаба для достижения масштабируемости и высокой доступности Docker имеет собственную реализацию под названием Swarm. Swarm использует библиотеку SwarmKit для оркестровки.
Обзор SwarmKit
SwarmKit — это обнаружение узлов, консенсус, основанный на плотах, планирование задач, инструментарий оркестровки на основе примитивов, который может масштабировать распределенную систему. Этот инструментарий использует согласованный алгоритм Raft для координации и принятия решений в распределенной системе. SwarmKit отвечает за оркестровку, планирование и управление кластерами.
Важные условия
Мы уже узнали некоторые важные термины о Docker, контейнерах, изображениях и т. Д. Теперь мы попытаемся развернуть приложение с масштабируемостью. С точки зрения Docker, Swarm организует большое количество хостов и поддерживает масштабируемость и высокую доступность.
Некоторые ключевые термины Docker Swarm перечислены ниже:
Узел . С точки зрения оркестровки, узел является хост-машиной. Узлом может быть несколько виртуальных машин на одном хост-компьютере.
Узел диспетчера : этот узел отвечает за поддержание оркестровки Swarm. Управляет кластерной средой.
Рабочий узел : этот узел отвечает за выполнение задач, определенных узлом менеджера. Он всегда будет уведомлять о своем состоянии узел диспетчера и предоставлять услуги, которые ему назначены.
Сервис : это задачи, которые выполняются на узле диспетчера или рабочего.
Вам также может понравиться:
Мониторинг Docker Swarm .
Настройка Swarm Node и пример соединения
Мы обсуждали Docker CLI и Docker-Compose в моих предыдущих двух статьях с реальными проектами. Теперь мы будем практиковать развертывание приложения на нескольких хостах / виртуальных машинах на одном компьютере с помощью Docker Swarm. Перед этим мы проверим информацию Docker командой docker info
. В моем случае он возвращает следующий снимок:
Здесь мы видим, что Docker Swarm находится в неактивном состоянии. Итак, мы должны инициализировать Рой. Одна из самых важных вещей, которую следует запомнить, — убедиться, что на вашей машине установлена виртуальная машина. Если у вас не установлена виртуальная машина, сначала установите виртуальную машину, а затем перейдите к дальнейшим шагам.
Теперь мы создадим три машины Docker. Один из них предназначен для узла управления, а два других — для рабочих узлов. Для этого мы будем использовать следующие команды:
docker-machine create --driver virtualbox manager
ReStructuredText
xxxxxxxxxx
1
Sanjoys-MacBook-Pro:~ sanjoy$ docker-machine create --driver virtualbox manager
2
Running pre-create checks...
3
Creating machine...
4
(manager) Copying /Users/sanjoy/.docker/machine/cache/boot2docker.iso to /Users/sanjoy/.docker/machine/machines/manager/boot2docker.iso...
5
(manager) Creating VirtualBox VM...
6
(manager) Creating SSH key...
7
(manager) Starting the VM...
8
(manager) Check network to re-create if needed...
9
(manager) Waiting for an IP...
10
Waiting for machine to be running, this may take a few minutes...
11
Detecting operating system of created instance...
12
Waiting for SSH to be available...
13
Detecting the provisioner...
14
Provisioning with boot2docker...
15
Copying certs to the local machine directory...
16
Copying certs to the remote machine...
17
Setting Docker configuration on the remote daemon...
18
Checking connection to Docker...
19
Docker is up and running!
20
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env manager
21
Sanjoys-MacBook-Pro:~ sanjoy$
Выполнив предыдущую команду, мы создали узел диспетчера. Точно так же мы создадим два рабочих узла / машины.
docker-machine env manager
Команда покажет информацию окружения для диспетчера узла. В моем случае это возвращает:
ReStructuredText
xxxxxxxxxx
1
Sanjoys-MacBook-Pro:book-manager sanjoy$ docker-machine env manager
2
export DOCKER_TLS_VERIFY="1"
3
export DOCKER_HOST="tcp://192.168.99.135:2376"
4
export DOCKER_CERT_PATH="/Users/sanjoy/.docker/machine/machines/manager"
5
export DOCKER_MACHINE_NAME="manager"
6
# Run this command to configure your shell:
7
# eval $(docker-machine env manager)
Мы должны запустить eval $(docker-machine env manager)
команду для настройки нашей оболочки. Затем мы можем получить два наших рабочих узла с помощью следующих команд:
docker-machine create --driver virtualbox worker1
docker-machine create --driver virtualbox worker2
После выполнения этой команды мы должны проверить созданные машины, выполнив docker-machine ls
команду. В моем случае вывод этой команды выглядит следующим образом:
ReStructuredText
xxxxxxxxxx
1
Sanjoys-MacBook-Pro:book-manager sanjoy$ docker-machine ls
2
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
3
manager * virtualbox Running tcp://192.168.99.135:2376 v19.03.5
4
worker1 - virtualbox Running tcp://192.168.99.136:2376 v19.03.5
5
worker2 - virtualbox Running tcp://192.168.99.137:2376 v19.03.5
Теперь, если мы запустим docker node ls
, он вернет следующее сообщение:
Ответ от демона об ошибке: Этот узел не является администратором роя. Используйте «docker swarm init» или «docker swarm join», чтобы подключить этот узел к рою и повторить попытку.
Итак, теперь мы будем ssh
с менеджером машины, используя docker-machine ssh manager
. Оказавшись на машине менеджера, мы запустим Swarm, используя:
docker swarm init --advertise-addr 192.168.99.135
В вашем случае IP-адрес будет IP-адресом узла диспетчера. В моем случае команда возвращает:
Простой текст
xxxxxxxxxx
1
docker@manager:~$ docker swarm init --advertise-addr 192.168.99.135
2
Swarm initialized: current node (ju6g0zh2me1a4hrws0yzvb30v) is now a manager.
3
To add a worker to this swarm, run the following command:
5
docker swarm join --token SWMTKN-1-5zsxl3dvxh4rneiq0b7j7zcb6fyd5i5e3l0fjzq8ecype9sa1a-eag36fosligj7iooh3xnndcmn 192.168.99.135:2377
7
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Теперь нам нужно войти в систему на двух других рабочих машинах ssh
и использовать docker swarm join
команду, которая была возвращена как swarm init command
инструкция ответа.
В обоих работах мы выполним:
docker swarm join --token SWMTKN-1-5zsxl3dvxh4rneiq0b7j7zcb6fyd5i5e3l0fjzq8ec
ype9sa1a-eag36fosligj7iooh3xnndcmn 192.168.99.135:2377
Тест Рой Узлы
Теперь мы снова вернемся ssh
к диспетчеру машины и выполним docker node ls
команду. В моем случае это возвращает:
Здесь мы видим, что MANAGER STATUS
это Leader
для узла менеджера. Мы можем запускать и просматривать любую информацию о Docker с этого узла, но не с наших рабочих узлов.
Настройка MySQL
Мы будем устанавливать MySQL только в узле диспетчера. Мы пропустим кластеризацию базы данных. Я думаю, что наша оболочка использует среду менеджера. Итак, мы можем следовать части « Настройка MySQL» в моей первой статье и выполнить следующую команду:
Оболочка
xxxxxxxxxx
1
docker run -d -p 6033:3306 --name=docker-mysql --env="MYSQL_ROOT_PASSWORD=root" --env="MYSQL_PASSWORD=root" --env="MYSQL_DATABASE=book_manager" mysql
После запуска контейнера мы импортируем наш SQL-скрипт, выполнив следующую команду. Мы можем получить файл сценария здесь .
Оболочка
xxxxxxxxxx
1
docker exec -i docker-mysql mysql -uroot -proot book_manager <book_manager.sql
Если мы хотим протестировать нашу настройку MySQL или детали настройки, пожалуйста, проверьте часть настройки MySQL этой статьи .
Разверните наше приложение
Чтобы развернуть приложение, нам нужно клонировать проект отсюда . Теперь мы переместимся в корневой каталог проекта ( book_manager ), а затем извлечем из него ветку docker-swarm . После этого нам нужно обновить источник данных в application.properties . Мы обновим следующий IP-адрес с помощью IP-адреса нашего узла менеджера.
Оболочка
xxxxxxxxxx
1
spring.datasource.url=jdbc:mysql://192.168.99.135:6033/book_manager
Теперь мы запустим gradle clean build
команду для создания этого проекта.
Groovy
xxxxxxxxxx
1
version: '3'
2
services:
3
book-manager-app:
4
restart: always
5
build: ./
6
image: flopcoder/book-manager
7
networks:
8
- book_network
9
expose:
10
- "10222"
11
ports:
12
- 10222:10222
13
networks:
14
book_network:
15
driver: overlay
Здесь мы видим, что я использовал flopcoder / book_manager в качестве имени изображения. Мы должны обновить наш собственный идентификатор Docker Hub. После завершения сборки мы будем запускать для создания наших образов Docker. docker-compose build
Я думаю, что если бы вы следовали всем моим статьям, у вас есть аккаунт на Docker Hub. После завершения сборки мы запустим docker-compose push
отправку образов сборки в Docker Hub . Поскольку мы используем режим Docker Swarm, мы развернем наш проект с помощью Docker Stack. Теперь мы запустим следующую команду:
docker stack deploy --compose-file docker-compose.yml book_manager
В моем случае это вернуло:
Джава
xxxxxxxxxx
1
Sanjoys-MacBook-Pro:book-manager sanjoy$ docker stack deploy --compose-file docker-compose.yml book_manager
2
Ignoring unsupported options: build, restart
3
Ignoring deprecated options:
5
expose: Exposing ports is unnecessary - services on the same network can access each other's containers on any port.
7
Creating network book_manager_book_network
9
Creating service book_manager_book-manager-app
Для развертывания образов на всех узлах Swarm потребуется некоторое время. Вы можете проверить журнал, используя следующую команду:
docker service logs book_manager_book-manager-app
Мы также можем увеличить наше развертывание с помощью следующей команды
docker service scale book_manager_book-manager-app=3
После этого мы проверим запущенные масштабированные контейнеры на разных узлах:
Простой текст
xxxxxxxxxx
1
Sanjoys-MacBook-Pro:book-manager sanjoy$ docker service ps book_manager_book-manager-app
2
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
3
jzoligqpevng book_manager_book-manager-app.1 flopcoder/book-manager:latest manager Running Running 6 minutes ago
4
s6ni8nm1e8c5 book_manager_book-manager-app.2 flopcoder/book-manager:latest worker2 Running Running 4 minutes ago
5
p1irtx2m64hq book_manager_book-manager-app.3 flopcoder/book-manager:latest worker1 Running Running about a minute ago
Через некоторое время вы можете перейти по следующим URL:
http://192.168.99.137:10222/author .
http://192.168.99.136:10222/author .
http://192.168.99.135:10222/author .
Все три узла вернут один и тот же список авторов.
Visualizer
Мы можем настроить сервис визуализатора с помощью следующей команды:
Джава
xxxxxxxxxx
1
docker service create \
2
-p 8080:8080 \
3
--constraint=node.role==manager \
4
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
5
dockersamples/visualizer
После создания службы визуализатора мы можем проверить состояние наших кластеризованных служб на порту 8080 ( визуализатор ). В моем случае после нажатия http://192.168.99.135:8080/ из моего браузера это выглядит так:
Некоторые важные команды
- запуск Docker-машины имя_узла; # Используйте для запуска остановленного узла
- остановка докера-машины имя_узла; # Используйте, чтобы остановить работающий узел
- докер-машина ls; # Используйте для проверки узлов докера
- IP-адрес Docker-машины; # Используйте для проверки ip узла
- док-узел ls; # Используйте для проверки списка узлов
- докер ps; # Использовать для проверки запущенных сервисов;
- масштаб сервиса докера веб = 6; # Используйте масштабирование приложения
- Журналы службы докера -f имя_службы; # Используйте, чтобы увидеть журнал сервиса
- док-узел проверяет себя; # Используйте для проверки информации об узле
- Докер узел проверяет имя_узла # Используется для проверки информации об узле
- докер узел ps имя_узла; # Используйте для проверки запущенных сервисов в узле
- проверка узла докера - довольно имя_узла; # Используйте для проверки информации об узле
- Docker-контейнер ls # Используйте для проверки списка контейнеров.
- докер контейнер rm имя_ контейнера; # Используйте для удаления контейнера
- изображение докера ls; # Используйте для проверки списка изображений
- докер image rm image_name; # Используйте для удаления изображения
- сборка docker-compose # Используется для создания образов
- docker-compose up # Используется для развертывания изображений
- docker-compose up --build #Use для развертывания образов после сборки
- docker-compose down # Использовать для отключения контейнера
- docker exec -it docker-mysql bash; # Использование доступа к контейнеру MySQL
- сервисы стека докеров book_manager; # Используйте для проверки сервисов в стеке book_manager
- стек док-станции rm имя_службы # Используется для удаления службы из стека
- Docker stack ls # Используется для проверки списка стеков
Я думаю, что это все, что вам нужно для начала работы с Docker Swarm с Spring Boot и MySQL. Спасибо за прочтение!
NB . В этой статье я использовал IP-адрес виртуальной машины моего хост-компьютера. Вы должны изменить его на свой.
Счастливой кластеризации !!!