Оглавление
Введение
Представьте: ваш сервер разрастается как снежный ком. Однажды вы разворачиваете веб-приложение, потом добавляете базу данных, затем систему кэширования, мониторинг, reverse proxy... И вот уже команда тратит полдня на то, чтобы вспомнить, какой контейнер за что отвечает и почему вчера всё работало, а сегодня — нет.
Контейнеризация революционизировала разработку, но с ростом инфраструктуры приходит хаос. Если вы узнали свою ситуацию — добро пожаловать в мир Docker Compose и Portainer. Два инструмента, которые превращают управление контейнерами из ежедневного кошмара в приятную рутину.

Docker Compose: оркестровка в одном файле
Docker Compose — это инструмент, который позволяет описать всю инфраструктуру приложения в одном YAML-файле. Представьте его как чертёж для архитектора: вместо того чтобы запускать контейнеры по одному и молиться, чтобы они подружились, вы один раз прописываете конфигурацию, и все сервисы стартуют согласованно.
Главная магия заключается в том, что Compose понимает зависимости между сервисами. База данных поднимается первой? Отлично, приложение подождёт. Нужно масштабировать веб-серверы? Одна команда — и у вас три реплики. Всё это описывается декларативно, а не императивно — вы говорите, что хотите получить, а не шаг за шагом объясняете, как этого добиться.
Что изменилось в 2025 году
Мир Docker эволюционировал, и некоторые привычки пора забыть. Вот что актуально сегодня:
Убираем version: из файлов — это поле больше не нужно. Современные Docker Compose файлы начинаются прямо с services:, что делает конфигурацию чище. Talent5001
Healthchecks обязательны — без них Docker не узнает, что сервис упал. Добавьте проверку здоровья, и Compose будет автоматически перезапускать нездоровые контейнеры:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000"]
interval: 30s
timeout: 5s
retries: 3Не запускайте от root — это серьёзная уязвимость. Создайте отдельного пользователя в Dockerfile, и ваши контейнеры станут безопаснее. Talent5001
Multi-stage builds — разделяйте сборку и runtime. Зачем тащить в production образ компиляторы и dev-зависимости? Сначала собираем, потом копируем только артефакты в минимальный образ.
Готовы перейти на современную серверную инфраструктуру?
В King Servers мы предлагаем серверы как на AMD EPYC, так и на Intel Xeon, с гибкими конфигурациями под любые задачи — от виртуализации и веб-хостинга до S3-хранилищ и кластеров хранения данных.
- S3-совместимое хранилище для резервных копий
- Панель управления, API, масштабируемость
- Поддержку 24/7 и помощь в выборе конфигурации
Результат регистрации
...
Создайте аккаунт
Быстрая регистрация для доступа к инфраструктуре
Portainer: когда консоль надоела
Если Docker Compose — это инструмент для разработчиков, то Portainer — это подарок для тех, кто ценит наглядность. Это веб-интерфейс для управления контейнерами, который превращает сложные команды в несколько кликов мышью.
Запомните: Portainer не заменяет Docker Compose, а дополняет его. Это как разница между написанием кода в блокноте и использованием полноценной IDE. Оба подхода работают, но второй экономит время и нервы.
Что умеет Portainer
Единая точка управления — один экземпляр Portainer может подключаться к нескольким Docker-хостам, Swarm-кластерам и даже Kubernetes. Вы управляете десятками серверов из одного окна браузера. Earthly Blog2
Развёртывание стеков — Portainer понимает Docker Compose файлы. Вы можете загрузить YAML-файл, указать на Git-репозиторий или просто вставить конфигурацию в веб-редактор. Нажимаете «Deploy» — и стек разворачивается.
Мониторинг из коробки — через интеграцию с Prometheus и Grafana Portainer предоставляет дашборды с метриками контейнеров и нод. Вы видите, кто жрёт память, куда ушёл CPU, какие сервисы перезапускаются слишком часто. Portainer3
Безопасность — ролевая модель доступа, LDAP и OAuth интеграции. Можно дать разработчикам доступ только к определённым стекам, а DevOps-инженерам — ко всей инфраструктуре.

