Пошук уроків, статей та іншого контенту
Познайомитеся з форматом compose.yaml, версією специфікації та базовими секціями конфігурації.
compose.yamlcompose.yaml — це YAML-файл, у якому описано багатоконтейнерний застосунок: які контейнери потрібно запустити, з яких образів їх створити, які порти відкрити та які дані зберігати.
Docker Compose читає цей файл і виконує описану конфігурацію за допомогою команд:
docker compose upЗа замовчуванням Docker Compose шукає у поточній директорії файл із назвою:
compose.yaml;
compose.yml.
Також підтримуються старі назви docker-compose.yaml і docker-compose.yml
YAML використовує відступи для позначення вкладеності. Зазвичай застосовують два пробіли.
services:
web:
image: nginx:alpineУ цьому прикладі:
services — секція верхнього рівня;
web — назва сервісу;
image — властивість сервісу;
nginx:alpine — значення властивості.
Відступи мають значення. Такий запис неправильний:
services:
web:
image: nginx:alpineСервіс web повинен мати більший відступ, оскільки він належить до секції services.
Типовий compose.yaml може мати таку структуру:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
cache:
image: redis:7-alpine
volumes:
cache_data:
networks:
app_network:Основні секції:
services — контейнери застосунку;
volumes — іменовані томи для постійного зберігання даних;
networks — мережі, у яких працюють контейнери.
Секція services є центральною. Інші секції додаються лише за потреби.
У старих файлах Docker Compose часто можна побачити поле version:
version: "3.8"
services:
web:
image: nginx:alpineСучасний Docker Compose використовує єдину Compose Specification. Поле version більше не визначає поведінку конфігурації та вважається застарілим. Docker Compose може показати попередження про його використання.
У нових файлах поле version зазвичай не додають:
services:
web:
image: nginx:alpineТому для сучасних проєктів рекомендується починати файл одразу із секції services.
servicesСекція services містить опис усіх контейнерів, які належать до застосунку.
Кожен сервіс має власну назву:
services:
web:
image: nginx:alpine
cache:
image: redis:7-alpineУ цьому прикладі описано два сервіси:
web — контейнер із вебсервером Nginx;
cache — контейнер із Redis.
Назви сервісів використовуються всередині Compose-мережі. Наприклад, один контейнер може звернутися до Redis за адресою cache, а не за адресою localhost.
Назва сервісу не обов’язково збігається з назвою образу.
imageimage визначає Docker-образ, з якого буде створено контейнер:
services:
web:
image: nginx:alpineЗапис nginx:alpine складається з:
nginx — назва образу;
alpine — тег образу.
Якщо тег не вказати, Docker зазвичай використовує тег latest:
services:
web:
image: nginxДля передбачуваної роботи краще вказувати конкретний тег:
services:
web:
image: nginx:1.27-alpinebuildЗамість готового образу можна вказати, що образ потрібно побудувати з Dockerfile:
services:
app:
build: .Крапка означає поточну директорію. Docker шукатиме в ній Dockerfile.
Також можна вказати окремий контекст і назву Dockerfile:
services:
app:
build:
context: ./app
dockerfile: DockerfileТут:
context: ./app — директорія, доступна під час побудови образу;
dockerfile: Dockerfile — файл інструкцій для побудови.
Для сервісу зазвичай використовують або image, або build. У деяких випадках можна вказати обидві властивості, щоб побудувати образ і надати йому назву.
portsКонтейнер має власну мережу. Щоб звертатися до його порту з комп’ютера, порт потрібно опублікувати:
services:
web:
image: nginx:alpine
ports:
- "8080:80"Формат запису:
порт_комп’ютера:порт_контейнераУ прикладі:
8080 — порт на комп’ютері;
80 — порт усередині контейнера.
Після запуску сервісу вебсервер буде доступний через порт 8080 комп’ютера.
Порти краще записувати як рядки в лапках:
ports:
- "8080:80"Це допомагає уникнути неоднозначного трактування значення YAML.
environmentЗмінні середовища можна передати контейнеру за допомогою environment.
Формат у вигляді об’єкта:
services:
app:
image: my-app:1.0
environment:
NODE_ENV: production
PORT: "3000"Також використовується формат списку:
services:
app:
image: my-app:1.0
environment:
- NODE_ENV=production
- PORT=3000Формат об’єкта зазвичай легше читати, особливо коли змінних багато.
Значення, які можуть бути сприйняті як числа або логічні значення, краще брати в лапки:
environment:
PORT: "3000"
DEBUG: "false"depends_onВластивість depends_on задає порядок запуску сервісів:
services:
app:
image: my-app:1.0
depends_on:
- database
database:
image: postgres:16-alpineУ цьому випадку Compose запустить database перед app.
Важливо: depends_on визначає порядок запуску контейнерів, але не гарантує, що база даних уже готова приймати підключення. Застосунок має вміти повторювати підключення, якщо база ще запускається.
volumesДані всередині контейнера можуть зникнути після його видалення. Для постійного зберігання використовують томи.
Том оголошують у верхній секції volumes:
services:
database:
image: postgres:16-alpine
volumes:
- database_data:/var/lib/postgresql/data
volumes:
database_data:Рядок:
- database_data:/var/lib/postgresql/dataозначає:
database_data — ім’я тому Docker;
/var/lib/postgresql/data — директорія всередині контейнера.
Верхня секція volumes повідомляє Compose, що такий іменований том потрібно створити та використовувати.
networksCompose автоматично створює спільну мережу для сервісів одного проєкту. Тому сервіси можуть звертатися один до одного за назвами сервісів.
За потреби мережу можна оголосити явно:
services:
web:
image: nginx:alpine
networks:
- app_network
cache:
image: redis:7-alpine
networks:
- app_network
networks:
app_network:Обидва сервіси підключені до мережі app_network. Усередині цієї мережі Redis доступний за іменем cache.
Явне оголошення мережі корисне, коли потрібно чітко визначити, які сервіси можуть взаємодіяти між собою.
Створіть файл compose.yaml:
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
networks:
- app_network
cache:
image: redis:7-alpine
volumes:
- cache_data:/data
networks:
- app_network
volumes:
cache_data:
networks:
app_network:Запустіть сервіси:
docker compose up -dЩо відбудеться:
Docker завантажить образи Nginx і Redis, якщо їх ще немає локально.
Створить мережу app_network.
Створить іменований том cache_data.
Запустить два контейнери.
Опублікує Nginx на порту 8080.
Відкрийте у браузері адресу:
http://localhost:8080Щоб переглянути стан сервісів:
docker compose psЩоб переглянути журнали:
docker compose logsЩоб зупинити контейнери:
docker compose downКоманда down видаляє контейнери та мережі проєкту, але іменований том зазвичай залишається. Це дає змогу зберегти дані Redis між запусками.
Перед запуском конфігурацію можна перевірити та побачити її нормалізований вигляд:
docker compose configЦя команда допомагає знайти:
неправильні відступи;
помилки в назвах властивостей;
некоректну структуру YAML;
проблеми з об’єднанням параметрів Compose.
Для проєкту з compose.yaml часто використовують такий порядок:
# Перевірити конфігурацію
docker compose config
# Запустити сервіси у фоновому режимі
docker compose up -d
# Переглянути запущені контейнери
docker compose ps
# Переглянути журнали
docker compose logs
# Зупинити та видалити контейнери
docker compose downКоманди потрібно виконувати в директорії, де розташований compose.yaml, або явно передати шлях до файлу через параметр -f.
YAML не використовує фігурні дужки для вкладеності. Вона визначається відступами:
services:
web:
image: nginx:alpineНе змішуйте табуляції та пробіли. Для відступів використовуйте пробіли.
У записі:
ports:
- "8080:80"порт 8080 належить комп’ютеру, а порт 80 — контейнеру.
Запис "80:8080" має інше значення: порт 8080 контейнера буде доступний через порт 80 комп’ютера.
localhost для зв’язку між контейнерамиЯкщо один сервіс підключається до іншого, не використовуйте localhost.
Неправильно:
localhost:6379Усередині контейнера localhost означає цей самий контейнер. Для підключення до сервісу Redis потрібно використовувати його назву:
cache:6379versionУ сучасному Compose не потрібно додавати:
version: "3.8"Починайте файл із services, якщо немає особливої причини зберігати старий формат.
Команда:
docker compose down -vдодатково видаляє іменовані томи. Не використовуйте параметр -v, якщо потрібно зберегти дані бази або іншого сервісу.
compose.yaml описує багатоконтейнерний застосунок у форматі YAML.
Основна секція файлу — services.
Для сервісу можна вказати готовий образ через image або побудову через build.
ports публікує порт контейнера на комп’ютері.
environment передає змінні середовища.
depends_on задає порядок запуску сервісів.
volumes використовуються для постійного зберігання даних.
networks визначає мережі для взаємодії контейнерів.
Поле version у сучасній Compose Specification зазвичай не потрібне.
Конфігурацію зручно перевіряти командою docker compose config.