
Я следую руководству 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 и запускаю обновление.
docker stack deploy --compose-file docker-compose.yml xxxx-learn
Затем я заметил некоторое время простоя. Они запускают новый контейнер по одному и останавливают старый контейнер по одному. Затем проблема в том, что загрузка нового образа занимает несколько минут, а веб-серверу требуется время для запуска.
Одно из решений, о котором я думал, — запустить балансировку нагрузки Nginx перед этими двумя репликами веб-сервера. Но есть ли лучшее решение?
решение1
Вам следует добавить политику перезапуска и stop_grace_period в ваш файл Compose:
version: "3.1"
services:
web:
stop_grace_period: 10s
deploy:
replicas: 2
restart_policy:
condition: on-failure
решение2
Затем я заметил некоторое время простоя. Они запускают новый контейнер по одному и останавливают старый контейнер по одному. Затем проблема в том, что загрузка нового образа занимает несколько минут, а веб-серверу требуется время для запуска.
Вам необходимо определить проверку работоспособности для вашего образа/контейнера. Без этого docker не будет знать, когда ваше приложение готово обслуживать запросы, и будет отправлять запросы в «еще не готовый» контейнер и завершит работу оставшегося работающего контейнера вскоре после замены первого.
Healthcheck определяет команду, которую нужно запустить внутри контейнера, чтобы определить, является ли ваше приложение работоспособным. См.эта документацияо том, как настроить проверку работоспособности внутри вашего образа.