Практический пример: разворачиваем полный стек
Давайте на конкретном примере посмотрим, как эти инструменты работают вместе. Представим, что нам нужен классический веб-стек: frontend на React, backend на Node.js, база данных PostgreSQL, Redis для кэширования и Nginx как reverse proxy.
Сначала создаём docker-compose.yml:
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
environment:
- REACT_APP_API_URL=http://localhost:8080
backend:
build: ./backend
ports:
- "8080:8080"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/app
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 5s
retries: 3
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=app
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d app"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- frontend
- backend
volumes:
postgres_data:
redis_data:Всё, что нужно для запуска — одна команда: docker compose up -d. Но мы пойдём дальше и развернём это через Portainer.
Установка Portainer
Сам Portainer, кстати, тоже запускается через Docker Compose. Вот минимальная конфигурация:
services:
portainer:
image: portainer/portainer-ce:latest
ports:
- "9443:9443"
volumes:
- portainer_data:/data
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
volumes:
portainer_data:После запуска открываем https://localhost:9443, создаём администратора — и готово.
Развёртывание стека в Portainer
Теперь переходим в раздел Stacks → Add stack. Portainer предлагает четыре способа развёртывания:
- Web editor — вставляем наш docker-compose.yml прямо в браузере
- Upload — загружаем файл с компьютера
- Git repository — указываем URL репозитория и путь к файлу
- Custom template — используем готовый шаблон
Для эксперимента выберем Git repository — это самый production-ready подход. Указываем URL репозитория, ветку, путь к файлу. Portainer автоматически скачает конфигурацию и развернёт стек. Portainer Documentation4
Настройка переменных окружения
В реальной жизни пароли и API-ключи не хранятся в репозитории. Portainer позволяет определить переменные окружения прямо при развёртывании стека. Можно задать их вручную или загрузить из .env-файла.
Ещё одна killer-фича — webhooks. После настройки webhook-а вы можете триггерить переразвёртывание стека из CI/CD pipeline. Запушили код → GitHub Actions вызвали webhook → Portainer автоматически обновил контейнеры. Portainer Documentation4

Мониторинг: видеть всё
Развернули стек — отлично. Но как понять, что всё работает хорошо? Portainer предоставляет базовый мониторинг из коробки: статус контейнеров, потребление ресурсов, логи в реальном времени.
Но для серьёзного production нужен полноценный мониторинг. Portainer позволяет развернуть стек Prometheus + Grafana прямо из шаблонов. Добавляем метку monitoring=true на ноды, выбираем шаблон «Swarm Monitoring» — и через несколько минут у вас красивые дашборды с метриками. Portainer3
Что можно отслеживать:
- Container Metrics — потребление ресурсов всеми контейнерами
- Node Metrics — загрузка CPU, память, дисковое пространство на хостах
- Логи — централизованный сбор логов с возможностью фильтрации
- События — кто и когда перезапускал контейнеры, менял конфигурации
Лучшие практики 2025 года
После нескольких лет работы с Docker Compose и Portainer я вывел для себя несколько правил, которые экономят часы дебага и предотвращают инциденты.
Разделяйте конфигурации
Не пишите один docker-compose.yml на все случаи жизни. Используйте override-файлы:
docker-compose.yml— базовая конфигурацияdocker-compose.override.yml— для локальной разработкиdocker-compose.production.yml— production-специфичные настройки
Запуск в production: docker compose -f docker-compose.yml -f docker-compose.production.yml up -d Docker Docs5
Healthchecks — ваши друзья
Каждый сервис должен иметь healthcheck. Это позволяет Docker понимать, когда приложение готово принимать трафик, а когда оно упало и нуждается в перезапуске.
Не ограничивайтесь простой проверкой порта. Проверяйте реальную функциональность: для базы данных — выполнение тестового запроса, для API — эндпоинт health check.
Используйте read-only файловые системы
Где это возможно, запускайте контейнеры с флагом read_only: true. Это предотвращает модификацию файловой системы злоумышленниками, если контейнер будет скомпрометирован. Временные файлы монтируйте как tmpfs. Talent5001
Регулярно обновляйте образы
Уязвимости находят постоянно. Настройте Dependabot или Renovate для автоматических PR с обновлениями базовых образов. Portainer покажет, какие образы устарели, но обновлять их — ваша задача.
Лимитируйте ресурсы
Всегда задавайте memory и cpus лимиты. Это предотвращает ситуации, когда один runaway-контейнер съедает всю память сервера и вызывает OOM-killer, который прибьёт и другие сервисы.

Когда выбирать что
Часто спрашивают: «Нужен ли мне Portainer, если я уже использую Docker Compose?» Отвечаю: это инструменты для разных задач, и они прекрасно дополняют друг друга.
Docker Compose — ваш инструмент для:
- Локальной разработки
- Описания инфраструктуры как кода
- Простых развёртываний на одном сервере
- CI/CD pipeline
Portainer — ваш инструмент для:
- Управления множеством серверов из одной точки
- Визуального мониторинга и управления
- Командной работы с разграничением доступа
- Развёртывания из Git-репозиториев
- Делегирования задач менее техническим коллегам
В идеальном мире у вас есть оба инструмента: Compose описывает инфраструктуру, Portainer даёт удобный интерфейс для управления. StackShare

Заключение
Управление контейнерами — это навык, который отличает хаотичную инфраструктуру от профессиональной. Docker Compose даёт вам язык для описания сложных систем, Portainer — инструмент для удобного управления ими.
Начните с малого: опишите один проект в Docker Compose, разверните его через Portainer. Почувствуйте, как всё становится предсказуемее и контролируемее. Потом добавьте healthchecks, мониторинг, автоматические обновления.
Через несколько месяцев вы оглянетесь назад и удивитесь: как вообще можно было жить без этого? Контейнеры перестанут ломаться по ночам, команда перестанет спрашивать «а почему не работает?», а вы будете спать спокойно.
Попробуйте. Разверните тестовый стек на выходных, поиграйтесь с настройками. Если возникнут вопросы — команда Kingservers всегда готова помочь с настройкой вашей инфраструктуры.
Удачного деплоя! 🚀