Я следую руководству Docker и делаю это в своей версии
version: "3.1"
services:
web:
image: registry.gitlab.com/xxxx/xxxx:latest
deploy:
replicas: 2
ports:
- "8888:80"
mysql:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: user
MYSQL_PASS: password
ports:
- "8889:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Всякий раз, когда я меняю код, я перестраиваю новый образ докера и запускаю обновление.
docker stack deploy --compose-file docker-compose.yml xxxx-learn
Потом заметил простой. Они будут запускать новый контейнер по одному и останавливать старый контейнер за раз. Тогда проблема в том, что для загрузки нового изображения требуется несколько минут, а для запуска веб-сервера требуется время.
Одно из решений, о котором я думал, - это запустить балансировку нагрузки Nginx перед этими двумя репликами веб-сервера. Но есть ли лучшее решение?
Потом заметил простой. Они будут запускать новый контейнер по одному и останавливать старый контейнер по одному. Тогда проблема в том, что загрузка нового образа занимает несколько минут, а для запуска веб-сервера требуется время.
Вам необходимо определить проверку работоспособности для вашего изображения / контейнера. Без этого докер не знает, когда ваше приложение готово обслуживать запросы, и будет отправлять запросы в «еще не готовый» контейнер и отключать оставшийся работающий контейнер вскоре после замены первого.
Проверка работоспособности определяет команду для запуска внутри вашего контейнера для определения работоспособности вашего приложения. Видеть эта документация чтобы узнать, как настроить проверку работоспособности внутри вашего изображения.
Вы должны поместить политику перезапуска и stop_grace_period в свой файл создания:
version: "3.1"
services:
web:
stop_grace_period: 10s
deploy:
replicas: 2
restart_policy:
condition: on-failure