Простое приложение с Docker: запуск сервиса, масштабирование приложения

Запуск приложения с балансировкой нагрузки

Прежде чем мы сможем использовать команду docker stack deploy, мы сначала запустим:

docker swarm init

Примечание. Описание docker swarm будет в последующих постах. Если вы не запустите docker swarm init, вы получите сообщение об ошибке “this node is not a swarm manager”.

Теперь давайте запустим это. Вы должны дать своему приложению имя. Здесь установлено значение getstartedlab:

docker stack deploy -c docker-compose.yml getstartedlab

В нашем единственном стеке службы запущено 5 экземпляров нашего развернутого образа на одном хосте. Рассмотрим их подробней.

Получите идентификатор службы (service ID) для одной службы в нашем приложении:

docker service ls

Ищите выходные данные для web службы, с добавлением имени вашего приложения. Если вы назвали его так же, как показано в этом примере, это имя getstartedlab_web. Также указывается идентификатор службы, а также количество реплик, имя образа и открытые порты.

В качестве альтернативы, вы можете запустить docker stack services, за которыми следует имя вашего стека. В следующем примере команда позволяет просмотреть все службы, связанные со стеком getstartedlab:

docker stack services getstartedlab

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
bqpve1djnk0x        getstartedlab_web   replicated          5/5                 username/repo:tag   *:4000->80/tcp

Один контейнер, запущенный в службе, называется задачей (task). Задачам присваиваются уникальные идентификаторы, которые увеличиваются численно, вплоть до количества реплик, определенных вами в docker-compose.yml. Перечислите задачи для вашего сервиса:

docker service ps getstartedlab_web

Задачи также отображаются, если вы просто перечислите все контейнеры в вашей системе, хотя это не фильтруется сервисом:

docker container ls -q

Вы можете запустить curl -4 http://localhost:4000 несколько раз подряд или перейти по этому URL в вашем браузере и нажать несколько раз обновить.

В любом случае, идентификатор контейнера изменяется, демонстрируя распределение нагрузки; при каждом запросе для ответа выбирается одна из 5 задач. Идентификаторы контейнера соответствуют вашему выводу из предыдущей команды (docker container ls -q).

Чтобы просмотреть все задачи стека, вы можете запустить docker stack ps, а затем имя вашего приложения, как показано в следующем примере:

docker stack ps getstartedlab

ID                  NAME                  IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
uwiaw67sc0eh        getstartedlab_web.1   username/repo:tag   docker-desktop      Running             Running 9 minutes ago                       
sk50xbhmcae7        getstartedlab_web.2   username/repo:tag   docker-desktop      Running             Running 9 minutes ago                       
c4uuw5i6h02j        getstartedlab_web.3   username/repo:tag   docker-desktop      Running             Running 9 minutes ago
0dyb70ixu25s        getstartedlab_web.4   username/repo:tag   docker-desktop      Running             Running 9 minutes ago                       
aocrb88ap8b0        getstartedlab_web.5   username/repo:tag   docker-desktop      Running             Running 9 minutes ago

Разбор трудностей

Запуск Windows 10?

В Windows 10 PowerShell уже должен быть доступен curl, но в противном случае вы можете получить эмулятор терминала Linux, такой как Git BASH, или загрузить wget для Windows, который очень похож.

Медленное время отклика?

В зависимости от конфигурации сети вашей среды, контейнеры могут отвечать на запросы HTTP до 30 секунд. Это не указывает на производительность Docker или swarm, а скорее на неудовлетворенную зависимость Redis, о которой мы поговорим позже. Пока счетчик посетителей не работает по той же причине; мы еще не добавили сервис для сохранения данных.

Масштабировать приложение

Вы можете масштабировать приложение путем изменения значения поля replicas в docker-compose.yml, сохранения изменений и повторного запуска команды docker stack deploy:

docker stack deploy -c docker-compose.yml getstartedlab

Docker выполняет обновление на месте, нет необходимости сначала сносить стек или уничтожать любые контейнеры.

Теперь перезапустите docker-контейнер ls -q, чтобы увидеть, как развернутые экземпляры реконфигурированы. Если вы масштабируете реплики, запускается больше задач и, следовательно, больше контейнеров.

Свертывание приложения и swarm

Сверните приложение с помощью docker stack rm:

docker stack rm getstartedlab

Сверните swarm.

docker swarm leave --force


Читайте также:


Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий