Використовуємо Docker і не хвилюємося про vendor-lock

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

У цій статті ми розповімо про те, як просто використовувати Docker і які переваги він дасть сисадміну і розробнику. Забудьте про проблеми з залежностями, запускайте на одному сервері софт, вимагає різні дистрибутиви Linux, не бійтеся «забруднити» систему неправильними діями. Ділитися напрацюваннями з спільнотою. Docker вирішує безліч актуальних проблем і допомагає зробити IaaS набагато більш схожими на PaaS, без vendor-lock.

InfoboxCloud Docker

хмарних VPS від Іnfobox ми зробили готовий образ Ubuntu 14.04 з Docker. Отримаєте безкоштовну пробну версію (кнопка «Тестувати 10 днів») і почніть використовувати 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/ вірного nginx
deb-src nginx.org/packages/ubuntu/ вірного 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 filesystem on and started docker
stop on runlevel [!2345]
respawn
script
/usr/bin/docker start-a nginx
end script


Висновок

У цій статті ви змогли спробувати Docker і оцінити, як просто упаковувати додаток і мігрувати між різними хостами. Це тільки вершина айсберга, дуже багато чого залишилося за кадром і буде розглянуто в майбутньому. Для додаткового читання рекомендуємо книгу The Docker Book.

Спробувати образ з Docker на хмарних VPS від Іnfobox в Амстердамі можна, отримавши пробну версію безкоштовно (кнопка «Тестувати 10 днів»).

Якщо ви виявили помилку у статті, автор її з задоволенням виправить. Будь ласка напишіть в ЛС або на пошту.
У разі, якщо ви не можете залишати коментарі на Хабре — напишіть коментар до статті Співтоваристві InfoboxCloud.

Успішного використання!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.