Работа с Docker не самая простая задача. В этой статье хотелось бы рассказать что нас подтолкнуло с созданию DockStation проекта и что у нас уже реализовано на данный момент.

Начало


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

Рано или поздно многие разработчики подходят к той границе, когда появляется необходимость в создании единого и автономного окружения для разработки. Такое окружение без проблем можно перенести с одной машины на другую, отключить одним кликом, поделиться им. С учётом этой необходимости, все дороги вели к Vagrant.

Однако последние два года на слуху была какая-то неведомая и непонятная для меня штука, которая вроде как подходила под мои надобности — Docker. Этот проект часто удостаивается наград и премий, а некоторые и вовсе называют его лучшим из того, что было создано за последние 20 лет. Однако, даже несмотря на то, что по ночам я немного DevOps-ил (пока никто не видит), для меня все эти «изолированные контейнеры» были тёмным лесом. Тем не менее, я решил разобраться в этой интересной вещице.

Docker: как всем этим управлять?


Первые шаги в освоении были не совсем простыми, но в некоторых моментах мне помогали ребята из сообщества dev.by в Slack-чате.

Хотя Docker позиционирует себя как инструмент для деплоя, я понял, что он полностью удовлетворяет всем моим требованиям к среде для разработки.

Потратив около недели на изучение документации, я понял саму философию и то, как работать с этим чудо-инструментом. Смущало лишь одно — километровые CLI команды, которые нужно было запускать каждый раз для запуска контейнера. Видимо, я был не один в такой беде: у ребят оказался в арсенале ещё один инструмент Docker Compose, который позволял сохранять все эти километровые команды в единый конфигурационный файл. И вроде бы — можно радоваться, но реальность, как обычно, оказывается жестокой.

Собрав и перенеся свои личные и рабочие рабочие проекты и получив по итогу более полусотни контейнеров, я столкнулся с вопросом: «Как всем этим управлять?». Знаю по своему опыту: если есть что-то консольное, то должно быть что-то «мышко-юзабельное» на GUI. Начались поиски приложения, которое помогло бы управлять всем этим делом.

Конкуренты «не решают глобальных вопросов»


Первое, на что я наткнулся, был Kitematic — GUI-приложение от Docker, которое позволяет производить манипуляции с контейнерами.

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

Но это не решало мою проблему: разобрать и сгруппировать кучу контейнеров от моих проектов. Да и никаких глобальных вопросов оно не решало, лишь немного помогало работать с контейнерами и мониторить их состояние. Затем я рассмотрел Rancher, но снова не то: этот инструмент предназначен и заточен для деплоя, и для разработчика он не совсем подходит. Были найдены схожие инструменты типа Shipyard и Portainer, но все они были лишь немного более проработанными вариантами Kitematic. Что ж, раз решения под нужную задачу не существует, сделаем решение своими руками.

DockStation: более полугода кропотливой работы


Вот так, начиная от обычной идеи банальной группировки контейнеров по проектам и появилось желание сделать свой продукт. Одному такой проект тянуть было бы очень сложно, разработка «в одно лицо» заняла бы много времени. В декабре 2016 года я пришёл с этой идеей и с предложением совместной разработки к своему другу Павлу Лозко. Он работал с Docker, поэтому быстро понял общий смысл проекта и дал согласие на участие.

Через два месяца я перешёл на фул-тайм работу над проектом.

В итоге мы нарушили все правила, проигнорировали советы великих стартап-гуру о том, что нужно запускаться уже на стадии Hello World и, имея на руках только лишь идею, бежать к инвесторам за деньгами на MVP. Спустя шесть месяцев кропотливой и тяжёлой работы проект вышел в свет.

В основе проекта изначально лежали принципы:

  1. Не обязательно учить тонны документации на начальном этапе, чтобы начать работу с Docker и Docker Compose. Хотя саму философию и принципы всё же понять нужно.
  2. Приложение должно быть нативным, чтобы не пришлось танцеать с бубном для простого запуска (концепция Kitematic-а понравилась больше).
  3. Обратная совместимость. Все сгенерированные проекты должны запускаться как в приложении так и через CLI. Аналогично как и наличие возможность импорта сторонних Docker Compose проектов в приложение.
  4. Всё, что можно, максимально перенести в GUI.

Итого, озираясь на последние 10 месяцев работы.

