Перейти до основного вмісту

Docker

Docker - програмне забезпечення для автоматизації розгортання та управління додатками в середовищах із підтримкою контейнеризації. Дає змогу "упакувати" застосунок з усім його оточенням і залежностями в контейнер, який можна перенести на будь-яку Linux-систему з підтримкою cgroups у ядрі, а також надає середовище з управління контейнерами. Спочатку використовував можливості LXC, з 2015 року застосовував власну бібліотеку, що абстрагує віртуалізаційні можливості ядра Linux - libcontainer. З появою Open Container Initiative почався перехід від монолітної до модульної архітектури.

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

"Образ контейнера" є шаблоном для виконання контейнера - це означає, що ви можете мати декілька контейнерів, які запускаються з одного образу і мають однакову поведінку, що сприяє масштабуванню та розповсюдженню програми. Ці образи можна зберігати у віддаленому реєстрі(репозиторії) для полегшення розповсюдження. Після створення контейнера, виконанням керує середовище виконання контейнера. Ви можете взаємодіяти з середовищем виконання контейнера за допомогою команди "docker". Три основні компоненти архітектури контейнера (клієнт, середовище виконання та реєстр).

Основні терміни

Image (образ)

Образ у першому наближенні можна розглядати як набір файлів. До складу образу входить все необхідне для запуску і роботи програми на голій машині з докером: ОС, середовище виконання і додаток, готовий до розгортання.

  • Образ - це набір файлів, необхідних для роботи програми на голій машині зі встановленим Docker.
  • Образ складається з незмінних шарів, кожен з яких додає/видаляє/змінює файли з попереднього шару.
  • Незмінність шарів дає змогу їх використовувати спільно в різних образах.

Docker-контейнери

Контейнер - процес, ініціалізований на базі образу. Тобто контейнер існує тільки коли його запущено. Це як екземпляр класу, а образ це типу клас. Суть перетворення образу в контейнер полягає в додаванні верхнього шару, для якого дозволено запис. Результати роботи програми (файли) пишуться саме в цьому шарі.

  • Host (хост) - середовище, у якому запускається докер, тобто ваша локальна машина.
  • Volume - дисковий простір між хостом і контейнером. Це тека на вашій локальній машині примонтована всередину контейнера. Змінюєте тут - змінюється там, і навпаки.
  • Dockerfile - файл із набором інструкцій для створення образу майбутнього контейнера
  • Service (сервіс) - по суті це запущений образ (один або кілька контейнерів), додатково налаштований такими опціями, як відкриття портів, маппінг папок (volume) та інше. Зазвичай це робиться за допомогою docker-compose.yml файлу.
  • Docker-compose - тулза, що полегшує складання і запуск системи, яка складається з декількох контейнерів, пов'язаних між собою.
  • Build (білд, білдити) - процес створення образу з набору інструкцій у докерфайлі, або декількох докерфайлів, якщо білд робиться за допомогою композера

RUN vs CMD vs ENTRYPOINT

Ці інструкції виконуються під час складання docker-образу з Dockerfile. RUN дає змогу виконувати команди всередині вашого docker-образу - такі команди виконуються тільки один раз під час складання і створюють новий шар у підсумковому docker-образі.

Якщо вам необхідно встановити пакет або створити каталог всередині вашого docker-образу, то інструкція RUN підійде вам якнайкраще. Наприклад:

RUN mkdir -p /var/www/test

Інструкція CMD дає змогу визначити команду за замовчуванням, яка виконуватиметься під час запуску вашого docker-контейнера (запущений docker-образ називається контейнером). Ця інструкція не виконується під час складання!

Наприклад, у Dockerfile для веб-додатка цілком логічно додати інструкцію CMD, яка запустить веб-сервер під час старту контейнера, наприклад:

CMD ["php", "-S", "0.0.0.0:9095", "-t", "public", "public/index.php"]
  1. За допомогою інструкцій RUN побудуйте зображення, додаючи шари поверх початкового зображення.
  2. Віддавайте перевагу ENTRYPOINT, а не CMD під час побудови виконуваного Docker-образу, якщо потрібно, щоб команда завжди виконувалася. Крім того, використовуйте CMD, якщо потрібно вказати додаткові аргументи за замовчуванням, які можна перезаписати з командного рядка під час запуску контейнера docker.
  3. Вибирайте CMD, якщо вам потрібно надати команду за замовчуванням та/або аргументи, які можна перезаписати з командного рядка під час запуску контейнера docker.

Docker-compose

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