Используем Docker и не волнуемся о vendor-lock

Docker в значительной мере изменил подход к настройке серверов, поддержке и доставке приложений. Разработчики начинают задумываться о том, можно ли архитектуру их приложений разделить на более мелкие компоненты, которые будут запускаться в изолированных контейнерах, что позволит достичь большего ускорения, параллелизации исполнения и надежности. Также Docker решает важную проблему снятия облачного vendor–lock и позволяет легко мигрировать настроенные приложения между собственными серверами и облаками. Все что требуется от сервера, чтобы запустить Docker — более-менее современная ОС Linux с ядром не ниже 3.8.В этой статье мы расскажем о том, как просто использовать Docker и какие преимущества он даст сисадмину и разработчику. Забудьте про проблемы с зависимостями, запускайте на одном сервере софт, требующий разные дистрибутивы Linux, не бойтесь «загрязнить» систему неправильными действиями. И делитесь наработками с сообществом. Docker решает множество актуальных проблем и помогает сделать IaaS гораздо более похожими на PaaS, без vendor-lock.

InfoboxCloud Docker

На облачных VPS от Infobox мы сделали готовый образ Ubuntu 14.04 с Docker. Получите бесплатную пробную версию (кнопка «Тестировать 10 дней») и начните использовать Docker прямо сейчас! Не забудьте поставить галочку «Разрешить управление ядром ОС» при создании сервера, это требуется для работы Docker. В самое ближайшее время у нас появятся и другие ОС с Docker внутри.

Под катом вы узнаете, что же в Docker настолько воодушевило автора статьи, что за пару дней он перевел свои облачные сервера, автоматизирующие части процесса разработки, в контейнеры Docker.

Что же такое DockerDocker — open–source движок, автоматизирующий развертывание приложений в легковесные, переносимые, самодостаточные контейнеры, которые могут без изменений переноситься между серверами.Тот же самый контейнер, который разработчик создает и тестирует на ноутбуке, может быть легко перенесен на продакшн-сервера в облако и так же легко смигрирован в другой регион при необходимости.

Основные способы использования Docker:

Автоматизация упаковки и развертывания приложений Создание собственных легковесных PaaS окружений Автоматизация тестирования и непрерывной интеграции/развертывания Развертывание и масштабирование веб-приложений, баз данных и сервисов бекенда Пятнадцать лет назад практически все приложения разрабатывались на хорошо известных стеках технологий и развертывались в единый, монолитный, проприетарный сервер. Сегодня разработчики создают и распространяют приложения с использованием лучших доступных сервисов и технологий и должны подготовить приложения для развертывания в самые различные места: на физические серверы, в публичные и приватные облака. Критерием выбора облака становится качество сервиса, безопасность, надежность и доступность, в то время как vendor–lock уходит в прошлое.Можно провести неплохую аналогию из области грузоперевозок. До 1960х большинство грузов перевозились вперемешку. Перевозчикам нужно было заботиться о воздействии одного типа груза на другой (например, если наковальни внезапно положили на мешки с бананами). Смена транспорта, например с поезда на корабль, для груза тоже было испытанием. До половины времени поездки занимала погрузка, разгрузка и перегрузка. Были большие потери в процессе поездки из-за повреждения груза.

Решением проблемы стал стандартный контейнер для перевозки. Теперь любые типы грузов (от помидоров до автомобилей) могли быть упакованы в контейнеры. Контейнеры не открывались до окончания поездки. Легко было эффективно расположить контейнеры на транспорте и перегружать автоматическими кранами при необходимости, без разгрузки самого контейнера. Контейнеры изменили мир грузоперевозок. Сегодня 18 миллионов перевозимых стандартных контейнеров составляют 90% мировой торговли.

76c149.jpgКонтейнеры для морских грузовых перевозок в порту Циндао, Китай.

Docker можно представить именно как такие контейнеры в коде компьютера. Практически любое приложение может быть упаковано в легковесный контейнер, позволяющий автоматизацию. Такие контейнеры спроектированы, чтобы запускаться виртуально на любом Linux–сервере (с ядром 3.8 и выше).

Другими словами, разработчики могут упаковать свои приложения один раз и будут уверены, что приложение запускается именно в их протестированной конфигурации. Работа сисадминов также значительно упрощается — о поддержке софта нужно заботиться все меньше.

Компоненты Docker Клиент и сервер Docker — клиент-серверное приложение. Клиенты разговаривают с сервером (демоном), который непосредственно делает всю работу. Для управления Docker можно использовать утилиту командной строки docker и RESTful API. Можно запускать клиент и сервер на одном хосте или удаленно подключаться к Docker-серверу.Образы Docker Свои контейнеры пользователь запускает из образов, которые являются частью процесса построения контейнера. Образ использует AuFS для прозрачного монтирования файловых систем. С помощью bootfs загружается контейнер в память. Затем bootfs отмонтируется, освобождая память. Далее работает rootfs (от Debian, Ubuntu и т.д.). В Docker rootfs монтируется в режиме «только для чтения». Когда контейнер запущен из образа, монтируется файловая система на запись поверх необходимого слоя ниже.54c4f9.png

Реестры Docker хранит созданные вами образы в реестрах. Существует два типа реестров: публичные и приватные. Официальный реестр называется Docker Hub. Создав в нем аккаунт, можно сохранять свои образы в нем и делиться ими с другими пользователями.В Docker Hub уже более 10 000 образов с различными ОС и программным обеспечением. Также можно сохранять приватные образы в Docker Hub и использовать их в рамках вашей организации. Использование Docker Hub необязательно. Возможно создание собственных репозиториев вне инфраструктуры Docker (например на ваших корпоративных облачных серверах).

Контейнеры Docker помогает вам создавать и развертывать контейнеры, внутри которых вы можете запускать ваши приложения и сервисы. Контейнеры запускаются из образов.Когда Docker запускает контейнер, слой для записи пуст. При изменениях они записываются в этот слой. Например при изменении файла он копируется в слой, доступный для записи (copy on write). Копия «только для чтения» по-прежнему существует, но скрывается. После создания контейнера Docker выстраивает набор read–only образов и подключает слой для записи.

Создаем интерактивный контейнер После создания виртуальной машины с Docker можно приступать к созданию контейнеров. Получить базовую информацию об инсталляции можно командой docker info.c0ea69.pngПолный список доступных команд можно получить командой docker help.

Давайте построим контейнер с Ubuntu.

sudo docker run -i -t ubuntu /bin/bash Флаг -i оставляет STDIN открытым, даже, когда вы не присоединены к контейнеру. Флаг -t назначает псевдо-tty контейнеру. Таким образом создается интерактивный интерфейс к контейнеру. Так же мы указываем название образа (ubuntu — базовый образ) и шелл /bin/bash.Давайте установим nano в контейнер.

apt-get update apt-get install -y nano Выйти из контейнера можно командой exit.Команда docker ps показывает список всех запущенных контейнеров, а docker ps -a — список всех, включая остановленные.

e7213a.pngВ списке запущенных контейнеров нет. Когда вы вышли из контейнера, он остановился. На скриншоте выше (docker ps -a) видно имя контейнера. Когда вы создаете контейнер, имя генерируется автоматически. Вы можете указать другое имя при создании контейнера:

docker run --name habrahabr -t -i ubuntu Обращаться к контейнеру можно не только по ID, но и по имени.Давайте запустим контейнер: docker start stupefied_lovelace Для подключения к контейнеру необходимо использовать команду attach: docker attach stupefied_lovelace (может понадобиться нажатие Enter до появления приглашения).Создаем контейнер-демон Конечно, можно создавать и долгоживущие контейнеры, подходящие для запусков приложений и сервисов. Такие контейнеры не имеют интерактивной сессии. docker run --name city -d ubuntu /bin/bash -c «while true; do echo hello world; sleep 1; done» , где city — имя контейнера.Посмотреть, что происходит внутри контейнера можно командой docker logs <имя контейнера>.Остановить контейнер можно командой docker stop <имя контейнера>. Если после этого запустить контейнер снова docker start <имя контейнера>, выполнение цикла while продолжится в контейнере.Увидеть детали контейнера можно командой docker inspect <имя контейнера>.Чтобы удалить контейнер, используйте docker rm <имя контейнера>.

Как достать и положить данные? Для того, чтобы скопировать данные в контейнер или вынуть из него, необходимо воспользоваться командой docker cp <путь к данным на хосте> <имя контейнера>: <путь> Можно подмонтировать папку хоста в контейнер при создании: docker run -v /tmp:/root -t -i <имя образа> , где /tmp — путь к папке на хосте, а /root — путь к папке на сервере. Таким образом можно работать из контейнера с данными на хосте и исключить необходимость копирования данных в обе стороны.Работаем с образами Давайте посмотрим список всех наших образов docker imagesc1e789.png

Изменения в существующем контейнере можно закоммитить в образ для дальнейшего использования.

docker commit <имя образа> .Перенос образа на другой хост Наконец-то о главном. Допустим, вы настроили свое приложение в Docker и закоммитили в образ. Теперь можно сохранить образ в файл docker save имя_образа > ~/transfer.tar Копируем этот образ на другой хост например с помощью scp и импортируем его в Docker. docker load < /tmp/transfer.tar Вот и все, можно легко переносить свои приложения между хостами, облаками и собственными серверами. Никакого vendor–lock. Только ради этого стоит использовать Docker! (если вы сохраняли данные на примонтированную файловую систему, не забудьте перенести и их).Устанавливаем nginx в Docker Давайте для примера установим nginx в Docker и настроим его автозапуск. Конечно можно просто скачать образ с nginx для Docker, но мы посмотрим, как это делается с самого начала.Создайте чистый контейнер с Ubuntu 14.04 с открытыми 80 и 443 портами:

docker run -i -t -p 80:80 --name nginx ubuntu: trusty Добавьте в /etc/apt/sources.list официальный репозиторий стабильной версии nginx: deb nginx.org/packages/ubuntu/ trusty nginxdeb-src nginx.org/packages/ubuntu/ trusty nginxУстановите nginx:

apt-key update apt-get update apt-get install nginx Можно проверить, что nginx запускается, выполнив:

/etc/init.d/nginx start Мы увидим страницу приветствия, зайдя на ip сервера на порт 80: 968a8a.pngДля различных применений настройки nginx могут отличаться, имеет смысл сохранить контейнер с nginx в образ <ваш логин на hub.docker.com>/nginx:

docker commit nginx trukhinyuri/nginx Здесь мы впервые встретились с Docker Hub. Время создать аккаунт в этом сервисе и залогиниться с помощью команды docker login.Теперь вы можете поделиться образом с другими пользователями или просто сохранить образ для повторного использования на других хостах. Мы не просто так сохраняли образ в формате <имя пользователя>: <тэг образа>. Попытка отправить образ, именнованный в другом формате будет неуспешной. Например если вы попробуете отправить образ, просто названный nginx, вам вежливо сообщат, что в root репозиторий сохранять образы могут только избранные.

Отправим наш образ trukhinyuri/nginx на docker hub для повторного использования на других серверах в будущем. (здесь trukhinyuri — имя репозитория автора):

docker push trukhinyuri/nginx Для того, чтобы nginx стартовал при запуске хоста, добавим скрипт инициализации upstart по адресу /etc/init/nginx.conf: description «Nginx«author «Me«start on filesystem and started dockerstop on runlevel [!2345]respawnscript/usr/bin/docker start -a nginxend scriptЗаключение В этой статье вы смогли попробовать Docker и оценить, как просто упаковывать приложение и мигрировать между различными хостами. Это только вершина айсберга, очень многое осталось за кадром и будет рассмотрено в будущем. Для дополнительного чтения рекомендуем книгу The Docker Book.Попробовать образ с Docker в на облачных VPS от Infobox в Амстердаме можно, получив пробную версию бесплатно (кнопка «Тестировать 10 дней»).

Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней.В случае, если вы не можете оставлять комментарии на Хабре — напишите комментарий к статье в Сообществе InfoboxCloud.

Успешного использования!

© Habrahabr.ru