Feedback on Docker або як отримати згоду системних адміністраторів та розробників

Якщо в світі говорять про технології, тоді однозначно й про Docker. Дана система керування контейнерами стала стандартною практикою розробників та системних інженерів упродовж останніх двох років. Наразі, Docker  — це найбільший інструментарій, що широко застосовується у структурі хмарних систем.

Що таке Docker?

Docker — це інструмент керування мікроконтейнерами, який використовує libcontainer. Соломон Гайкс створив його за допомогою мови програмування "Go", а з 2013 року він став відкритим джерелом і безліч користувачів зробили вибір на його користь. Гнучкість інструментарію посідає важливу роль у його структурі.

До того як Docker побачив світ, створення такого контейнеру передбачало оволодіння відносно поглибленими концепціями. Система віртуалізації LXC вже отримала велику частину ринку, поширюючи рішення щодо "чистої віртуалізації". OpenVZ та Xen теж відіграли певну роль. Але ці системи були в основному розроблені для серверних рішень і вимагали значної роботи з конфігурацією.

Так як і OpenVZ, Xen і LXC, Docker спирається на принцип кореневого каталогу. Отже, використовується ієрархічна структура як база для віддалених систем (на прикладі chroot) і пропонується мережевий рівень та система налаштування. Але, звичайно, є також і відмінні риси:

По-перше, зображення та контейнери Docker розміщені за допомогою UnionFS. З одного боку, це зберігає простір диску, а з іншого — дозволяє швидко створювати контейнер, не копіюючи цілий корінь.

Інша відмінність полягає в тому, що Docker уникає фази ініціалізації гостьової системи. Іншими словами, корінь контейнера використовується лише як середовище для цільової програми.

За замовчуванням Docker містить стандартну можливість керувати реєстром версій зображень. Спершу використовується загальнодоступний реєстр, що пропонує безліч оригінальних зображень (офіційних зображень або зображень, представлених користувачами в спільноті), а також приватний простір, який може бути доступним за певну плату. Теоретично, Docker дуже схожий на Git, і його базу можна порівняти з сервісом GitHub. Він також використовує загальні поняття, такі як commit, tag і віддалений сервер реєстру.

Спільнота активно працювала над проектом, пропонуючи інструментарій для автостартів (fig, зараз Docker Compose) або для спрощення процесів інтеграції та адміністрування у хмарі (CoreOS), інструментів моніторингу (cAdvisor) тощо.

Сьогодні, Dockerом захоплюється весь світ IT. OpenStack, Amazon, Google, CoreOS, і багато інших корпорацій вивчають технологію Docker і намагаються інтегрувати її зі своєю інфраструктурою.

Тому змагання продовжується!

Зручність для систем

Головною особливістю Docker є легкість створення контейнерів для керування мікросервісами. Перш за все, контейнер —  це спосіб повністю ізолювати програму. Завдяки бібліотеці libcontainer, Docker використовує її пам'ять та ізолює програми через керування механізмом cgroups.

Структура

Docker став надзвичайно популярним через невелику кількість ресурсів, що він використовує. Вивчаючи Docker, ви будете здивовані на скільки просто створити масштабну та доступну систему.

Команда “docker” створена для з'єднання з системою Daemon. За замовчуванням, сервіс (daemon) створює Unix сокет (/var/run/docker.sock), який підтримує API. Команди “docker” використовують API.

API можна застосовувати для перегляду таких дій як створення контейнеру, початок та кінець роботи. Коли ви працюєте з інформацією API, ви можете з легкістю визначити який саме контейнер працює та на якому сервісі тощо.

Якщо ви не бажаєте або не можете використовувати механізми, необхідні для CoreOS, OpenStack тощо, ви можете створити власну структуру та інструментарій. API доступний та дуже ефективний.

Нижче наведено приклад структури, що використовується на одному з наших проектів:

Docker schema

Простими словами:

  1. Кожен підпорядкований сервер зчитується за допомогою Docker сокету.
  2. Коли контейнер розпочинає або припиняє роботу, сервіс відправляє інформацію на головний сервер.

Головний сервер може змінювати конфігурацію nginx або видаляти попередній сервер.

Інший спосіб — змінення конфігурації Docker для відображення API у режимі TCP (щоб зробити його доступним для мережі). Це дозволило нам встановити наступну структуру:

 

Docker schema high

Різниця у тому, що головний сервер повинен зчитувати інформацію зі всіх підпорядкованих серверів. Попередній метод менш затратний завдяки тому, що підпорядковані сервери самі з'єднуються з головним.

В обох випадках, основний сервер отримує інформацію про початок і кінець роботи контейнера і може змінювати конфігурацію nginx, запускати контейнери чи запобігати проблемам.

Також, є можливість налаштування двох головних серверів для керування.

Зручність для розробників

Docker дійсно зручний для системних адміністраторів, але він також може бути корисним і для розробників. Одним із рішень, які ми вже використовували для проекту, є комбінація Dockerfiles та docker-compose.

Ідея полягає у визначенні складових робочого місця розробника, необхідних для запуску проекту, а потім для створення файлів Docker (при необхідності), які будуватимуть зображення відповідно до встановлених обмежень, а також файлу docker-compose.yml, що зв'язує контейнери.

Пізніше коли ви будете використовувати сервер керування версіями (Git, Mercurial, SVN тощо), вам потрібно буде просто встановити каталог проекту щоб включити ці файли й базовий код проекту та вказати обсяг потрібний для контейнеру. Після цього розробники отримують проект і єдина команда необхідна для запуску сервісів - “docker-compose up”.

Для прикладу візьмемо проект на Drupal. Можуть використовуватися два контейнери:

  1. Контейнер MySQL;
  2. Контейнер з сервером Apache +  модуль PHP.

Базові коди Drupal розміщені в “/src” і відправляються в контейнер Apache. Окремий файл на головному сервері можна додати в будь-який інший контейнер або в кілька контейнерів в конкретному каталозі. Так само і з контейнером MySQL, для запобігання втрати збережених даних.

Приклад Dockerfile:

FROM debian:7
MAINTAINER admin-dt@smile.fr
 
# Installation des paquets
RUN apt-get update && \
    apt-get install \
        apache2 \
        php5 \
        php5-mysql \
        libapache2-mod-php5
 
# Lancer apache
CMD /usr/sbin/apache2ctl -D FOREGROUND

І приклад файлу docker-compose.yml:

web:
        dockerfile: .
        volumes:
        - "./src:/var/www/drupal"
        ports:
         - "8080:80"
        links:
         - "db"
db:
        image: mysql
        volumes:
        - "./data:/var/lib/mysql"

 "Web" сервіс сполучений з базами даних (“db”) (“посилання” в наведеному прикладі), задля можливості зчитування змін у середовищі, що підтримує адреси і порти MySQL  (показано у Dockerfile).

Приклади декількох змін, доступних у “web” контейнері:

  1. DB_PORT_3306_TCP_ADDR=172.17.1.24
  2. DB_PORT_3306_TCP_PORT=3306

Ви можете використовувати також фіксовані назви контейнерів, адже “web” і “db” автоматичні назви двох контейнерів. 

Іншими словами, адреса “mysql://db” фіксована. Отже, все що потрібно зробити — це змінити конфігурацію файлів Drupal для доступу до бази даних.

Тоді проект буде мати наступну структуру: 

  1.  ”data/”для зберігання даних MySQL.
  2.  ”src/”, що містить базовий код Drupal.
  3.  ”Dockerfile” для створення зображень Apache/PHP.
  4.  ”docker-compose.yml”, що описує процес запуску контейнерів.

Висновок

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