Pull to refresh
0

Карманный PaaS c Dokku

Reading time 5 min
Views 19K
В своей прошлой статье я упомянул Dokku, как важную составляющую нашей инфраструктуры и сегодня хочу раскрыть эту тему подробнее.

Dokku это средство простого трансформирования Ubuntu сервера, в мини-Heroku. После установки dokku, вы получаете возможность делать:

$ git push production master

для могих популярных платформ (Node.js, Java, PHP, Python etc). Результатом процесса развертования, есть запущенное приложение, к которому сразу можно получить доступ по http/https.

Как это работает?


Если открыть репозиторий проекта, то в описании можно увидеть строчку - «Docker powered mini-Heroku in around 100 lines of Bash» — около 100 строчек баш кода, который иммитирует работу Heroku. Это довольно «легкая» реализация, как для такой большой проблемы, которую он решает.

Все объясняется тем, что Dokku стоит на плечах таких технологий как: Docker, Heroku Buildpacks, Nginx, Git.

Docker

Первое и пожалуй самая важная составляющая часть это Docker.

Docker решает проблему контейнеров.

Контейнеры это свежий взгляд на развертывание приложений, классикой в которой считатся виртуализация. Докер контейнеры имеют ряд приемуществ по сравнению с виртуальными машинами, такие как: время бутстрапа машины, размер образа для запуска, версионность образов (с инкрементальными изменениями), а также общий индекс, с доступными к использованию образами.

Внутри контейнера можно запустить процесс, который будет полностью изолированным от внешней среды, со своей операционной системой, файловой системой и сетевым интерфейсом. При этом, из одного и того же образа, можно запускать сколь угодно (пока хватит ресурсов машины) процессов. Образы можно «наследовать» друг от друга, например если мы имеем образ Ubuntu сервера скажем размером 1GB, но хотим сделать свой с MongoDB, размер нового образа будет не 1.3GB а 300MB.

Docker файлы, позволяют в декларативном виде «конструировать» нужный образ, который можно «собрать», поместить в индекс, после этого распространить на нужные машины и запустить их там. При этом Docker гарантирует, что запускаемые внутри контейнера процессы будут работать абсолютно одинаково, вне зависимости от конкретной машины.

Docker образы, иммутабельны. Т.е. любое, даже самое деструктивное действие типа rm -rf /, не принесет ему вреда, если измнения не будут закомиченны.

Docker собрал вокруг себя очень продуктивное сообщество, также многие крупные компании как Yandex, Red Hat, Facebook, Spotify берут эту технолонию на вооружение.

Как же его использует Dokku?

Прежде всего, в Dokku используется свой базовый образ, т.н. Buildstep. По его докер файлу видно, что это ubuntu:quantal, на который устанавливается ряд необходимых пакетов, а также билд паки в основном от Heroku, но также и некоторые от сообщества (например для Perl, Dart, Static Apache etc.)

Внутри базового образа есть скрипт builder, в задачу которого входит «поиск» подходящего для вашего приложения билд пака и запуск его.

Heroku Buildpacks

Билд паки, это набор шел или руби скриптов, типично состоящих из нескольких файлов, detect, compile, release. Задача которых, детектировать соответвует ли приложение заданному типу (как правило по файлам в корне проекта, Gemfile — Ruby, package.json — Node.js и т.д.), скомпилировать и выпустить приложение, соответвенно.

Билд пак, запущенный внутри контейнера создает всю необходимую среду выполнения (качает нужную версию Node.js, или OpenJDK..), установит все необходимые приложению зависимости (npm, maven, pip..) К моменту завершения его работы, приложение будет готово к старту.

Если вы использовали Heroku, то весь этот вывод, который видно на экране при пуше приложения в Heroku, это и есть результат работы buildpack.

Nginx

Docker обладает возможностью маппить сетевые порты, которые использует приложение внутри контейнера, на порт «внешненей» машины. Dokku передает внутрь приложения номер порта 5000. Внешний, берется из диапазона портов выше 49200.

СONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS                     NAMES
a60c2af71770        app/app:latest              /bin/bash -c /start    30 hours ago        Up 30 hours         0.0.0.0:49264->5000/tcp   prickly_curie
9c3c58b649df        app/likeastore.com:latest   /bin/bash -c /start    47 hours ago        Up 47 hours         0.0.0.0:49253->5000/tcp   sad_lumiere
1b55d9087d23        app/tour:latest             /bin/bash -c /start    8 days ago          Up 8 days           0.0.0.0:49228->5000/tcp   suspicious_wozniak
f700b5db1100        app/demo:latest             /bin/bash -c /start    2 weeks ago         Up 2 weeks          0.0.0.0:49159->5000/tcp   sleepy_heisenberg
4df87e09611d        app/analytics:latest        /bin/bash -c /start    2 weeks ago         Up 2 weeks          0.0.0.0:49153->5000/tcp   tender_curie


Трафик из/в контейнер проксирует Nginx. Его никак не надо конфигурировать, Dokku сделает это сам. Для всех приложений он создает конфигурационный файл, примерно такого вида:

upstream app { server 127.0.0.1:49264; }
server {
  listen      [::]:80;
  listen      80;
  server_name app.likeastore.com;
  return 301 https://$host$request_uri;
}


Т.е. использует upstream модуль для трафика из контейнера, на порт 80 сервера.

Git

Многие знают Git, как отличную систему конроля версий. Диапазон использования Git шире, чем просто контроль версий, многие называют Git — новым FTP. Именно git используется как транспорт исходников на сервер.

Dokku использует git-hooks, и после того как исходники «пушнуты» на сервер, запускает dokku скрипт. Это собственно и есть, тот самый «around 100 lines of bash» скрипт, в задачу которого входит создание нового docker образа из базового (buildstep), запуск «builder» скрипта для инициализации среды, запуск самого приложения и рестарта nginx.

Обратитие внимание на то, что с каждым пушем приложение, разворачивается в «чистой» среде, в новом контерейнере, созданном специально для него.

Установка


Все довольно подробно рассказано в документации проекта. Bootstrap скрипт установит вне нужные зависимости — git, nginx, docker, etc… А также установит базовый образ buildback.

Конфигурация

После установки Dokku на сервере, необходимо сделать 3 вещи.

1. Загрузить свой ssh публичный ключ на сервер, чтобы можно было сделать git push.

$ cat ~/.ssh/id_rsa.pub | ssh root@yourserver.com "sudo sshcommand acl-add dokku progrium"


2. В .git/config приложения надо настроить remote бранч

[remote "staging"]
	url = dokku@stage.likeastore.com:app-stage.likeastore.com
	fetch = +refs/heads/*:refs/remotes/deploy/*
[remote "production"]
	url = dokku@likeastore.com:app
	fetch = +refs/heads/*:refs/remotes/deploy/*


Обратите внимание, на имена — с полно-квалифицированным именем, типа app-stage.likeastore.com, приложение запустится на app-stage.likeastore.com, и базовым именем, типа app, на app.likeastore.com.

3. В корне проекта сделать файл Procfile, который содержит инструкцию на запуск приложения, для Node.js

web: node app.js

После этого приложение готово к деплойменту.

Деплоймент

Тут все просто, как сказано выше:

$ git push production master


В результате, вы увидете что похожее на следующий вывод:

› git push staging development:master
-----> Cleaning up ...
-----> Building app-stage.likeastore.com ...
       Node.js app detected
-----> Requested node range:  0.10.x
-----> Resolved node version: 0.10.25
-----> Downloading and installing node
-----> Restoring node_modules directory from cache
-----> Pruning cached dependencies not specified in package.json
-----> Installing dependencies
-----> Caching node_modules directory for future builds
-----> Cleaning up node-gyp and npm artifacts
-----> Building runtime environment
-----> Discovering process types
       Procfile declares types -> web
-----> Releasing app-stage.likeastore.com ...
-----> Deploying app-stage.likeastore.com ...
=====> Application deployed:
       https://app-stage.likeastore.com

To dokku@stage.likeastore.com:app-stage.likeastore.com
   77008a6..99dfe55  development -> master


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

Плагины


Базовый Dokku можно считать довольно ограниченным, но он отлично расширяется за счет плагинов.

Плагины делятся на несколько типов, datastores — с готовыми решениями развертывания хранилищ (MariaDB, PostgreSQL, MongoDB etc.), process managers — для поддержки менеджеров процессов (Circus, Shoreman etc.) и other — всякие полезные штуки (Bower, Grunt, Elasticsearch, SSH Deployment keys).

Наш опыт использования Dokku в Likeastore оказался очень положительным, чего и Вам искренне желаю!

ЗЫ. В сети есть видео моего выступления на тему Dokku, там есть некоторые подробности.
Tags:
Hubs:
+33
Comments 13
Comments Comments 13

Articles

Information

Website
likeastore.com
Registered
Founded
Employees
2–10 employees
Location
Украина