Portainer — самый популярный веб-интерфейс для Docker, который превращает управление контейнерами из набора консольных команд в наглядную панель в браузере. Установка Portainer занимает меньше десяти минут: сам он работает как обычный контейнер и не требует ничего, кроме запущенного Docker. В этой статье пошагово развернём Portainer CE на VPS, защитим его паролем и HTTPS, разберём основные разделы интерфейса и подключим удалённые серверы через агент. Инструкция подходит для любого дистрибутива Linux с Docker.
Что такое Portainer и зачем он нужен
Portainer CE (Community Edition) — бесплатный open-source инструмент с веб-интерфейсом для управления Docker, Docker Swarm и Kubernetes. Через браузер вы можете запускать и останавливать контейнеры, смотреть логи и потребление ресурсов, редактировать стеки Compose, управлять образами, томами и сетями.
Кому он особенно полезен:
- Новичкам — видно всю картину: какие контейнеры запущены, сколько ресурсов едят, какие порты проброшены.
- Администраторам нескольких серверов — один Portainer управляет десятком хостов через агенты.
- Командам — встроенное разграничение прав: разработчику можно дать доступ только к его стеку.
При этом Portainer не заменяет понимание Docker: базовые концепции — образы, тома, сети — знать всё равно нужно. Если вы только начинаете, сперва прочитайте статью про установку Docker на VPS.
Требования к серверу
Portainer сам по себе лёгкий: ему достаточно ~100 МБ RAM и минимальной доли CPU. Ресурсы нужны в первую очередь контейнерам, которыми вы будете управлять. Для рабочего окружения с несколькими стеками комфортный минимум — 2–4 ГБ RAM и SSD/NVMe-диск, чтобы образы собирались и разворачивались быстро.
Перед началом убедитесь, что Docker установлен и работает:
docker --version
docker info | grep "Server Version"
Если команда возвращает версию — можно продолжать.
Установка Portainer CE
Шаг 1. Создаём том для данных
Portainer хранит настройки, пользователей и данные стеков в собственной базе. Чтобы они переживали пересоздание контейнера, создаём именованный том:
docker volume create portainer_data
Подробнее о том, как Docker хранит данные, — в статье про тома и данные Docker.
Шаг 2. Запускаем контейнер
docker run -d \
--name portainer \
--restart=always \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Что здесь важно:
-p 9443:9443— веб-интерфейс по HTTPS с самоподписанным сертификатом. Порт 8000 (для Edge-агентов) пробрасывать не обязательно, если вы их не используете.-v /var/run/docker.sock:/var/run/docker.sock— доступ к Docker API хоста. Именно через сокет Portainer управляет контейнерами, поэтому доступ к самому Portainer нужно защищать так же строго, как root-доступ к серверу.--restart=always— панель поднимется сама после перезагрузки сервера.
Шаг 3. Первый вход
Откройте в браузере https://IP_сервера:9443. Браузер предупредит о самоподписанном сертификате — на этапе настройки это нормально. Portainer попросит создать администратора: логин и пароль минимум 12 символов.
Важно: если не создать администратора в течение нескольких минут после запуска, Portainer из соображений безопасности заблокирует установку. Лечится перезапуском:
docker restart portainer
После входа выберите окружение local — это Docker на текущем сервере.
Вариант установки через Docker Compose
Если вы держите всю инфраструктуру в Compose-файлах (а в продакшене так и стоит делать), Portainer описывается таким сервисом:
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
Запуск:
docker compose up -d
Как устроен синтаксис Compose и чем он удобнее длинных docker run, мы разбирали в статье Docker Compose на практике.
Обзор интерфейса: что где находится
| Раздел | Что делает |
|---|---|
| Dashboard | Сводка: количество контейнеров, образов, томов, сетей |
| Containers | Список контейнеров: запуск, стоп, логи, консоль, статистика |
| Images | Управление образами: pull, удаление, сборка из Dockerfile |
| Stacks | Развёртывание приложений из docker-compose.yml прямо в браузере |
| Volumes | Тома: создание, просмотр, очистка неиспользуемых |
| Networks | Сети Docker: bridge, кастомные сети, подключение контейнеров |
| Users / Teams | Пользователи, команды и права доступа |
Самые полезные фишки в повседневной работе:
- Логи в реальном времени — кнопка Logs у контейнера, с фильтром и автообновлением.
- Консоль в браузере — Console открывает shell внутри контейнера без SSH и
docker exec. - Stats — графики CPU, памяти и сети по каждому контейнеру.
- Recreate — пересоздать контейнер с новой версией образа в два клика.
Разворачиваем первый стек
Раздел Stacks → Add stack позволяет вставить содержимое docker-compose.yml в веб-редактор и развернуть его кнопкой. Для примера — стек с Nginx:
services:
web:
image: nginx:alpine
restart: unless-stopped
ports:
- "8080:80"
Нажмите Deploy the stack — через несколько секунд контейнер появится в списке, а сайт откроется по http://IP_сервера:8080. Стек можно редактировать в том же окне и переразворачивать: Portainer сам пересоздаст изменившиеся сервисы.
Безопасность: закрываем панель от посторонних
Portainer имеет полный доступ к Docker, а значит — к серверу. Минимальный набор мер:
- Сильный пароль администратора и отдельные учётки для каждого человека, никакого общего логина.
- Ограничение доступа файрволом. Если панелью пользуетесь только вы, разрешите порт 9443 лишь со своего IP:
ufw allow from ВАШ_IP to any port 9443 proto tcp
ufw deny 9443/tcp
- Нормальный HTTPS вместо самоподписанного сертификата. Удобнее всего спрятать Portainer за обратный прокси с автоматическим Let's Encrypt — как это сделать, читайте в статье про Traefik для Docker.
- Обновления. Portainer обновляется как обычный контейнер:
docker pull portainer/portainer-ce:latest
docker stop portainer && docker rm portainer
# затем повторите команду docker run из шага 2 — данные сохранятся в томе portainer_data
Управление несколькими серверами через Portainer Agent
Один Portainer может управлять целым парком хостов. На каждом удалённом сервере запускается лёгкий агент:
docker run -d \
--name portainer_agent \
--restart=always \
-p 9001:9001 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/docker/volumes:/var/lib/docker/volumes \
portainer/agent:latest
Затем в основном Portainer: Environments → Add environment → Docker Standalone → Agent, указываете IP_удалённого_сервера:9001 — и новый хост появляется в списке окружений. Порт 9001 обязательно закройте файрволом от всех, кроме IP сервера с Portainer: агент не имеет собственной аутентификации.
Частые вопросы
Portainer бесплатный?
Да, Portainer CE (Community Edition) полностью бесплатен и покрывает все задачи администрирования Docker на своих серверах: контейнеры, стеки, образы, тома, пользователи. Есть платная Business Edition с расширенным RBAC и поддержкой, но для личных проектов и небольших команд CE хватает с запасом.
Сколько ресурсов потребляет Portainer?
Сам контейнер Portainer занимает порядка 50–150 МБ оперативной памяти и почти не нагружает процессор. Основную нагрузку создают контейнеры, которыми вы управляете, поэтому сервер подбирайте под них, а не под панель.
Можно ли управлять Docker Compose через Portainer?
Да, для этого есть раздел Stacks: вы вставляете содержимое docker-compose.yml в веб-редактор или подтягиваете его из git-репозитория, и Portainer разворачивает стек. Редактирование и обновление стека тоже делаются из браузера. Единственный нюанс — стеки, созданные из консоли, Portainer покажет с пометкой limited и редактировать их не даст.
Чем Portainer отличается от команды docker в консоли?
Функционально Portainer использует тот же Docker API, поэтому всё, что он делает, можно сделать и командами. Разница в удобстве: логи, статистика, список портов и томов видны сразу, а типовые операции выполняются в пару кликов. Консоль остаётся незаменимой для скриптов и автоматизации — эти инструменты дополняют друг друга.
Забыл пароль администратора — что делать?
Остановите контейнер Portainer и воспользуйтесь официальной утилитой сброса пароля, которая работает напрямую с томом данных: docker run --rm -v portainer_data:/data portainer/helper-reset-password. Утилита выведет новый временный пароль администратора в консоль, после чего запустите Portainer обратно и смените пароль в профиле.
Portainer раскрывается на сервере, где хватает ресурсов и на панель, и на десяток рабочих стеков. Тариф Pro от Cheap-Host — 12 vCPU, 16 ГБ RAM и 128 ГБ NVMe за 750₽/мес на KVM-виртуализации в Москве — как раз такой случай: сервер выдаётся за 45–60 секунд. Заказать VPS на Cheap-Host →