Docker Compose для начинающих: установка, docker-compose.yml и команды

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

Команды docker compose ls и docker compose ps на сервере с тремя проектами
Три проекта на одном сервере: каждый описан своим 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 года.

4 / 1
Оцените статью
Да будет Интернет!