Ответ 1
Насколько я понял, вы используете capistrano на хосте, чтобы перераспределить весь стек приложения, означает контейнеры. Таким образом, вы используете capistrano для организации создания, создания контейнеров и, следовательно, для развертывания.
Пока вы делаете это в основном, при запуске кепки развертывания
- создайте приложение (на основе текущей базы, которую вы нанесли на хост) - возможно, даже включает в себя задачи gulp/grunt/build
- тогда вы "упаковываете" его в свои контейнеры с помощью "томов"
- во время запуска/замены контейнеров
Вы делаете это, чтобы получить "почти" нулевое время простоя.
Если вы действительно заботитесь о времени простоя и о формализации процесса развертывания, вы должны сделать это правильно, используя правильную реализацию конвейера для
- упаковка /ci
- развертывание/распространение
Я не думаю, что capistrano может/должен быть одним из инструментов, которые вы можете использовать во время этой стратегии. Capistrano предназначен для развертывания приложения непосредственно на сервере с использованием ssh и git в качестве транспорта. Используя cap для создания целых изображений на целевом сервере, чтобы затем запускать их в качестве контейнеров, на самом деле стоит верх, IMHO.
упаковка/здание
Используйте CI/CD-сервер, например jenkins/bamboo/gocd, для создания образа-образа для вашего приложения. Предполагая, что только приложение настроено с точки зрения "выпуска", скажем, у вас есть db и app в качестве контейнеров/сервисов, приложение будет включать ваш исходный код и будет регулярно изменяться во время релизов.
Таким образом, это процесс CD/CI для создания нового приложения-образа (выпуска) за пределами вашего сервера CI. Потянув исходный код приложения, упакуйте его в свое изображение, используя COPY
, а затем любой оператор RUN
для компиляции ваших активов (npm/gulp/grunt whatever). Все это происходит не на производственном сервере, а на агенте CI/CD.
Затем вы нажимаете этот образ-релиз, вызывая этот образ yourregistry.com/yourapp
в свой частный реестр в качестве новой "версии" для развертывания.
Развертывание
с простой (простой)
Для развертывания на вашем производственном или промежуточном сервере С простоями вы просто выполните docker-composer stop && docker-composer up
- это автоматически выведет новое изображение, а затем запустит его в вашем стеке - ваше приложение будет обновлено
Конечно, сервер может извлечь из вашего частного репозитория.
с временем простоя (больше усилий)
Достигнув развертывания с нулевым временем простоя, вы должны использовать концепцию blue-green. Таким образом, вы добавляете прокси-сервер в свою установку и больше не выставляете публичный порт из приложения, а используете этот публичный публичный порт. Ваша текущая система в реальном времени может работать на случайном порту 21231, прокси-сервер пересылает от 443 до 21231.
Мы используем случайные порты, чтобы избежать конфликта во время развертывания "второй" системы, охватывая одну из проблем, которые вы упомянули.
При повторном развертывании вы только запускаете "новый" контейнер на основе нового приложения-изображения в дополнение (к старому), он получает новый случайный порт 12312 - если хотите, запустите свои интеграционные тесты снова 12312 напрямую (не используйте прокси). Если вы закончили и счастливы, переконфигурируйте прокси-сервер, чтобы теперь перейти на 12312, - затем удалите старый контейнер (21231).
Если вам нравится автоматизировать перенаправление прокси-сервера, которое подробно выходит за рамки этого вопроса, вы можете использовать сервис-обнаружение и регистратор, который делает случайные порты более практичными и упрощает перенастройку вашего прокси-сервера, пусть это nginx/haproxy, пока они работают. Инструменты будут, например.
- consul
-
consul watch
+consul-template
или tiller прокси для обновления прокси-config - Registator для централизованной регистрации или режим клиента консула с service-configuration.json (зависит от вашего выбора) -