Docker Compose запускает несколько контейнеров одной командой по описанию из файла docker-compose.yml. Вместо длинных docker run с десятком параметров вы один раз пишете, какие сервисы нужны, какие у них порты, папки и пароли, и дальше управляете всем через docker compose up -d. У нас на одном домашнем сервере так работают шесть проектов, от фотоархива до мониторинга сайтов. Разберём установку Docker Compose, устройство файла docker-compose.yml, основные команды и два рабочих примера.

Установка Docker Compose
Отдельно ставить Compose не нужно: сейчас это плагин Docker, и он устанавливается вместе с ним. Официальный способ для Ubuntu 22.04, 24.04 и 26.04 — через репозиторий Docker:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginДля Debian команды те же, только в адресах ubuntu меняется на debian — смотрите инструкцию Docker для своей системы. Проверка:
docker compose version Docker Compose version v5.5.1
docker compose или docker-compose? Команда через дефис — старая версия Compose, отдельная программа на Python. Её давно не развивают. Если в инструкции написано docker-compose up, просто пишите docker compose up — через пробел.
Скрипт get.docker.com тоже работает, но сами разработчики Docker советуют его только для тестовых машин: он не даёт выбрать параметры и может неожиданно обновить Docker до новой основной версии.
Файл docker-compose.yml: простой пример
Вот файл, по которому у нас работает Uptime Kuma — сервис, который проверяет доступность сайтов и присылает уведомления, если сайт упал. Отличие от нашего одно: у нас сервер домашний и порт открыт в локальную сеть, а для VPS мы добавили 127.0.0.1, об этом ниже.
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
volumes:
- /home/kuma/data:/app/data
ports:
- 127.0.0.1:3001:3001
restart: unless-stopped
security_opt:
- no-new-privileges:trueЧто здесь написано:
services— список контейнеров. Здесь один, с именемuptime-kuma.image— образ и версия.:1— все обновления первой версии, без неожиданного перехода на вторую.volumes— какая папка сервера подключается внутрь контейнера. Данные живут в/home/kuma/dataи не пропадут, если контейнер удалить.ports— порт сервера и порт контейнера.127.0.0.1впереди значит, что сервис доступен только с самого сервера, например через Nginx.restart: unless-stopped— перезапускать после сбоя и перезагрузки сервера, если вы сами не остановили контейнер.
Файл кладут в отдельную папку проекта, например /opt/kuma/docker-compose.yml, и все команды выполняют из неё.
Предупреждение «the attribute version is obsolete»
В старых файлах первой строкой стоит version: "3.8" или подобное. В нашем файле Uptime Kuma до сих пор написано version: "3.1", и Compose при каждой команде отвечает так:
level=warning msg="/root/kuma/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"
Это не ошибка: по документации поле только информационное и игнорируется. Удалите строку version — предупреждение пропадёт, ничего больше не изменится.
Основные команды Docker Compose
| Команда | Что делает |
|---|---|
docker compose up -d | создать и запустить все контейнеры в фоне; после правки файла — пересоздать изменённые |
docker compose ps | список контейнеров проекта и их состояние |
docker compose logs -f имя | журнал сервиса в реальном времени |
docker compose restart имя | перезапустить сервис без пересоздания |
docker compose stop | остановить, не удаляя |
docker compose down | остановить и удалить контейнеры и сеть; данные в volumes остаются |
docker compose pull | скачать новые версии образов |
docker compose exec имя sh | открыть консоль внутри контейнера |
docker compose ls | все Compose-проекты на сервере |
Что делает docker compose up -d: ключ -d означает «в фоне». Без него контейнеры будут запущены в текущем окне, и при его закрытии остановятся. up --build нужен, только если образ собирается из вашего Dockerfile, а не скачивается готовым.
Обновление сервиса — две команды:
docker compose pull docker compose up -d
Compose пересоздаст только те контейнеры, у которых появился новый образ.
Пример посложнее: WordPress и база данных
Настоящая сила Compose — несколько связанных сервисов. WordPress и MariaDB в одном файле:
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_DATABASE: wp
MARIADB_USER: wp
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_RANDOM_ROOT_PASSWORD: "1"
volumes:
- db:/var/lib/mysql
wordpress:
image: wordpress:php8.3-apache
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wp
volumes:
- wp:/var/www/html
ports:
- 127.0.0.1:8080:80
volumes:
db:
wp:Рядом с ним — файл .env с паролем, чтобы не держать его в самом docker-compose.yml:
DB_PASSWORD=длинный-случайный-пароль
Что здесь нового:
- Сервисы видят друг друга по имени: WordPress подключается к базе по адресу
db. Compose сам создаёт для проекта общую сеть. - У базы нет раздела
ports— снаружи она недоступна вообще, только для WordPress. depends_onзапускает базу раньше WordPress.${DB_PASSWORD}подставляется из файла.env.
Docker Compose volumes: где хранятся данные
Есть два способа, и оба встречаются в примерах выше:
- Папка сервера (bind mount):
/home/kuma/data:/app/data. Данные лежат там, где вы указали, их легко найти, скопировать и забэкапить. - Именованный том:
db:/var/lib/mysqlи разделvolumes:внизу файла. Docker хранит его сам, обычно в/var/lib/docker/volumes/. Удобно, когда не хочется думать о путях.
Команда docker compose down тома не трогает, а docker compose down -v удаляет их вместе с данными — с ключом -v будьте осторожны. Базы данных бэкапьте не копированием папки на ходу, а дампом: docker compose exec db mariadb-dump .... Запускать такой дамп каждую ночь удобно через cron, а готовый скрипт с восстановлением — в статье резервная копия сайта.
Когда сервисов в Compose становится несколько, их удобно выставить наружу через один обратный прокси с доменами и HTTPS — как это сделать, в статье Nginx Proxy Manager: несколько сервисов на одном сервере.
Частые ошибки
- Порт открыт всему интернету.
ports: - 8080:80без127.0.0.1публикует сервис наружу, и файрвол ufw этого не остановит — Docker обходит его правила. Подробнее — в статье настройка VPS: SSH-ключ, ufw и fail2ban. - Отступы в YAML. Только пробелы, никаких табуляций, и одинаковая вложенность. Проверить файл перед запуском:
docker compose config. - Тег latest.
image: что-то:latestоднажды скачает новую основную версию, несовместимую с вашими данными. Указывайте версию явно. - Нехватка памяти. Каждый контейнер ест память, и на сервере с 1–2 ГБ несколько сервисов быстро упрутся в предел — поможет swap и чистка диска. Сколько ресурсов брать под Docker, — в статье как выбрать VPS.
В контейнере можно запустить и локальную нейросеть — пример с Ollama в статье Ollama: локальная нейросеть на ПК.
Docker пригодится и для умного дома: например, Home Assistant и Zigbee2MQTT можно запустить в контейнерах (как поставить Home Assistant в Docker — в статье установка Home Assistant) — подробности в статье Zigbee2MQTT или ZHA.
Пример, как десяток контейнеров уживается на одном домашнем ПК, — в статье «Домашний сервер».
Документация: установка Docker Engine на Ubuntu, спецификация compose-файла, команды docker compose. Проверено 26 сентября 2026 года.








