Глава 1 — Основы работы с Docker


Compose — Управление сервисами

Эта страница объясняет базовые команды docker compose, которые используются для запуска, остановки, пересборки и перезапуска сервисов в проекте. Материал рассчитан на начинающих: здесь разобрано, что делает каждая команда, в каких случаях её использовать и на что обратить внимание, чтобы случайно не сломать рабочее окружение.


Что такое Docker Compose

Docker Compose — это инструмент для управления несколькими контейнерами как единым приложением. Обычно в проекте есть файл docker-compose.yml, где описано:

Например, один проект может состоять из:

Вместо того чтобы запускать каждый контейнер отдельно длинными командами docker run, Compose позволяет поднять всё одной командой.


Перед началом работы

Обычно работа с Compose ведётся из директории проекта, где лежит docker-compose.yml.

Пример:

cd /opt/flamy_projects/project_name

Проверить, что файл действительно есть в текущей папке:

ls -la

Если нужно найти compose-файлы во всей папке проектов:

find /opt/flamy_projects -type f -name "docker-compose*.yml"

Примечание: Большинство команд docker compose нужно выполнять именно в той директории, где находится docker-compose.yml. Иначе Docker не поймёт, с каким проектом работать.


Базовый принцип работы

Чаще всего цикл работы выглядит так:

  1. перейти в папку проекта
  2. запустить сервисы
  3. проверить, что контейнеры работают
  4. посмотреть логи при ошибках
  5. при необходимости пересобрать или перезапустить сервисы

Запуск сервисов

Запуск всех сервисов в фоне

docker compose up -d

Эта команда:

Флаг -d означает detached mode, то есть запуск в фоне.

Когда использовать

Подходит почти для любого обычного старта проекта:

Пример

cd /opt/flamy_projects/site1
docker compose up -d

Что важно помнить

Если образа ещё нет локально, Docker попытается:

Для новичков: up не всегда означает просто «включить». Эта команда может не только запускать, но и создавать контейнеры заново, если это требуется по конфигурации.


Остановка и удаление контейнеров проекта

Остановка проекта

docker compose down

Команда останавливает и удаляет:

Когда использовать

Подходит, если нужно:

Что команда не удаляет

По умолчанию docker compose down не удаляет volumes. Это важно, потому что именно в volumes часто лежат данные:

Важно: Для новичков это одна из самых полезных вещей: обычный down не стирает данные сам по себе. Но всё равно всегда нужно понимать, где именно проект хранит данные — в volumes, bind mounts или внутри контейнера.

Пример

docker compose down

После этого проект можно снова поднять:

docker compose up -d

Принудительное пересоздание контейнеров

Пересоздать контейнеры даже без изменений

docker compose up -d --force-recreate

Эта команда заставляет Docker пересоздать контейнеры, даже если он считает, что ничего не поменялось.

Когда использовать

Полезно, если:

Что важно помнить

Пояснение: Контейнер и volume — это не одно и то же. Контейнер — это «запущенная оболочка приложения». Volume — это место, где могут лежать постоянные данные. Поэтому пересоздание контейнера не обязательно означает потерю данных.


Пересборка образов

Пересборка нужна тогда, когда меняется не только запуск контейнера, а именно его образ. Обычно это происходит, если вы изменили:


Пересборка без использования кэша

docker compose build --no-cache

Docker при сборке старается использовать кэш, чтобы не выполнять одинаковые шаги повторно. Это ускоряет работу, но иногда мешает, если нужен действительно «чистый» rebuild.

Флаг --no-cache говорит: не использовать ранее сохранённые слои, а собрать всё заново.

Когда использовать

Подходит, если:

Пример

docker compose build --no-cache
docker compose up -d

Примечание: Эта операция может занять заметно больше времени, чем обычная сборка.


Пересобрать и сразу запустить

docker compose up -d --build

Команда делает два действия сразу:

  1. при необходимости пересобирает образ
  2. запускает контейнеры

Когда использовать

Это один из самых частых сценариев после изменения:

Пример

docker compose up -d --build

Чем отличается от build --no-cache

Если нужно просто обновить контейнер после обычных изменений — чаще хватает:

docker compose up -d --build

Если есть сомнения в корректности кэша — используйте:

docker compose build --no-cache
docker compose up -d

Обновление образов из реестра

Скачать свежие версии образов

docker compose pull

Команда скачивает новые версии образов, которые указаны в docker-compose.yml.

Когда использовать

Подходит, если проект использует готовые образы из registry, например:

Важный момент

docker compose pull только скачивает образы, но не перезапускает контейнеры автоматически.

Чтобы применить обновление, обычно выполняют:

docker compose pull && docker compose up -d

Пример

cd /opt/flamy_projects/site1
docker compose pull
docker compose up -d

Важно: На production-серверах обновление образов нужно делать осторожно. Новая версия образа может изменить поведение приложения или сломать совместимость.


Перезапуск сервисов

Иногда контейнер не нужно пересобирать или пересоздавать — достаточно просто перезапустить процесс.


Перезапуск одного сервиса

docker compose restart <service>

Пример:

docker compose restart nginx

Когда использовать

Подходит, если:


Перезапуск всех сервисов

docker compose restart

Перезапускает все сервисы, описанные в compose-файле.

Когда использовать

Подходит, если:


Остановка и запуск отдельного сервиса вручную

docker compose stop <service> && docker compose start <service>

Пример:

docker compose stop php && docker compose start php

Зачем это нужно, если есть restart

Иногда удобнее разделить действия на две части:

Это бывает полезно при диагностике или когда нужно убедиться, что сервис полностью остановился.


Запуск только одного сервиса

docker compose up -d <service>

Пример:

docker compose up -d nginx

Когда использовать

Полезно, если:

Примечание: Если сервис зависит от других, Compose может поднять и их тоже.


Проверка итоговой конфигурации

Посмотреть итоговый compose-конфиг

docker compose config

Эта команда показывает итоговую конфигурацию после обработки:

Когда использовать

Очень полезно перед запуском, если:

Почему это важно для новичков

Иногда в YAML всё выглядит правильно, но итоговая конфигурация получается другой. docker compose config помогает увидеть конечный результат до запуска.


Наиболее частые сценарии в работе

Обычный запуск проекта

docker compose up -d

Обновить образы и применить изменения

docker compose pull && docker compose up -d

После изменения Dockerfile или зависимостей

docker compose up -d --build

Полная пересборка без кэша

docker compose build --no-cache
docker compose up -d

Быстро перезапустить один сервис

docker compose restart nginx

Полностью выключить проект

docker compose down

Что выбрать в типовых ситуациях

Ситуация: нужно просто запустить проект

Используйте:

docker compose up -d

Ситуация: поменялся Dockerfile

Используйте:

docker compose up -d --build

Ситуация: образ ведёт себя странно, нужен чистый rebuild

Используйте:

docker compose build --no-cache
docker compose up -d

Ситуация: нужно скачать свежие образы из registry

Используйте:

docker compose pull && docker compose up -d

Ситуация: сервис просто нужно перезапустить

Используйте:

docker compose restart <service>

Частые ошибки новичков

Запуск команды не из той директории

Если выполнить docker compose up -d не там, где лежит docker-compose.yml, можно получить ошибку о том, что конфигурационный файл не найден.


Путаница между restart, up, build и down

Кратко:


Ожидание, что pull сам обновит работающие контейнеры

docker compose pull только скачивает новый образ. Чтобы контейнеры начали работать на новой версии, нужен ещё запуск:

docker compose up -d

Краткая памятка

docker compose up -d                     # Запуск проекта в фоне
docker compose down                      # Остановка и удаление контейнеров проекта
docker compose up -d --force-recreate    # Пересоздать контейнеры принудительно
docker compose build --no-cache          # Полная пересборка без кэша
docker compose up -d --build             # Пересборка и запуск
docker compose pull                      # Скачать свежие образы
docker compose restart <service>         # Перезапуск одного сервиса
docker compose restart                   # Перезапуск всех сервисов
docker compose stop <service> && docker compose start <service>  # Остановить и запустить сервис отдельно
docker compose up -d <service>           # Запуск одного сервиса
docker compose config                    # Проверка итоговой конфигурации

Docker — Отладка контейнеров

Эта страница объясняет основные команды Docker, которые используются для диагностики и отладки контейнеров. Здесь разобраны способы посмотреть запущенные контейнеры, проверить их состояние, изучить логи, подключиться внутрь контейнера и выполнить команды для анализа проблемы. Материал рассчитан на начинающих и помогает быстро понять, что происходит внутри контейнера, если приложение работает некорректно.


Когда используется отладка контейнеров

На практике команды из этой страницы используются в следующих ситуациях:

Типичный порядок диагностики:

  1. проверить список контейнеров
  2. проверить статус контейнера
  3. посмотреть логи
  4. зайти внутрь контейнера
  5. проверить процессы или выполнить команды

Просмотр контейнеров

Показать контейнеры текущего проекта

docker compose ps

Команда показывает контейнеры, которые относятся к текущему docker-compose проекту.

Пример вывода:

NAME                IMAGE          STATUS        PORTS
project_nginx       nginx:latest   Up 2 hours    0.0.0.0:80->80/tcp
project_php         php:8.2-fpm    Up 2 hours

Что здесь можно увидеть

Когда использовать

Это первая команда, которую стоит выполнить, если нужно проверить:


Показать все запущенные контейнеры

docker ps

Эта команда показывает все запущенные контейнеры в системе, независимо от проекта.

Пример:

CONTAINER ID   IMAGE         STATUS         PORTS
ab12cd34       nginx         Up 2 hours     80/tcp
cd34ef56       redis         Up 3 hours     6379/tcp

Чем отличается от docker compose ps

Команда Показывает
docker compose ps контейнеры текущего проекта
docker ps все контейнеры на сервере

Показать все контейнеры (включая остановленные)

docker ps -a

Показывает:

Пример статуса:

Exited (1) 5 minutes ago

Что это означает

Контейнер запустился, но приложение внутри завершилось с ошибкой.

В таком случае следующим шагом нужно посмотреть логи.


Табличный формат вывода

docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

Этот формат удобен, если нужно быстро увидеть:

Пример вывода:

CONTAINER ID   NAMES         STATUS          PORTS
3acb1234       project_php   Up 10 minutes
7d8e5678       project_nginx Up 10 minutes   80/tcp

Просмотр логов контейнеров

Логи — это основной источник информации при отладке.

Именно здесь можно увидеть:


Просмотр логов сервиса

docker compose logs <service>

Пример:

docker compose logs nginx

Вывод покажет весь лог контейнера.


Просмотр логов в реальном времени

docker compose logs -f <service>

Флаг -f означает follow — следить за логом в реальном времени.

Пример:

docker compose logs -f php

Это удобно, если:

Выход из режима просмотра:

CTRL + C

Показать последние строки логов

docker compose logs --tail=100 <service>

Показывает только последние 100 строк.

Пример:

docker compose logs --tail=100 nginx

Когда использовать

Если контейнер работает давно и лог очень большой.


Логи с временными метками

docker compose logs --timestamps <service>

Пример:

docker compose logs --timestamps php

Вывод будет выглядеть примерно так:

2026-03-11T12:32:10 app started
2026-03-11T12:32:11 connected to database

Это удобно для анализа событий во времени.


Подключение внутрь контейнера

Иногда для диагностики нужно зайти внутрь контейнера, чтобы:


Подключиться через shell

docker compose exec <service> sh

Пример:

docker compose exec php sh

После выполнения команды вы окажетесь внутри контейнера.


Использование bash

Если в контейнере установлен bash, можно использовать:

docker compose exec <service> bash

Пример:

docker compose exec php bash

Важно: Не во всех контейнерах есть bash. Многие минимальные образы используют только sh.


Проверить файлы внутри контейнера

После входа можно выполнять обычные команды Linux:

ls
cd
cat
ps
top

Например:

ls /var/www/html

Просмотр процессов внутри контейнера

docker compose top <service>

Пример:

docker compose top php

Команда показывает список процессов внутри контейнера.

Пример вывода:

UID     PID     CMD
root    123     php-fpm

Когда использовать

Полезно, если:


Выполнение команды внутри контейнера

Можно выполнить команду без входа в shell.

Формат:

docker compose exec <service> <command>

Пример:

docker compose exec php php -v

Вывод:

PHP 8.2.4 (cli)

Ещё примеры

Проверить установленные пакеты:

docker compose exec php composer --version

Проверить Node.js:

docker compose exec node node -v

Копирование файлов из контейнера

Иногда нужно забрать файл из контейнера.


Копирование файла из контейнера

docker cp container:/path/file .

Пример:

docker cp project_php:/var/log/php.log .

Файл будет скопирован в текущую папку.


Копирование файла в контейнер

docker cp file container:/path/

Пример:

docker cp config.php project_php:/var/www/config.php

Типичный сценарий диагностики

Если сервис не работает, обычно делают следующее:

1 Проверить контейнеры

docker compose ps

2 Проверить логи

docker compose logs --tail=100

3 Если ошибка не очевидна — подключиться внутрь

docker compose exec php sh

4 Проверить процессы

docker compose top php

5 Проверить приложение вручную

Например:

curl localhost

Полезные советы для новичков

Всегда начинайте диагностику с логов

В большинстве случаев ошибка уже записана в лог.


Не путайте контейнер и сервис

В Compose:


Проверяйте статус контейнера

Если статус:

Exited

контейнер уже остановился, и нужно смотреть логи.


Краткая памятка

docker compose ps                          # контейнеры текущего проекта
docker ps                                  # все запущенные контейнеры
docker ps -a                               # все контейнеры включая остановленные

docker compose logs <service>              # логи сервиса
docker compose logs -f <service>           # логи в реальном времени
docker compose logs --tail=100 <service>   # последние строки логов
docker compose logs --timestamps <service> # логи с временными метками

docker compose exec <service> sh           # войти в контейнер
docker compose exec <service> bash         # войти через bash
docker compose exec <service> <command>    # выполнить команду

docker compose top <service>               # процессы контейнера

docker cp container:/path/file .           # копировать из контейнера
docker cp file container:/path/            # копировать в контейнер

Docker Compose — Структура docker-compose.yml

Эта страница объясняет структуру файла docker-compose.yml и основные параметры, используемые при описании сервисов Docker. Здесь разобраны ключевые разделы конфигурации, такие как services, volumes, networks, environment, ports и другие. Материал рассчитан на начинающих и помогает понять, как правильно описывать инфраструктуру приложения в Docker Compose.


Что такое docker-compose.yml

docker-compose.yml — это файл конфигурации, который описывает:

Compose позволяет запускать всё приложение одной командой:

docker compose up -d

Базовая структура docker-compose.yml

Пример минимального файла:

version: "3.9"

services:
  nginx:
    image: nginx:1.25
    ports:
      - "8080:80"

Этот файл создаёт контейнер nginx и открывает порт 8080.


Основные разделы docker-compose.yml

Типичная структура файла выглядит так:

services:
volumes:
networks:

Раздел services

Раздел services описывает контейнеры проекта.

Пример:

services:
  nginx:
    image: nginx:1.25

  php:
    image: php:8.2-fpm

В этом примере создаются два сервиса:

Каждый сервис становится отдельным контейнером.


Параметр image

Определяет Docker-образ, который будет использоваться.

Пример:

services:
  nginx:
    image: nginx:1.25

Docker скачает образ nginx:1.25, если он отсутствует.


Параметр build

Используется, если образ нужно собрать локально из Dockerfile.

Пример:

services:
  app:
    build: .

Это означает:

собрать образ из Dockerfile текущей директории

Можно указать путь:

services:
  app:
    build: ./app

Параметр ports

Используется для проброса портов.

Пример:

ports:
  - "8080:80"

Это означает:

сервер:8080 → контейнер:80

После запуска приложение будет доступно:

http://server:8080

Параметр volumes

Подключает volumes или папки сервера.

Пример:

volumes:
  - ./src:/var/www/html

Это означает:

сервер ./src → контейнер /var/www/html

Использование Docker Volumes

Пример с volume:

services:
  mysql:
    image: mysql:8
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Volume будет хранить данные базы.


Параметр environment

Передаёт переменные окружения контейнеру.

Пример:

environment:
  MYSQL_ROOT_PASSWORD: secret
  MYSQL_DATABASE: app_db

Контейнер получит переменные:

MYSQL_ROOT_PASSWORD
MYSQL_DATABASE

Использование .env файла

Переменные можно хранить в .env.

Пример:

DB_PASSWORD=secret
APP_ENV=production

И использовать в Compose:

environment:
  DB_PASSWORD: ${DB_PASSWORD}

Параметр depends_on

Определяет зависимости между сервисами.

Пример:

services:
  php:
    depends_on:
      - mysql

Это означает:

сначала запускается mysql
затем php

Важно: depends_on не гарантирует, что сервис полностью готов к работе.


Параметр restart

Определяет политику перезапуска контейнера.

Пример:

restart: always

Возможные значения:

Значение Поведение
no не перезапускать
always всегда перезапускать
on-failure только при ошибке
unless-stopped перезапускать, пока не остановлен вручную

Параметр networks

Определяет сети Docker.

Пример:

services:
  app:
    networks:
      - backend

networks:
  backend:

Контейнер будет подключён к сети backend.


Пример полного docker-compose.yml

Пример простого веб-приложения:

services:

  nginx:
    image: nginx:1.25
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html

  php:
    image: php:8.2-fpm
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql

  mysql:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Этот файл запускает:


Проверка docker-compose.yml

Перед запуском полезно проверить конфигурацию:

docker compose config

Команда покажет итоговую конфигурацию после обработки переменных.


Запуск проекта

Запуск всех сервисов:

docker compose up -d

Остановка проекта

docker compose down

Типичные ошибки в docker-compose.yml

Ошибка YAML

Файл YAML чувствителен к отступам.

Неправильно:

services:
nginx:
image: nginx

Правильно:

services:
  nginx:
    image: nginx

Неверные порты

Если порт уже используется:

Bind for 0.0.0.0:80 failed

Нужно изменить порт.


Отсутствие volumes

Если данные не вынесены в volumes, они могут потеряться при пересоздании контейнера.


Краткая памятка

services     → контейнеры проекта
image        → используемый образ
build        → сборка образа
ports        → проброс портов
volumes      → подключение хранилища
environment  → переменные окружения
depends_on   → зависимости сервисов
restart      → политика перезапуска
networks     → сети контейнеров