Пошук уроків, статей та іншого контенту
Навчитеся запускати, зупиняти, перебудовувати й переглядати логи сервісів за допомогою команд Docker Compose.
Docker Compose керує кількома контейнерами як одним застосунком. За допомогою команд Compose можна:
створити й запустити контейнери;
переглянути їхній стан;
зупинити контейнери;
знову запустити зупинені контейнери;
перебудувати образи після змін;
переглянути логи;
видалити контейнери та мережі застосунку.
Основний файл Compose зазвичай називається compose.yaml або docker-compose.yml. У сучасних версіях Docker використовується команда:
docker composeПробіл між docker і compose є важливим. Старий варіант docker-compose також може зустрічатися, але в цьому уроці використовуватимемо сучасний синтаксис.
Створімо папку проєкту:
mkdir compose-lifecycle
cd compose-lifecycleУ цій папці створімо файл index.html:
<!doctype html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<title>Compose demo</title>
</head>
<body>
<h1>Привіт із Docker Compose!</h1>
</body>
</html>Створімо Dockerfile:
FROM python:3.12-alpine
WORKDIR /app
COPY index.html .
CMD ["python", "-m", "http.server", "8000", "--bind", "0.0.0.0"]Цей образ:
використовує Python;
копіює index.html у контейнер;
запускає простий HTTP-сервер на порту 8000.
Тепер створімо compose.yaml:
services:
web:
build: .
ports:
- "8080:8000"У цьому файлі описано один сервіс із назвою web.
build: . означає, що образ потрібно побудувати з Dockerfile у поточній папці;
8080:8000 перенаправляє порт 8080 комп’ютера на порт 8000 контейнера.
Перевірити застосунок можна у браузері за адресою:
http://localhost:8080Виконайте:
docker compose upCompose:
прочитає файл compose.yaml;
побудує потрібний образ;
створить контейнер;
запустить сервіс;
покаже логи в терміналі.
Термінал залишатиметься зайнятим виведенням логів. Щоб зупинити такий запуск, натисніть Ctrl+C.
Для запуску у фоні використовуйте прапорець -d:
docker compose up -dПісля цього командний рядок одразу стане доступним для наступних команд.
Прапорець -d означає detached mode — фоновий режим.
Якщо образів ще немає, Compose автоматично побудує їх перед запуском. Якщо конфігурація або образ змінилися, Compose може створити контейнери повторно.
Щоб перед запуском обов’язково перебудувати образи, використовуйте:
docker compose up --build -dЦе корисно після змін у Dockerfile або файлах, які копіюються в образ під час його побудови.
Щоб переглянути контейнери поточного Compose-проєкту, виконайте:
docker compose psПриклад результату:
NAME IMAGE SERVICE STATUS PORTS
compose-lifecycle-web-1 compose-lifecycle-web web Up 0.0.0.0:8080->8000/tcpУ результаті можна побачити:
назву контейнера;
образ;
назву сервісу;
стан контейнера;
опубліковані порти.
Для перегляду також зупинених контейнерів використовуйте:
docker compose ps -aКоманда без -a зазвичай показує лише активні контейнери.
Щоб переглянути логи сервісів:
docker compose logsЯкщо застосунок працює у фоновому режимі, ця команда виведе накопичені логи та завершиться.
Для постійного перегляду нових повідомлень використовуйте:
docker compose logs -fПрапорець -f означає follow — стежити за новими рядками логів.
Щоб припинити перегляд логів, натисніть Ctrl+C. Це зупинить лише перегляд логів, а не самі контейнери.
Якщо в Compose-файлі кілька сервісів, можна переглядати логи лише одного з них:
docker compose logs webАбо стежити за логами сервісу в реальному часі:
docker compose logs -f webЩоб вивести лише останні 50 рядків:
docker compose logs --tail=50Прапорець можна поєднувати з -f:
docker compose logs --tail=20 -f webЦе покаже останні 20 рядків і продовжить стежити за новими повідомленнями.
Команда stop зупиняє контейнери, але не видаляє їх:
docker compose stopПісля цього контейнери залишаються створеними, але не працюють.
Перевірити їхній стан можна так:
docker compose ps -aЗупинити лише один сервіс:
docker compose stop webЦе корисно, коли потрібно тимчасово призупинити застосунок, але зберегти його контейнери для подальшого запуску.
stopЩоб запустити раніше зупинені контейнери:
docker compose startАбо лише один сервіс:
docker compose start webКоманда start не створює нові контейнери й не перебудовує образи. Вона запускає вже створені, але зупинені контейнери.
Для перезапуску контейнерів використовуйте:
docker compose restartПерезапустити лише сервіс web:
docker compose restart webПерезапуск не перебудовує образ і не змінює конфігурацію контейнера. Він просто зупиняє та знову запускає наявні контейнери.
Якщо ви змінили Dockerfile, потрібно перебудувати образ:
docker compose buildЦя команда лише будує образи. Вона не запускає контейнери.
Після перебудови запустіть застосунок:
docker compose up -dНа практиці ці дві дії часто об’єднують:
docker compose up --build -dЗмініть заголовок у index.html:
<h1>Оновлений застосунок Compose</h1>Оскільки файл копіюється в образ під час виконання docker build, контейнер не отримає цю зміну автоматично.
Перебудуйте та перезапустіть застосунок:
docker compose up --build -dПісля цього оновіть сторінку за адресою http://localhost:8080.
Docker повторно використовує незмінені шари образу. Зазвичай це пришвидшує збірку.
Якщо потрібно повністю проігнорувати кеш:
docker compose build --no-cacheПісля цього запустіть контейнери:
docker compose up -dПрапорець --no-cache варто використовувати, коли кеш заважає перевірити зміни або потрібно гарантовано виконати всі інструкції Dockerfile заново.
Команда down зупиняє та видаляє контейнери й мережі, створені для Compose-проєкту:
docker compose downПісля цього для нового запуску потрібно знову виконати:
docker compose up -dЗазвичай down не видаляє образи. Тому наступний запуск може використати вже побудований образ.
stop і downstop:
зупиняє контейнери;
залишає контейнери створеними;
дає змогу використати docker compose start.
down:
зупиняє контейнери;
видаляє контейнери;
видаляє мережі Compose-проєкту;
не залишає контейнери для команди start.
Після down команда docker compose start не запустить застосунок, оскільки запускати вже нічого. Потрібно використати docker compose up.
Під час розробки часто використовують такий порядок команд:
docker compose up --build -d
docker compose ps
docker compose logs -f webПісля зміни Dockerfile або файлів, що копіюються в образ:
docker compose up --build -dДля тимчасової зупинки:
docker compose stopДля продовження роботи:
docker compose startДля повного завершення й очищення контейнерів:
docker compose downDocker Compose шукає compose.yaml або docker-compose.yml у поточній папці.
Якщо файл має іншу назву або розташований в іншій папці, вкажіть його явно:
docker compose -f path/to/compose.yaml up -dПереконайтеся, що шлях до файлу правильний.
stop видалить контейнериКоманда:
docker compose stopлише зупиняє контейнери. Для їхнього видалення використовуйте:
docker compose downstart після downПісля виконання docker compose down контейнери видалені. Тому команда:
docker compose startне допоможе.
У такій ситуації використовуйте:
docker compose up -dЯкщо файл копіюється в образ через COPY, після його зміни потрібно перебудувати образ:
docker compose up --build -dБез --build контейнер може продовжувати використовувати стару версію файлу.
Команда:
docker compose logs -fлише показує логи. Натискання Ctrl+C припиняє стеження за логами, але зазвичай не зупиняє фонові контейнери, запущені через docker compose up -d.
Якщо порт 8080 уже використовується іншою програмою, Compose не зможе запустити сервіс.
У такому разі змініть зовнішній порт у compose.yaml, наприклад:
services:
web:
build: .
ports:
- "8081:8000"Контейнер і далі слухатиме порт 8000, але застосунок буде доступний на комп’ютері за адресою http://localhost:8081.
docker compose up створює та запускає сервіси.
docker compose up -d запускає їх у фоновому режимі.
docker compose up --build -d перебудовує образи та запускає сервіси.
docker compose ps показує стан контейнерів.
docker compose logs показує логи.
docker compose logs -f стежить за логами в реальному часі.
docker compose stop тимчасово зупиняє контейнери.
docker compose start запускає зупинені контейнери.
docker compose restart перезапускає контейнери.
docker compose build перебудовує образи без запуску.
docker compose down зупиняє та видаляє контейнери й мережі Compose-проєкту.