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"]
- За допомогою інструкцій RUN побудуйте зображення, додаючи шари поверх початкового зображення.
- Віддавайте перевагу ENTRYPOINT, а не CMD під час побудови виконуваного Docker-образу, якщо потрібно, щоб команда завжди виконувалася. Крім того, використовуйте CMD, якщо потрібно вказати додаткові аргументи за замовчуванням, які можна перезаписати з командного рядка під час запуску контейнера docker.
- Вибирайте CMD, якщо вам потрібно надати команду за замовчуванням та/або аргументи, які можна перезаписати з командного рядка під час запуску контейнера docker.
Docker-compose
Пакетний менеджер Docker Compose, що дає змогу описувати та запускати багатоконтейнерні додатки. Конфігураційні файли Compose описуються мовою YAML