Что мы умеем сегодня


  1. Быстро создавать проекты на лету.
    • Импортировать уже имеющийся проекты, просто указав путь к директории в которой лежит docker-compose.yml файл конфигурации.
    • Парсить Docker команды (beta). Для тех, кто всегда пользовался только docker run командами, есть возможность импортировать проект, просто введя эти команды, они будут переведены в Compose проект.

    image
    • Создавать проект с нуля просто одним кликом мыши.
      image


  2. Мониторинг проектов и сервисов.
    В любой момент можно узнать, работает ли проект, а если нет, то какой из сервисов не работает. С помощью логов найти, в чём заключается проблема. Реализован полнотекстовый поиск по логам.
    image
  3. Управление сервисами и контейнерами.
    • Быстрый запуск, перезапуск, остановка сервисов и всех контейнеров, с ними связанных.
    • Быстрая очистка контейнеров сервиса.
    • Доступ внутрь контейнеров по одному клику.
    • Получение всей информации по контейнерам.
    • Смена версии образа, байндинг портов, переопределение и назначение переменных окружения и многое много другое что необходимо для настройки и управления проектом.

    image
  4. Настройки проектов.
    Часто используемые настройки проекта можно менять через интерфейс. Все изменения сразу же будут записаны в docker-compose конфиг. Если что-то нужно сделать кастомное, то без проблем можно отредактировать compose конфиг вручную и все будет работать.
    image
  5. Работа как с локальным Docker-ом, так и удаленным.
    Реализована система для создания и работы с удаленными подключениями к Docker, которая дает возможность к полноценному управлению удаленными контейнерами. Очень сильной фичей является возможность подключения к Docker через SSH, что позволит избежать очень большой работы по перенастройке Docker-а для открытия внешнего порта и настройки безопасности.
    image
    image
    image
    image
    image
  6. Статистика потребления ресурсов как проектов в целом, так и отдельных контейнеров.
    В Docker-е есть очень слабое место в плане мониторинга ресурсов по Compose проектам в целом. Он позволяет мониторить только лишь ресурсы отдельных контейнеров. Что же, мы исправили это. (к слову issue висит, возможно вскоре и появится: https://github.com/docker/compose/issues/1197)
    image
    image
  7. Мониторинг ресурсов в реальном времени.
    Очень похоже как в менеджере задач, только для контейнеров.
    image
  8. Работа с Docker Machine
    Реализована полноценная работа с Docker Machine c поддержкой драйверов:
    VirtualBox, VMWare, Hyper-V
    image
  9. Работа с Docker Hub
    Можно очень легко и просто работать с образами из Docker Hub. Осуществлять поиск и конфигурацию образов.
    image
    image
  10. Приятные дополнения.
    • Поскольку IP контейнеров меняются при перезапуске, управлять проектом, используя локальное хост-имя, становится не совсем просто. Мы решили эту задачу: при смене IP контейнера будет установлена актуальная хост-запись в /etc/hosts.
    • Реализована поддержка Override конфигов.

    image

Текущие итоги и результаты

На сегодня главная наша заслуга в том, что мы выпустили продукт. Покинув работу для фулл-тайм погружения в проект, суммарно потратив более 10 месяцев личного времени и какое-то количество своих денег, без сторонней поддержки выпустили проект в жизнь и продолжаем его развивать. Поскольку основной задачей у нас была работа над проектом, то никакие стартап-тусовки, ивенты и прочие мероприятия мы не посещали, поэтому значков, отметок и наград от экспертов у нас нет. Зато сейчас нашим приложением пользуется более 1000 разработчиков в месяц, у нас есть сотни положительных отзывов и пожелаений и это вдохновляет творить дальше.

Web
GitHub (проект не OpenSource, но там все коммуникации)

Комментарии (45)


  1. manefesto
    24.10.2017 13:09

    А где пруф на скачивание?
    Погуглить можно, но ссылку в конце тоже было бы не плохо


    1. Lemon007 Автор
      24.10.2017 13:12

      Исправлено. Подумал что в профиле компании можно посмотреть. Но так то да, проще продублировать. Спасибо за замечание.


  1. eshimischi
    24.10.2017 13:30

    Вы просто переработали Kinematic получается? Оформление один-в-один.


    1. Lemon007 Автор
      24.10.2017 13:37

      Нет, от Kitematic-а у нас нету вообще ничего, мы делали все с абсолютного нуля и к слову тот же Kitematic так просто не подогнать под работу с Docker Compose, там проще с 0 все переделать.
      То что есть сходства в интерфейсе, связано с тем, что библиотека которую используем для GUI имеет визуальные сходства. Если интересно: https://github.com/ant-design/ant-design/


      1. eshimischi
        24.10.2017 13:40

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


        1. Lemon007 Автор
          24.10.2017 13:45

          Сейчас рассматриваем разные варианты, выход в OpenSource так же очень и очень возможен.


  1. Akuma
    24.10.2017 13:36

    Выглядит очень вкусно. Особенно работа с docker-machine и compose. Посмотрим как оно на самом деле.

    О, посмотрел сайт, вспомнил вас :) Это для вас есть отдельный котел за видео «Coming soon...» :)

    А как у вас происходит разделение dev/prod у одного проекта? Сейчас у меня несколько yml файлов для compose, которые чуть переписывают один основной.


    1. Lemon007 Автор
      24.10.2017 13:37

      Ага, +1 котел за то что до сих пор не пофиксил лэндинг :)


  1. Apokalepsis
    24.10.2017 17:37

    Качаю. По описанию реально огонь. Надеюсь он оправдает возложенные надежды :)


    На сколько проблематично сделать в дополнение web интерфейс?


    1. Lemon007 Автор
      24.10.2017 17:38

      Буду рад фидбэку.
      Если возникнут какие вопросы, можете смело обращаться. :)


    1. Apokalepsis
      24.10.2017 17:54

      Сразу две функции которые не увидел, но на мой взгляд достаточно интересные.


      1. Использование своего registry
      2. Управление образами. Удаление
      3. Возможно не нашел — импорт обратно в docker-compose


      1. Lemon007 Автор
        24.10.2017 17:58

        1) Ведется работа и она будет в v1.4, к слову что будет в сл. версии можете посмотреть здесь: https://github.com/DockStation/dockstation/milestone/4
        2) Можно поподробнее что именно вы имеете ввиду под управлением образов? Build, Push, Pull в/из регистра?


        1. Apokalepsis
          24.10.2017 18:01

          1. Когда примерно можно ожидать эту версию?
          2. Эти функции больше относятся к регистру, но конечно в том числе. Я в первую очередь имел ввиду банальную возможность удалить образ :)
          3. Этот пункт отредактировал. Импорт обратно в docker-compose Есть ли такая возможность?
          4. Как можно сохранить конфиг в файл с отличающийм названием. Например docker-compose.dev? На сколько понял из github это возможно, но не понял как :)

          Большое спасибо вам за такой инструмент. Как минимум буду использовать для dev окружения на локалке :)


          1. Lemon007 Автор
            24.10.2017 18:06

            1. В сл. месяце, я думаю нам нужно будет еще недели 4 на все про все.
            2. Ну в принципе так-то это не сложно сделать. Я внесу в список, но это будет в v1.5.
            3. Немного не понял какой импорт обратно? Мы работаем с нативным docker-compose, т.е. все что мы генирируем и меняем через интерфейс свободно и нативно поддерживается Docker Compose. Т.е. 100% обратная совместимость. Ну а импорт в docker-compose у нас есть из CLI `docker run ...` команд в compose формат.


          1. Lemon007 Автор
            25.10.2017 01:46

            Вы лучше добавляйте комментарий а не редактируйте, если что-то хотите дополнительно уточнить, т.к. не приходят уведомления.

            по п.4
            По дефолту всегда берется docker-compose.yml и используется как точка вхождения. Обычно чтобы разделить какие-то окружения, исользуют override конифги, типа docker-compose.dev.yml или docker-compose.prod.yml
            У нас есть на гитхабе issue по поводу смены как раз этого entrypoint с docker-compose.yml на какой-нибудь кастомный. Это обсуждали, но пока висит под вопросом, будем вводить эту фичу или нет.


  1. Hixon10
    24.10.2017 22:20

    Добрый день.

    выглядит класссно, надо пробовать. Несколько вопросов:
    1) У вас на скрине есть стрелочки между разными контейнерами? Как их рисовать, не пойму :(
    У меня винда10, если что.

    2) Есть ли в вашей программе функция удаления локальных контейнеров? Не вижу такой.


    1. Lemon007 Автор
      24.10.2017 22:22

      Здравствуйте.
      1) Есть. Они берутся из параметров depends_on и links. Сплошная от links и пунктирная для depends_on.
      2) Да. Вкладка Containers. Выбираете контейнер и нажимаете на кнопку «Remove».


  1. Ptolemy_master
    25.10.2017 01:57

    Здравствуйте!
    Выглядит круто (хоть я и не работаю с докером).
    Можно узнать, кто участвовал в проекте, каковы были вложения, и собираетесь ли монетизировать. Спасибо!


    1. Lemon007 Автор
      25.10.2017 02:02

      Здравствуйте. Спасибо.
      Я и друг, на сайте есть информация. Вложения только свое время и небольшие финансовые вложения. Да, но с моментом монетизации тема очень и очень неоднозначная. Нужно монетизировать хотя бы для того чтобы была возможность полноценно работать фуллтайм на проекте.


      1. Ptolemy_master
        25.10.2017 02:28

        Спасибо за ответ.
        То, что монетизировать нужно — факт бесспорный. И я вижу, что на сайте уже есть об этом информация. А есть у вас уже платящие пользователи?


        1. Lemon007 Автор
          25.10.2017 10:10

          Извиняюсь, немного закрытая инфа. :)


          1. Ptolemy_master
            25.10.2017 20:12

            Ничего, это понятно!


  1. Samouvazhektra
    25.10.2017 08:30

    Выглядит здорово! Именно для зоопарка локалки такого очень не хватало! Даже задонатить не жалко.
    Только еще очень хотелось бы в Aur наличие… через debtap конвертится норм


    1. Lemon007 Автор
      25.10.2017 10:12

      На самом деле мне тут уже поступило много предложение на разные пакеты, чаще всего это RPM. Мы это предвидели уже давно, поэтому чтобы не пложить кучу всего выбрали 2 основных: для Debian/Ubuntu и AppImage, который свободно запускается на всех *nix системах.


  1. AlexanderY
    25.10.2017 09:52

    Потратив около недели на изучение документации, я понял саму философию и то, как работать с этим чудо-инструментом

    Я сейчас на этом же этапе. Кроме оф.доков что-то посоветуете почитать?

    А сам проект выглядит толково, в закладки добавил.


    1. Lemon007 Автор
      25.10.2017 10:18

      Нет лучше документации чем знакомые/друзья devOps-ы или те кто шарит.
      Но вообще у меня было 2 ресурса: оф. дока + stackoverflow. Есть видеотуторы, но что-то ничего так толкового не нашел, чтобы я прям сказал что ВААААУ вот это клево и зашло.


  1. jakekutsel
    25.10.2017 10:18

    Пользуюсь чуть больше месяца. Есть проблема, возможно, я не сильно разбирался, но у меня при создании проекта и указании docker-compose.yml теряются проброшенные волумы. И бывают подвисания в логах: вывод логов не из того контейнера или просто приложение может некоторое время не отвечать.


    В остальном же все очень удобно. Отличная штука


    1. Lemon007 Автор
      25.10.2017 10:21

      Если не сложно, напишите issue на GitHub. Просто все технические вопросы мы стараемся решать там из-за того, что возможно у кого-то могут быть аналогичные проблемы и они найдут решение и к issue приложите туда свой первичный compose конфиг. Обычно мы решаем проблемы очень быстро либо же issue уходит с лэйблом bug.

      Спасибо!


  1. aspcartman
    25.10.2017 10:27

    Две недели назад начал делать тоже самое, удивляясь, что этого никто еще не сделал, и все UI для докера практически бесполезны, да и заходить в них приходится через браузер (с ума все посходили с этим вебом). Я так понимаю проект был на веб стеке собран, на каком-нибудь electron? Печально, что это единственный сегодня существующий способ. Тем не менее, огромное спасибо за ваши старания, это очень круто! /me пошел выкидывать свое поделие в корзину и наслаждаться свободным временем


    1. Lemon007 Автор
      25.10.2017 10:34

      Ну потому что все считают нужным затолкнуть работу через Docker образ. Это имеет свои плюсы если ты хочешь управлять проектами на удаленной машине через WEB интерфейс (чтобы можно было к примеру с мобилки или пданешета в дороге что-то сделать), но ни разу не удобно если использовать на локальной машине. Пока не буду все спойлерить и расскрывать все карты, но в v2 версии будет широкий выбор типов: как Standalone приложение, так и приложение под WEB-ом.
      Да, все верно. Стек: Electron + React + Redux + Saga.. На текущий момент самое оптимальное решения чтобы охватить как можно больше платформ, работая в 2 лица. :)

      Спасибо за отзыв!


      1. BeppeGrillo
        25.10.2017 15:44

        Стек: Electron + React + Redux + Saga… На текущий момент самое оптимальное решения чтобы охватить как можно больше платформ, работая в 2 лица

        Простите, но не самое.
        Самое — Qt
        А за электрон вам отдельный котёл, с разрабами скайпа вариться будете


        1. Lemon007 Автор
          25.10.2017 15:57

          Ну что поделать. Я лучше выберу котел с ребятами со Slack-а и Spotify-я, с ними поинтереснее будет общаться. :)


  1. LiguidCool
    25.10.2017 12:08

    По моему это то, чего мне как раз не хватало для работы с Docker.
    Я программист, я не хочу строить из себя админа и настраивать окружение кучей комманд :)


    1. Lemon007 Автор
      25.10.2017 12:09

      Лови пятюню! Я б тож так хотел, но чтобы написать это пришлось учить. :)


      1. LiguidCool
        27.10.2017 10:45

        Если честно не хватает какого-нить гайдика с HowTO Create *** Dev Server.
        Хотя возможно просто у меня руки кривые… Но вообще познакомившись с Docker подробнее я пожалуй склоняюсь к идее, что у отдельных разрабов контейнеров ручки-крючки.


        1. Lemon007 Автор
          27.10.2017 11:03

          Вообще мы уже хотим 3-й месяц записать серию туторов по работе с аппой с реальными примерами, но все осложняется временеи и «перфект инглиш». Сейчас у нее очень большой функционал, а писать документацию дело долгое и утомительное. Но вообще если в 2-х словах, переходите на вкладку схемы и таскаете что вам нужно. Задаете entrypoint если он нужен, прокидываете волумсы и все поднимается. Все контейнеры уже будут меж собой перелинкованы и никаких доп. действиий делать не нужно.
          Косяк почти всех кто делает контейнеры что они пихают в один контейнер все, что в своей сути расходится с идеями независимых контейнеров и быстрой их замены. Т.е. они в один контейнер впихивают nginx, php, mysql, redis,… и т.п. и компилят в один одбраз. А вот когда нужно будет побыстрому поменять к примеру php, то оказывается что нужно делать полную пересборку образа, вместо выбрасывания и замены всего-лишь 1-го элемента.


          1. LiguidCool
            28.10.2017 02:51

            Мой вам совет — не заморачивайтесь с перфект инглишом, а сразу делайте с сабами.

            Может вы мне сможете помочь. Я создал проект, закинул php, mysql, nginx, phpmyadmin (кроме последнего все из official).
            Вроде прокинул порты и volume пошарил с www, но я не могу понять как сказать nginx'у на php-fpm и его порт?
            Docker через Virtualbox docker-machine под MacOS (хотя я и под виндой развлекался).


            1. Lemon007 Автор
              28.10.2017 02:59

              Выкатим 1.4 версию и более плотно этим вопросом займемся. Банальная нехватка времени.

              Да, php-fpm должен байндиться на порт, т.к. общение меж контейнерами по сети, к сокету не подключиться, как это делается обычно. В конфиге nginx-а укажите на каком порту крутится PHP-FPM: Тыц
              А чтобы было еще проще, ловите мой конфиг, там правда для WP делал, но всю начинку по PHP + NGINX можно смело брать оттуда: GitHub


  1. Kaigorodov
    25.10.2017 14:39

    Кароч, молодцы ребята, спасибо за труд.


    1. Lemon007 Автор
      25.10.2017 15:55

      Рады стараться! Можно кстати как-нибудь выбраться. :)


  1. mcx
    26.10.2017 21:01

    Отличная вещь! Молодцы, спасибо!
    Пожелания:
    — на 13' макбуке по высоте не вмещается окно… не видно нижние элементы интерфейса, уменьшить фикс высоту окна бы
    — не хватает команд build кастом образов — если поменял чтото в dockerfile ручками приходится запускать команду
    а так все супер!


    1. Lemon007 Автор
      26.10.2017 21:26

      — Спасибо. Важное замечание. Исправим оьязательно. Уже внес в список.
      — Да, у нас даже в трекере висит issue с этим же предложением. В принципе кнопку билда не сложно добавить.

      Спасибо за фидбэк!


  1. beatleboy
    27.10.2017 02:27

    Гениально!


  1. ADSapozhnikov
    27.10.2017 18:58

    Столкнулся с такой неудобностью, когда скармлеваешь свой docker-compose.yml и нажимаешь Start в шапке, непонятно что происходит.
    Имею ввиду следующее, висит надпись Pulling from…
    А хотелось бы видеть вывод процесса пуллинга.
    Честно говоря, я вначале подумал, что все зависло)


    1. Lemon007 Автор
      27.10.2017 19:51

      На самом деле там обновление прогресса очень специфично проходит при запуске пулла образов во время старта. В плане того что немного сложно полноценно эмулировать поведение терминала в кастомном модальном окне.
      Процесс пуллинга мы показываем если вы перебрасываете образ с хаба на схему, т.к. там для этого дергаем спец метод.