Пошук уроків, статей та іншого контенту
Розберемо взаємодію Docker Client, Docker Host, Docker Daemon і Registry під час запуску контейнера.
Docker складається з кількох компонентів, які разом дають змогу створювати, зберігати та запускати контейнери.
Під час типового запуску контейнера взаємодіють:
Docker Client — клієнт, через який користувач надсилає команди;
Docker Host — середовище, де працює Docker;
Docker Daemon — фоновий процес, який виконує команди Docker;
Registry — сховище Docker-образів.
Спрощено процес виглядає так:
Користувач
|
v
Docker Client
|
v
Docker Daemon на Docker Host
|
+--> локальний Docker image
|
+--> Registry, якщо образу немає локально
|
v
Запущений Docker containerDocker Client — це інструмент командного рядка docker, за допомогою якого користувач взаємодіє з Docker.
Наприклад:
docker run nginxЦя команда не запускає контейнер безпосередньо в самому клієнті. Docker Client лише:
розбирає команду;
формує запит;
передає його Docker Daemon;
показує користувачеві результат.
Найчастіше Docker Client запускають у терміналі. Наприклад:
docker psКоманда запитує у Docker Daemon список запущених контейнерів.
Docker Client може працювати не лише на тому самому комп’ютері, що й Docker Daemon. Клієнт може надсилати команди віддаленому Docker Daemon через відповідне підключення.
Docker Host — це система, у якій працює Docker Daemon і запускаються контейнери.
На Linux Docker Host зазвичай є звичайним Linux-комп’ютером або сервером.
На Windows і macOS Docker часто працює через Docker Desktop. У такому випадку Docker використовує спеціальне Linux-середовище або віртуальну машину. Для користувача це зазвичай приховано: команди docker залишаються такими самими.
Docker Host містить:
Docker Daemon;
локальні образи;
контейнери;
мережі Docker;
томи для збереження даних.
Важливо розрізняти:
комп’ютер, на якому введено команду;
Docker Host, на якому фактично працює контейнер.
У простій локальній конфігурації це може бути один і той самий комп’ютер. У віддаленій конфігурації вони можуть бути різними.
Docker Daemon — це фоновий процес, який керує об’єктами Docker.
Його часто позначають як dockerd.
Docker Daemon відповідає за:
завантаження образів;
створення контейнерів;
запуск і зупинку контейнерів;
видалення контейнерів;
створення мереж;
роботу з томами;
взаємодію з Registry.
Коли користувач виконує:
docker run nginxDocker Daemon отримує запит і виконує необхідні дії. Саме daemon перевіряє, чи є образ nginx локально, завантажує його за потреби та створює контейнер.
Docker Client і Docker Daemon — це різні частини системи:
Client надсилає команди;
Daemon виконує команди.
Docker Registry — це сховище Docker-образів.
Registry може бути:
публічним;
приватним;
розташованим у внутрішній мережі організації.
Коли Docker Daemon потребує образу, якого немає локально, він звертається до Registry та завантажує його.
Поширений публічний Registry — Docker Hub. Якщо команда не містить назви іншого Registry, Docker зазвичай шукає образ у стандартному Registry.
Назва образу може мати такий вигляд:
nginxабо:
nginx:1.27або з явним Registry:
registry.example.com/team/web:1.0У назві:
nginx — назва образу;
1.27 — тег образу;
registry.example.com — адреса Registry;
team/web — шлях до образу в Registry.
Щоб зрозуміти взаємодію компонентів, потрібно розрізняти образ і контейнер.
Docker Image — це незмінний шаблон, з якого створюють контейнери.
Образ містить:
файлову систему застосунку;
програмне забезпечення;
залежності;
метадані;
стандартну команду запуску.
Образ можна завантажити з Registry або створити самостійно.
Docker Container — це запущений екземпляр образу.
Один образ можна використовувати для створення кількох контейнерів:
nginx image
|
+--> container-1
|
+--> container-2
|
+--> container-3Образ є шаблоном, а контейнер — конкретним процесом, який працює на Docker Host.
docker runРозглянемо команду:
docker run --name web -p 8080:80 nginx:1.27Вона запускає контейнер із образом nginx:1.27 і робить його доступним через порт 8080.
Користувач вводить команду в терміналі. Docker Client аналізує її параметри:
run — створити та запустити контейнер;
--name web — назвати контейнер web;
-p 8080:80 — зіставити порти;
nginx:1.27 — використати образ nginx з тегом 1.27.
Docker Client передає запит Docker Daemon.
Daemon може працювати локально або на іншому Docker Host. Для користувача команда при цьому залишається такою самою.
Docker Daemon перевіряє, чи є образ nginx:1.27 на Docker Host.
Якщо образ уже завантажений, Docker може використати його без звернення до Registry.
Якщо локального образу немає, Docker Daemon завантажує його з Registry.
Зазвичай у терміналі з’являється повідомлення про завантаження образу та його шарів.
Образ складається з шарів. Docker завантажує лише ті шари, яких ще немає локально. Завдяки цьому повторне завантаження образів може бути швидшим.
Після отримання образу Docker Daemon створює на його основі контейнер із назвою web.
Для контейнера також налаштовуються параметри:
ім’я;
мережа;
порти;
змінні середовища;
команда запуску.
Docker Daemon запускає процес, визначений образом nginx.
Порт контейнера 80 стає доступним через порт 8080 Docker Host:
Docker Host:8080 ---> Container:80Після цього вебсервер Nginx у контейнері приймає запити.
Для запуску Nginx виконайте:
docker run --name web -p 8080:80 nginx:1.27Поки команда працює у foreground, термінал може показувати журнали контейнера. Щоб запустити контейнер у фоновому режимі, додайте параметр -d:
docker run -d --name web -p 8080:80 nginx:1.27Перевірте список запущених контейнерів:
docker psОчікуваний результат міститиме контейнер із назвою web, образом nginx:1.27 і зіставленням портів 0.0.0.0:8080->80/tcp.
Перевірити образи, які зберігаються локально, можна командою:
docker image lsПереглянути журнали контейнера:
docker logs webЗупинити контейнер:
docker stop webВидалити зупинений контейнер:
docker rm webПовний приклад послідовності команд:
# Запустити контейнер у фоновому режимі
docker run -d --name web -p 8080:80 nginx:1.27
# Показати запущені контейнери
docker ps
# Показати журнали контейнера
docker logs web
# Зупинити контейнер
docker stop web
# Видалити контейнер
docker rm webПісля запуску контейнера сторінка Nginx буде доступна за адресою:
http://localhost:8080У цій послідовності:
Docker Client прийняв команди з термінала.
Docker Daemon створив і запустив контейнер на Docker Host.
Якщо образу nginx:1.27 не було локально, daemon завантажив його з Registry.
Контейнер почав працювати на основі цього образу.
docker pullКоманда docker pull завантажує образ, але не запускає контейнер:
docker pull nginx:1.27Послідовність дій:
Docker Client передає запит Docker Daemon.
Daemon перевіряє Registry.
Registry передає образ або відсутні шари.
Daemon зберігає образ на Docker Host.
Після цього запуск:
docker run --name web -p 8080:80 nginx:1.27може виконуватися без нового завантаження образу, оскільки він уже є локально.
docker pushКоманда docker push передає образ із локального Docker Host до Registry:
docker push registry.example.com/team/web:1.0У цьому випадку:
Docker Client надсилає команду Docker Daemon.
Daemon знаходить локальний образ.
Daemon підключається до Registry.
Образ і відсутні шари завантажуються до Registry.
Для приватного Registry зазвичай спочатку потрібно виконати автентифікацію:
docker login registry.example.comКонкретні вимоги до входу залежать від налаштувань Registry.
Ці компоненти виконують різні ролі:
| Компонент | Основна роль | |---|---| | Docker Client | Приймає команди та надсилає запити | | Docker Daemon | Виконує запити й керує Docker-об’єктами | | Docker Host | Середовище роботи daemon і контейнерів | | Registry | Зберігає та розповсюджує образи |
Наприклад, Registry не запускає контейнер замість Docker Host. Він лише зберігає образ. Контейнер створюється та запускається Docker Daemon на Docker Host.
Так само Docker Client не є контейнером і не є місцем, де обов’язково працює застосунок. Його завдання — керувати Docker через daemon.
Типовий сценарій можна подати так:
1. Користувач вводить команду
|
v
2. Docker Client надсилає запит
|
v
3. Docker Daemon перевіряє образ
|
+--> Образ є локально: використати його
|
+--> Образу немає: завантажити з Registry
|
v
4. Docker Daemon створює контейнер
|
v
5. Docker Daemon запускає контейнер на Docker Host
|
v
6. Docker Client показує результатДля команди docker run важливо пам’ятати: якщо образу немає локально, завантаження з Registry відбувається автоматично.
Щоб перевірити, чи доступний Docker Daemon, виконайте:
docker versionКоманда намагається показати інформацію про:
Docker Client;
Docker Server, тобто daemon.
Також можна використати:
docker infoЯкщо Docker Daemon не запущений або клієнт не може до нього підключитися, Docker покаже повідомлення про помилку з’єднання.
На Docker Desktop потрібно переконатися, що сам Docker Desktop запущений. На Linux стан daemon залежить від конфігурації системи та способу встановлення Docker.
docker run завжди використовує локальний образЯкщо потрібного образу немає локально, daemon спробує завантажити його з Registry.
Для попереднього завантаження можна виконати:
docker pull nginx:1.27Образ — це шаблон, а контейнер — його запущений екземпляр.
Команда:
docker image lsпоказує локальні образи, а:
docker psпоказує запущені контейнери.
Registry лише зберігає образи. Контейнер запускає Docker Daemon на Docker Host.
Якщо тег не вказано:
docker run nginxDocker використовує тег latest за стандартною поведінкою.
Для передбачуваності краще явно вказувати потрібну версію:
docker run nginx:1.27У команді:
docker run -p 8080:80 nginx:1.278080 — порт Docker Host;
80 — порт усередині контейнера.
Якщо відкрити http://localhost:8080, запит буде передано до порту 80 контейнера.
Команда:
docker stop webлише зупиняє контейнер.
Щоб видалити його, потрібно виконати:
docker rm webDocker Client приймає команди користувача та надсилає їх Docker Daemon.
Docker Daemon виконує команди, працює з образами та керує контейнерами.
Docker Host — це середовище, у якому працює daemon і запускаються контейнери.
Registry зберігає Docker-образи та передає їх daemon.
Під час docker run daemon спочатку перевіряє локальні образи.
Якщо образу немає, daemon завантажує його з Registry.
Після цього daemon створює та запускає контейнер на Docker Host.
Образ є шаблоном, а контейнер — запущеним екземпляром образу.