Использование Docker Compose: простой способ управлять несколькими контейнерами.

В современном мире разработки программ зачастую нужно запускать одновременно несколько приложений или сервисов — например, веб-сайт, базу данных и дополнительные инструменты.

Все эти компоненты используют контейнеры 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 поможет быстро управлять всеми компонентами.