В современном мире разработки программ зачастую нужно запускать одновременно несколько приложений или сервисов — например, веб-сайт, базу данных и дополнительные инструменты.
Все эти компоненты используют контейнеры Docker, но управлять ими по отдельности сложно и долго. Для этого существует удобный инструмент — Docker Compose.
Что такое Docker Compose?
Docker Compose — это инструмент, который помогает описать и запускать сразу несколько контейнеров одновременно.
Вместо того чтобы вводить длинные команды для каждого контейнера, вы записываете всё в один файл (docker-compose.yml), а потом запускаете всё одним командным простым способом.
Коротко о новой версии
Раньше существовал отдельный инструмент под названием docker-compose (с дефисом), но сейчас в новых версиях Docker встроена его обновленная версия — docker compose (без дефиса). Он интегрирован и работает быстрее и удобнее.
Почему это важно?
- Просто и быстро: один файл конфигурации — и все контейнеры запущены.
- Легко менять: добавляйте, удаляйте или настраивайте сервисы всего одним файлом.
- Масштабируемость: легко расширить проект новыми компонентами.
Как начать использовать Docker Compose
Создайте файл docker-compose.yml в папке с вашим проектом. В нем опишите сервисы — например, веб-сервер и вспомогательный контейнер.
Мы уже использовали подобную связку ранее, поэтому основные моменты должны быть понятны.
Контейнер web — nginx, с примонтированным volume для веб рута и форвардингом портов.
Контейнер alpine — на базе Alpine Linux, с установленными curl и wget.
Поскольку команда установки пакетов в Alpine — apk add, в файле docker-compose.yml лучше использовать command или entrypoint, чтобы выполнить установку при запуске, или сделать это через Dockerfile, но для простоты сделаю через команду запуска (command).
Заполняя файл текстовом редакторе, будьте внимательны с отступами, yml формат чувствителен к отступам и их нарушение, может сломать всю логику файла:
services:
alpine:
image: alpine:latest
command: sh -c "apk add --no-cache curl wget && sleep infinity"
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./site:/usr/share/nginx/html
Объяснение:
alpine: использует образ alpine:latest, при запуске сразу устанавливает curl и wget, а потом остается в режиме ожидания (sleep infinity), чтобы контейнер не завершился.
web: nginx с портом 8080, и монтированием директории ./site находящейся на сервере рядом с файлом docker-compose.yml, в директорию /usr/share/nginx/html контейнера.
Если хотите, чтобы установка пакетов происходила при сборке образа, лучше создать Dockerfile, но для простого примера этого достаточно.
Запустите все сервисы командой:docker compose up -d
[root@waky my-app]# docker compose up -d
[+] Running 3/3
✔ Network my-app_default Created
0.5s
✔ Container my-app-alpine-1 Started
1.3s
✔ Container my-app-web-1 Started
1.6s
[root@waky my-app]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d525da483ccb nginx:latest "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp my-app-web-1
37ab1d46c431 alpine:latest "sh -c 'apk add --no…" 8 seconds ago Up 7 seconds my-app-alpine-1
[root@waky my-app]#
Теперь наши контейнеры запущены и работают. Чтобы остановить — выполните:docker compose down
[root@waky my-app]# docker compose down
[+] Running 3/3
✔ Container my-app-alpine-1 Removed
10.5s
✔ Container my-app-web-1 Removed
0.5s
✔ Network my-app_default Removed
0.4s
[root@waky my-app]#
Заключение
Раньше для этого использовали отдельный инструмент docker-compose, который встречается только в очень старых системах.
В новых версиях Docker встроен современный и более удобный docker compose, который значительно упрощает работу с многоконтейнерными проектами.
Если вы только начинаете работать с Docker и хотите запускать сразу несколько сервисов — это очень просто и удобно.
А для более сложных проектов — Docker Compose поможет быстро управлять всеми компонентами.