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

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

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

InfoboxCloud Docker

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

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

Что же такое Docker

Docker – open–source движок, автоматизирующий развертывание приложений в легковесные, переносимые, самодостаточные контейнеры, которые могут без изменений переноситься между серверами.

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

Основные способы использования Docker:
  • Автоматизация упаковки и развертывания приложений
  • Создание собственных легковесных PaaS окружений
  • Автоматизация тестирования и непрерывной интеграции/развертывания
  • Развертывание и масштабирование веб-приложений, баз данных и сервисов бекенда

Пятнадцать лет назад практически все приложения разрабатывались на хорошо известных стеках технологий и развертывались в единый, монолитный, проприетарный сервер. Сегодня разработчики создают и распространяют приложения с использованием лучших доступных сервисов и технологий и должны подготовить приложения для развертывания в самые различные места: на физические серверы, в публичные и приватные облака. Критерием выбора облака становится качество сервиса, безопасность, надежность и доступность, в то время как vendor–lock уходит в прошлое.

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


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

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

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

Компоненты Docker


Клиент и сервер
Docker – клиент-серверное приложение. Клиенты разговаривают с сервером (демоном), который непосредственно делает всю работу. Для управления Docker можно использовать утилиту командной строки docker и RESTful API. Можно запускать клиент и сервер на одном хосте или удаленно подключаться к Docker-серверу.

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



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

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

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

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

Создаем интерактивный контейнер

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


Полный список доступных команд можно получить командой 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 – список всех, включая остановленные.


В списке запущенных контейнеров нет. Когда вы вышли из контейнера, он остановился. На скриншоте выше (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 images



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

Перенос образа на другой хост

Наконец-то о главном. Допустим, вы настроили свое приложение в 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 nginx
deb-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:


Для различных применений настройки 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 docker
stop on runlevel [!2345]
respawn
script
  /usr/bin/docker start -a nginx
end script


Заключение

В этой статье вы смогли попробовать Docker и оценить, как просто упаковывать приложение и мигрировать между различными хостами. Это только вершина айсберга, очень многое осталось за кадром и будет рассмотрено в будущем. Для дополнительного чтения рекомендуем книгу The Docker Book.

Продолжение статьи тут.

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

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

0 комментариев

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