Continuous deployment с помощью docker cloud
Настроим непрерывный деплой статичного стайта на DO с помощью Docker Cloud.
Docker Cloud — единый инструмент, позволяющий автоматически билдить имейджи и публиковать их в registry, запускать тесты, создавать из существующих или вновь созданных имейджей сервисы и их стеки на инфрастуктуре, которой так-же управляет. Сама инфраструктура может быть развернута как на обычных нодах так и в swarm-кластере используя ресурсы популярных провайдеров типа DO, Amazon, Azure или подключать свои имеющиеся.
Мы будет использовать клауд в стандартном режиме. В Cloud Settings привяжем GitHub и Digital Ocean аккаунты
Это в общем-то вся предварительная настройка, в следующий раз за пределы Docker Cloud мы выйдем при настройки ДНС.
В разделе Build -> Repositories создадим новый докеровский репо в регистри, укажем репо гитхаба, который будет билдиться при git push, можно указать конкретную ветку(или regex) и кастомный докерфайл.
Наш имейдж будет билдиться при каждом пуше в гит-репо и публиковаться на https://hub.docker.com/.
Далее в разделе INFRASTRUCTURE -> Nodes создадим ноду, куда будет деплоиться наш имейдж:
После нажатия кнопки Launch запустится поднятие виртуалки на DO с установленным докером и запущенным агентом docker-cloud, по завершении в списке появится наша нода со статусом Deployed.
Итак, у нас все готово для деплоя. Немного отступим назад — у нас очень простой сервис, который является набором статичных файлов: html, css, js, их сервит nginx, и по сути вся настройка контейнера — это паблишинг портов наружу.
В разделе APPLICATIONS -> Services -> Create выберем наш докеровский репо, созданный выше, и перейдем к настройке сервиса:
Мы выбрали наш кластер в Deployment Constraints, так-же включили авторестарт и авторедеплой(запускается после пуша или билда нового имейджа).
И настроили паблишинг портов. Это так-же даст команду клауду создать публичные endpoints по котором мы можем коннектиться к портам сервиса или отдельного контейнера.
Настроим на DO ДНС для нашей ноды. Вроде все работает однако нет SSL. Для этого удалим наш сервис и создадим заново, но уже в стеке с такими полезными проектами, как
Стек-файл, по сути тот-же compose с небольшими дополнениями для деплоя сервисов. Наш стек-файл имеет вид:
nginx-proxy:
restart: always
image: jwilder/nginx-proxy
ports:
- 80:80
- 443:443
environment:
- DEFAULT_HOST=maddevs.io
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /data/certs/:/etc/nginx/certs:ro
le-companion:
restart: always
image: jrcs/letsencrypt-nginx-proxy-companion
volumes_from:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /data/certs/:/etc/nginx/certs:rw
maddevsio:
restart: always
image: maddevsio/maddevsio
autoredeploy: true
environment:
- VIRTUAL_HOST=maddevs.io
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=maddevs.io
- LETSENCRYPT_EMAIL=rock@maddevs.io
Его мы добавляем в APPLICATIONS -> Stacks, после чего запускаем Deploy. Виртуальные переменные, заданные в нашем сервисе пнут nginx-proxy и letsencrypt-companion создать вхост и сгенерить ссл сертификаты.
Теперь наш проект доступен по адресу https://maddevs.io/.