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

В InfoboxCloud мы сделали готовый образ Ubuntu 14.04 с Docker. Получите бесплатную пробную версию и начните использовать Docker прямо сейчас! Не забудьте поставить галочку «Разрешить управление ядром ОС» при создании сервера, это требуется для работы Docker. В самое ближайшее время у нас появятся и другие ОС с Docker внутри.
Под катом вы узнаете, что же в Docker настолько воодушевило автора статьи, что за пару дней он перевел все свои личные облачные сервера, автоматизирующие части процесса разработки в контейнеры Docker.
Тот же самый контейнер, который разработчик создает и тестирует на ноутбуке, может быть легко перенесен на продакшн-сервера в облако и так же легко смигрирован в другой регион при необходимости.
Основные способы использования Docker:
Пятнадцать лет назад практически все приложения разрабатывались на хорошо известных стеках технологий и развертывались в единый, монолитный, проприетарный сервер. Сегодня разработчики создают и распространяют приложения с использованием лучших доступных сервисов и технологий и должны подготовить приложения для развертывания в самые различные места: на физические серверы, в публичные и приватные облака. Критерием выбора облака становится качество сервиса, безопасность, надежность и доступность, в то время как vendor–lock уходит в прошлое.
Можно провести неплохую аналогию из области грузоперевозок. До 1960х большинство грузов перевозились вперемешку. Перевозчикам нужно было заботиться о воздействии одного типа груза на другой (например, если наковальни внезапно положили на мешки с бананами). Смена транспорта, например с поезда на корабль, для груза тоже было испытанием. До половины времени поездки занимала погрузка, разгрузка и перегрузка. Были большие потери в процессе поездки из-за повреждения груза.
Решением проблемы стал стандартный контейнер для перевозки. Теперь любые типы грузов (от помидоров до автомобилей) могли быть упакованы в контейнеры. Контейнеры не открывались до окончания поездки. Легко было эффективно расположить контейнеры на транспорте и перегружать автоматическими кранами при необходимости, без разгрузки самого контейнера. Контейнеры изменили мир грузоперевозок. Сегодня 18 миллионов перевозимых стандартных контейнеров составляют 90% мировой торговли.

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

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

Полный список доступных команд можно получить командой docker help.
Давайте построим контейнер с Ubuntu.
Флаг -i оставляет STDIN открытым, даже, когда вы не присоединены к контейнеру. Флаг -t назначает псевдо-tty контейнеру. Таким образом создается интерактивный интерфейс к контейнеру. Так же мы указываем название образа (ubuntu — базовый образ) и шелл /bin/bash.
Давайте установим nano в контейнер.
Выйти из контейнера можно командой exit.
Команда docker ps показывает список всех запущенных контейнеров, а docker ps -a – список всех, включая остановленные.

В списке запущенных контейнеров нет. Когда вы вышли из контейнера, он остановился. На скриншоте выше (docker ps -a) видно имя контейнера. Когда вы создаете контейнер, имя генерируется автоматически. Вы можете указать другое имя при создании контейнера:
Обращаться к контейнеру можно не только по ID, но и по имени.
Давайте запустим контейнер:
Для подключения к контейнеру необходимо использовать команду attach:
(может понадобиться нажатие Enter до появления приглашения).
Посмотреть, что происходит внутри контейнера можно командой docker logs <имя контейнера>.
Остановить контейнер можно командой docker stop <имя контейнера>. Если после этого запустить контейнер снова docker start <имя контейнера>, выполнение цикла while продолжится в контейнере.
Увидеть детали контейнера можно командой docker inspect <имя контейнера>.
Чтобы удалить контейнер, используйте docker rm <имя контейнера>.
Можно подмонтировать папку хоста в контейнер при создании:
где /tmp – путь к папке на хосте, а /root – путь к папке на сервере. Таким образом можно работать из контейнера с данными на хосте и исключить необходимость копирования данных в обе стороны.

Изменения в существующем контейнере можно закоммитить в образ для дальнейшего использования.
Копируем этот образ на другой хост например с помощью scp и импортируем его в Docker.
Вот и все, можно легко переносить свои приложения между хостами, облаками и собственными серверами. Никакого vendor–lock. Только ради этого стоит использовать Docker! (если вы сохраняли данные на примонтированную файловую систему, не забудьте перенести и их).
Создайте чистый контейнер с Ubuntu 14.04 с открытыми 80 и 443 портами:
Добавьте в /etc/apt/sources.list официальный репозиторий стабильной версии nginx:
deb nginx.org/packages/ubuntu/ trusty nginx
deb-src nginx.org/packages/ubuntu/ trusty nginx
Установите nginx:
Можно проверить, что nginx запускается, выполнив:
Мы увидим страницу приветствия, зайдя на ip сервера на порт 80:

Для различных применений настройки nginx могут отличаться, имеет смысл сохранить контейнер с nginx в образ <ваш логин на hub.docker.com>/nginx:
Здесь мы впервые встретились с Docker Hub. Время создать аккаунт в этом сервисе и залогиниться с помощью команды docker login.
Теперь вы можете поделиться образом с другими пользователями или просто сохранить образ для повторного использования на других хостах. Мы не просто так сохраняли образ в формате <имя пользователя>:<тэг образа>. Попытка отправить образ, именнованный в другом формате будет неуспешной. Например если вы попробуете отправить образ, просто названный nginx, вам вежливо сообщат, что в root репозиторий сохранять образы могут только избранные.
Отправим наш образ trukhinyuri/nginx на docker hub для повторного использования на других серверах в будущем. (здесь trukhinyuri – имя репозитория автора):
Для того, чтобы nginx стартовал при запуске хоста, добавим скрипт инициализации upstart по адресу /etc/init/nginx.conf:
Продолжение статьи тут.
Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней.
Успешного использования Docker!
В этой статье мы расскажем о том, как просто использовать Docker и какие преимущества он даст сисадмину и разработчику. Забудьте про проблемы с зависимостями, запускайте на одном сервере софт, требующий разные дистрибутивы Linux, не бойтесь «загрязнить» систему неправильными действиями. И делитесь наработками с сообществом. Docker решает множество актуальных проблем и помогает сделать IaaS гораздо более похожими на PaaS, без vendor-lock.

В 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 комментариев