@ksim_miloff

Docker как панацея для разработчика?

Всем привет,
Я программист, не начинающий, но точно все-еще очень не опытный :). Вот мне, впервые в жизни, выпала честь заниматься настройкой хостинга для нового проекта. Само собой, локальную машину настраивать я умею давно, да и с хостингом думал, что не на много сложнее. Сам по себе хостинг - это два VPS, один для базы, второй для самого приложения (продакшн и стеджинг). Сидел, изучал капистрану и сам, уже не помню как, обратил внимание на докер, заинтересовался, прочитал несколько статей на хабре, парочку статей на английском и мне показалось все это очень перспективным. До этого я слышал о докере, но воспринимал его как виртуальную машину или что-то типа вагранта, теперь мое понимание несколько лучше. Так вот, вопрос пишу не с целью "помогите настроить докер", а скорее "помогите упорядочить информацию" или даже "разбейте мои большие надежды о докере в пух и прах" :).

Из того, что я вычитал у меня сложилось впечатление, что докер может все:
  1. docker-daemon - это HTTP-сервер и он может взять на себя это работу на стороне сервера, т.е. nginx не нужен
  2. docker на дев-машине можно (как-то) связать с докером на хостинге
  3. и учитвыая предудущий пункт - docker можно использовать для деплоя
  4. docker можно использовать для отката, если деплой не задался
  5. пропадает необходимость в во всяких rbenv и pyenv, если нужна другая версия языка, то просто создается новый контейнер в котором и происходит установка
  6. докер очень быстрый, в т.ч. старты и рестарты
  7. еще какие-то плюсы?


Правильно ли я воспринимаю систему? Не слишком ли большие ожидания?

Уверен, что забыл еще пару вычитанных приятностей, но это вроде основные, я до сих пор не верю, что правильно все понял. Все-еще нахожусь в процессе чтения статей и документации. Был бы благодарен за ссылку на подробный материал для чайников.

Спасибо, надеюсь, что вопросы не глупые :)
  • Вопрос задан
  • 621 просмотр
Решения вопроса 1
Tyranron
@Tyranron
Для начала нужно понять "контейнер" и "контейнеризацию".
Контейнеризируя процесс, мы его изолируем в своей среде, со своим личным user space. При этом ядро ОС (kernel) при работе контейнера используется то же самое, что и у основной ОС машины.

Выгода здесь в том, что к контейнерам можно относиться как к этаким "бинарникам", грубо говоря. У Вас есть какое-то приложение, не важно какое-оно, будь то набор скриптов на PHP, либо уже скомпилированное что-то (postfix, nginx, apache, и т.п.). Вы это приложение и все его зависимости упаковываете в контейнер (создаете image) и на выходе получаете единое готовое "что-то", что Вы можете запустить и оно не требует более никаких зависимостей (кроме рантайма контейнеров - Docker, rkt, и т.п.). Полная аналогия с тем, как из вороха либ и исходников Вы компилите единый бинарник, который просто потом запускаете где хотите, без необходимости иметь исходники.
Как мы привыкли в менеджерах зависимостей (composer, bower, другие) описывать и фиксировать зависимости исходного кода, так же и в контейнере мы делаем то же самое, но для окружения нашего приложения. Reproducibility во все поля.

Это очень сильно упрощает жизнь. Вам больше не нужно заботиться о том, что для приложения нужно точно воспроизводить окружение на каждой машине, оно у Вас зафиксировано внутри контейнера. Никаких больше конфликтов между различными версиями jvm, php, python, ruby, nginx и т.д. Вы легко на одной и той же машине используете какие хотите приложения, каких хотите версий. Выкатка его же на другую машину больше не требует филигранной подгонки и согласования окружения в соответствие. У Вас больше не отвалится внезапно приложение, из-за недонастроенных апдейтов ОСи и внезапного обновления зависимых либ.

А что Docker?
Docker - это набор инструментов для работы с контейнерами.
Docker daemon являет собой рантайм контейнеров, он их запускает, останавливает, отслеживает.
Docker registry - это контроль версий созданных образов (images) приложения, по аналогии к контролю версий исходников приложения.

Все. Концептуально ничего более Docker и контейнеризация не дают.

Отвечая на Ваши вопросы:


  1. docker-daemon - это HTTP-сервер и он может взять на себя это работу на стороне сервера, т.е. nginx не нужен

    Нет. Docker daemon - это рантайм контейнеров. Он умеет "слушать" на определенных портах, но это сделано для взаимодействия с Docker runtime'ом, а не для выполнения функциональности HTTP-сервера. HTTP-сервер все ещё нужен, и он может (а по-хорошему и должен) быть запущен внутри контейнера.


  2. docker на дев-машине можно (как-то) связать с докером на хостинге

    Мы не жонглируем docker'ами. Docker - всего лишь инструмент для работы с контейнерами. Мы жонглируем контейнерами и приложениями, упакованными в них. Нет смысла связывать docker'ы на хостинге и на дев-машине. Вы создаете образ (image) и можете его запускать через docker как на дев-машине, так и на хостинге. Если Вам нужно, чтобы одни приложения на дев-машине общались с другими на хостинге, то это не вопрос к docker'у - это вопрос к организации связи между Вашими приложениями.


  3. и учитвыая предудущий пункт - docker можно использовать для деплоя

    ИМХО, нужно. Вы закатали в образ точную версию приложения и его окружения. Осталось теперь этот "бинарник" запустить где хочется.


  4. docker можно использовать для отката, если деплой не задался

    Легко. Просто тушим контейнер нового образа и подымаем обратно старый.


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

    Да. Вы в Dockerfile, по сути, точно декларируете свое окружение. Нужно другое окружение - меняем Dockerfile и создаем новый образ.


  6. докер очень быстрый, в т.ч. старты и рестарты

    Не понятно - быстрый в чем? Наверное, имеется в виду сравнение с виртуальными машинами. Да, накладные расзоды меньше, нежели у виртуалок, так как используется одно и то же ядро ОС. Просто процессы запускаются в разных user space'ах. В остальном скорость Docker - это скорость запуска, собственно, процессов. Если у Вас тяжелое приложение с медленным стартом (привет, FMS!) или остановкой, то Docker тут Вам ничем не поможет.

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы