Как жить с Докер, или почему лучше с ним, чем без него?

Как жить с Докер, или почему лучше с ним, чем без него?

508
ПОДЕЛИТЬСЯ

Но что делать с ней не знает. В статье , носит рекомендательный нрав и не покушается на звание «наилучшая практика». Эта статья предназначена для тех, кто уже знает о Докер, знает, что это такое.
Так что, может быть, вы были докер учебник, Докер, кажется, обычный и нужный, но по-прежнему не знаю, как он может посодействовать Для вас с вашими проектами.
Как правило, используйте существует три трудности:
Как мне поставить код на сервере?
Как мне запустить код на сервере?
Как мне обеспечить таковой же среды, в которой запускается и работает мой код?

Итак, давайте начнем не с докер, и как мы жили без него. Это поможет Докер под катом.
RPM либо DEB не играет никакой роли. Как мне поставить код на сервере? 1-ое, что приходит на разум, это поставить все совместно в пакет.
Пакеты
У вас уже есть менеджер пакетов, который может управлять файлами, мы традиционно ожидаем последующие:

Для доставки файлов проекта на сервер из магазина
Для ублажения зависимостей (библиотек, интерпретатор и т.д.)
Чтоб удалить файлы из предшествующей версии и поставить файлы текущих.

На практике, это работает пока… Быстрее всего «как традиционно неумелых» developer написал лишь для libxx, и совместно с libyy она не работает. вы целыми днями делаете автоматизации рутинных мероприятий, в которых принимают роль админы. Т. Но тут возникает неувязка: необходимо для 1-го проекта, чтоб заменить libyy (который находится под Centos сам квест) на libxx. е. Отлично, берем в руки vim и писать rpmspecu для libxx, параллельно новейшие версии библиотек, которые нужны для сборки. У вас есть маленький парк машин, на которых Вы не разводите зоопарк дистрибутивов. И это везде. К примеру, Для вас нравится Centos. Вы DevOps на постоянной базе. Почему заменить — не знаю. представьте ситуацию. И около 2-3 дней упражнений, и это один из результатов:

libxx собрал, все отлично, задачка выполнена
libxx не собрались, не поэтому что, скажем, у вас есть libyy, которые должны быть удалены, и это зависит от чего же-то еще на сервере
libxx не собрались, не хватает библиотеки, что нет противоречия с какой-или иной библиотеки

Итого возможность совладать с неувязкой около 30% (хотя на практике постоянно падают варианты 2 либо 3). И раз 2-ая ситуация может быть преодолена (Windows tray application там либо lxc), потом 3-я ситуация либо добавить собственный зверинец другого животного, либо собирать ручками в /usr/local привет нуля/slackware и т.д.
Решения этого масса, от обычных chroot для сложных проектов, типа NixOs В общем, эта ситуация именуется dependency hell.

Бизнес и здравый смысл, быстро убить их всех. Ограничения ничего не, в конце концов. Кому не нравится в отдел кадров с заявлением.». Она может быть решена разными методами. Как лишь вы начинаете собирать все пакеты и отвезти их на той же системе, у вас ситуация зависимостей ад. То, что я делаю. Под ограничениями я имею в виду набор политик компании, как: «мы имеем тут лишь libyy-vN.Н. О Н Н Я, тоже, не просто так произнес, некие библиотеки не могут жить на одном сервере в 2-ух версиях. Либо для каждого проекта, поставить новейший репозиторий плюс новейшей Windows tray application/оборудования, либо вводить ограничения. Ах, ну, да.
Подумайте, что важнее: сделать функцию в продукте, которая зависит от обновления компонентов третьей стороны, либо отдать devops время, чтоб насладиться гетерогенность среды.
Развертывание с помощью GIT
И также не избавляют зависимость-ад. Отлично подступает для программ на интерпретируемых языках. Не отлично то, что для вас необходимо скомпилировать.
Как мне запустить код на сервере? Этот вопросец уже много чего же выдумали: daemontools, runit, супервайзер. Мы считаем, что этот вопросец имеет по последней мере один верный ответ.
Как мне обеспечить таковой же среды, в которой запускается и работает мой код? Представьте для себя обыденную ситуацию, а ты все таковой же DevOps, к для вас приходит задание, нужно развернуть проект «Eniac» (заглавие взято от наименования генератора для проектов) на N серверов, где N больше 20.
Это вы. В качестве тестеров, проект развернут на компе разраба, все приняла. С точки зрения вашей голове, Вы не сможете запустить проект. Как вы все обратно, и «неумелых» уже вас. Вы хватаете Eniac из GIT, это узнаваемый технологий (Django/RoR/Go/1C), собрать его обыденным способом, запустить и… Как Разраб, все работает. Связаться с разрабом, винят его по 1-ое число, что он, как традиционно, «неумелой». не работает.
Осознать делему. Идите вперед, вы сможете запустить Eniac на одном сервере, и не могу еще N-1.
Как Докер поможет мне?
Ну, во-первых давайте поглядим, как применять окно в качестве средств реализации проектов на оборудовании.
В докер-Hub можно установить на Windows tray приложения в Amazon и хранить данные в Amazon S3, либо надеть их инфраструктуры и хранения данных в Ceph либо FS. Личные Докер Реестра
Какие опции реестра? Это то, что сохраняет ваши данные, такие как интернет-сервер, который распределяет deb-пакеты и файлы с метаданными для их.
Сам докер реестра тоже можно запустить dockerom. Это просто приложение на python (наверняка, идти мне удалось написать библиотеку для хранения данных, которое поддерживает огромное количество реестре).
И в этом магазине будет зайти на наш проект, мы будем анализировать позднее.
К примеру apt: Сейчас давайте сравним, как мы сдать проект в обычный менеджер пакетов. Как мне запустить код на сервере?
Она все расслабленно будете иметь, чтоб перезагрузить наши приложения. apt-get update && apt-get install-y myuperproject
Эта команда предназначена для автоматизации.
Вот пример опции:
Докер будет скачать с вашего докер реестра, расположенном по адресу 192.168.1.1 и слушает порт 80 (у меня nginx), все, что нужно для пуска, и запустить superproject-run.sh снутри вида. в докер-выполнить-d 192.168.1.1:80/reponame/mysuperproject:1.0.5rc1 superproject-run.sh
И на этом все.
Не неувязка: Что произойдет, раз 2 программы, которые мы запускаем, и, скажем, в последующем релизе один из их сломался, но еще на фронте, получил некие доп функции, которые вы желаете, чтоб выкатить.
в докер-выполнить-d 192.168.1.1:80/reponame/mysuperproject:1.0.10 superproject-run.sh
в докер-выполнить-d 192.168.1.1:80/reponame/mysuperproject:1.0.5rc1 broken-program.sh

И сейчас мы имеем 2 различных контейнера, а снутри их могут быть совсем различные версии системных библиотек, файлов и др.
В неприятном случае нельзя гарантировать, что xxx-utils же версия на N серверов. Как мне предоставить ту же среду, в которой она запускается и работает мой код? Ну либо выяснить, шеф-повар/Ansible/Puppet либо что-то еще из схожих решений. В случае обычной виртуальной машинки либо даже настоящих систем должны смотреть сами.
В случае докер ничего не делать, просто раскройте контейнеры из схожих изображений.
Контейнер В Сборе
Чтоб убедиться, что код попал в докер реестра (либо глобального значения не имеет), вы его туда запихнуть.
Вы сможете вынудить разраба собрать сам контейнер:

Разраб пишет Dockerfile
Делает докер тег $imageId 192.168.1.1:80/reponame/mysuperproject:1.0.5rc1
И пихает докер push 192.168.1.1:80/reponame/mysuperproject:1.0.5rc1

Либо собирать автоматом. Я не отыскал ничего, что собирает контейнеры, потому, вот, я собрал велик именуется lumper
Сущность в последующем:

Установлен на сервере компонент 3 lumper и RabbitMQ
Порт прослушивания для github крючки.
Обычай в github интернет-крюк на наши установки lumper
Разраб делает git tag v0.0.1 && git push —tags
Получает письмо с плодами построения

К примеру, вы собираете lumper с помощью Dockerfile. Dockerfile
На самом деле нет ничего сложного.
От ubuntu:14.04
Провождающий Дмитрий Орлов <me@mosquito.su>

Запустите apt-get update &&
apt-get install-y python-pip python-dev git &&
apt-get clean

Добавить». /tmp/build/
Запустить pip install —upgrade —pre /tmp/build && rm-fr /tmp/build

ENTRYPOINT [«/usr/local/bin/lumper»]
Дальше запускается команда готовится окружающей среды. rm mosquito/lumper —help, чтоб узреть выход —help entrypoint. Потому, когда вы начали писать докер run-это … Тут говорить о том, что изображение. Добавить помещает код в /tmp/build, потом ENTRYPOINT задает точку входа в наш контейнер.
Вывод
Для того, чтоб начать контейнера на сервере есть несколько методов, вы сможете или написать init-скрипт, либо поглядите на рис, который может применять готовые решения из контейнеров.
Не считая того, я сознательно обошел стороной темы порты и ip-маршрутизации контейнеров.
Спасибо за Ваше внимание. Не считая того, так как разработка юная, докер большущее общество. habrahabr.ru И хорошая документация.