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

    В своей прошлой статье я упомянул 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, там есть некоторые подробности.
    Likeastore
    27,00
    Компания
    Поделиться публикацией

    Похожие публикации

    Комментарии 13

      +1
      Ваше видео вдохновило меня поверхностно поиграться с ним недели 2 назад.
      Dokku вещь интересная, но впечатления достаточно неоднозначные:
      Первое с чем я столкнулся — не выполнялся rake task — assets:precompile, долго искал причину, и нашел уже было проблему в исходниках, но как потом оказалось это решалось установкой плагина user-env-compile.
      Не понятно зачем остаются образы каждого деплоя, причем понять какой образ к какому деплою относится у меня не получилось.
      Мое общее впечатление: все собрано из картона и палок, перемотано скотчем, чтобы держалось. Но тем не менее работает :)
        +2
        > Ваше видео вдохновило меня поверхностно поиграться с ним недели 2 назад.

        спасибо!

        > но как потом оказалось это решалось установкой плагина user-env-compile.

        так и есть, всякие кастомные задачи решаются плагинами… когда я начинал использовать докку их было крайне мало, сейчас уже для многих типов проектов и разных случаев, наверняка есть плаг.

        > Не понятно зачем остаются образы каждого деплоя,

        остаются образ последнего деплоя. раньше был такой баг, но он был исправлен еще летом 2013… вот этот таск ответсвенный за это. если вы все же видете старые (безымянные) образа — рапортуйте дефект на GitHub.

        > все собрано из картона и палок, перемотано скотчем, чтобы держалось

        dokku/docker проекты оч ранней стадии развития, но по поводу «картонности» позволю с Вами не согласится. зная отношение к делу Джефа Линдси и других контрибуторов проекта, могу судить — все серьезно… и наш более 6 месячный опыт с докку это подтвержает :)
        –3
        Если гуглить dokku то в выдаче упоминается террорист.
          +1
          А вы какие типы проектов заливали? Мне интересно опыт для scala и node,js.
          Еще чуть не понятно общий сценарий. У меня есть железка я ставлю dokku и теперь у меня есть возможность использовать его как heroku?
          И еще вопрос на странице проекта говорится о flynn не знаете что за зверь?
            0
            flynn.io/ — он в разработке пока, собственно это просто более навороченный аналог dokku который позволит ставить его не только на 1 машину но и на несколько
              0
              Да, наш опыт это именно node.js и static… например, вот это — node.js приложение, а это — статический сайт, сервится аппачем.

              > У меня есть железка я ставлю dokku и теперь у меня есть возможность использовать его как heroku?

              Именно так.

              > И еще вопрос на странице проекта говорится о flynn не знаете что за зверь?

              Это еще один проект от @progrium. Он появился после dokku, и это будет настоящий PaaS (со scalability, load balancing etc.) — но построен на технологиях смежных с dokku. Деталей не оч много, все что есть, есть на сайте. Стартанули они оч резво, но проект немного затянулся. В любом случае, это должно быть что-то интересное, я жду выпуска.
              0
              Еще всегда было интересно как базы живут внутри таких контейнеров. Ведь докер высовывает на ружу случайный порт и если я перезагружу железку мне все порты заново проставлять. Может я конечно чего то не понимаю так как пока не использовал.
                0
                Базы в контейнерах чувствуют себя нормально, на это есть 2 причины:

                1. Начиная с докера 0.3 в нем появилась поддержка external volumes, т.е. любой внутенний фолдер контейнера (скажем /var/data) можно замаппить на фолдер сервера (/var/containers/123/data), тем самым получая персистентность данных, даже если контейнер остановится.

                2. По поводу портов, как правило решают как в докку — ты не обращаешся к контейнеру на прямую, я через прокси (nginx) — если тачка перегрузилась, контейнеры стартуют заново, и новые порты записываются в nginx.config, а урл (http://mymongo.server.com) остается таким же.
                  0
                  а нельзя ли что то более ядреное использовать — типа iptables для того чтобы наружу машины выдавать по одному порту?
                  мне кажется (чисто субъективно) что nginx не учень удачная идея для проксирования трафика от бд
                    0
                    Возможно Вы правы, для ДБ это может быть не оптимально… Но, этот вопрос я глубоко не «копал», поэтому точно сказать не могу…
                0
                Меня недавно заинтерисовали подобные технологии и в частности сам dokku, но кроме него как минимум в поле зрение попали еще такие проекты как openshift и cloud foundry — вы когда выбирали dokku для себя, рассматривали их и по чему решили использовать именно его?

                По моим наблюдениям cloud foundry не очень дружелюбна для небольшой инсталяции, а вот демо VM от openshift очень впечатлил и возможно он даже лучше подходит для небольшой команды чем dokku.
                  0
                  Я возможно не правильно донес инфу…

                  Такие штуки как openshift, cloud foundry, nodejitsu, heroku etc… это самые настоящие PaaS'ы — т.е. инфраструктура + средства деплоймента + суппорт + очень много всего, типа скалирования приложений и т.д. Доступны как правило по подписке.

                  Dokku, это open source проект, построенный на Docker'е… Контейнер докера, можно назвать аналогом dyno в Heroku… Но это, конечно не полноценный PaaS, а «карманный» :) т.е. ты сам его берешь, ставишь и используешь — на своем сервере.

                  Вообще сам dokku возник, как демонстрация возможностей докера, типа «построй свой ПааС за 5 минут» — но вырос в очень удобный тул).

                  Если Вам нужны возмножности полноценного PaaS и у Вас есть на это бюджет — надо выбирать из них. Кстати, OpenShift (Red Hat) использует докер внутри и является одним из контрибютеров.
                    0
                    Так ведь и openshift и cloud foundry тоже open source проекты и то, что у каждого есть комерческий сервис построенный поверх него ничего не меняет, это проекты с очень похожей функциональностью но более развитые и все с водится к тому насколько легко их установить, и поддерживать в случае dokku все понятно а вот с лучае openshift и cloud foundry по сложнее. А вот насколько сложнее я пока не знаю, но у меня сложилось впечатление, что установка openshift на один сервер не сильно сложнее чем установка dokku.

                    Вот например у них доступен готовый образ для виртуалбокса openshift.github.io/documentation/oo_deployment_guide_vm.html в котором все уже настроенно для того чтобы поигратся. У редхата написанно, что устанавливается вроде если ОС правильная с помощью одной команды sh <(curl -s install.openshift.com/) но вот с CentOS не совсем так, нужно еще решать проблемы по ходу.

                    >Кстати, OpenShift (Red Hat) использует докер внутри и является одним из контрибютеров.
                    cloudfoundry насколько я понял нет, тк они считают что в докере пока слабая защита в плане изоляции контейнеров друг от друга,
                    хотя есть комерческий Stackato на базе cloudfoundry с контейнерами на докере

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое