
Portainer — удобный интерфейс управления контейнерами (Docker/Kubernetes) из браузера, но почему-то о нём ещё не все знают. В статье расскажу, что это такое, зачем он вообще нужен и как установить.
Сначала введу в курс дела. В статье пойдет речь о Portainer Community Edition (CE) — наборе инструментов с открытым кодом, который сейчас довольно популярен и уже собрал неплохое сообщество. Есть ещё коммерческая версия Portainer Business Edition, но к ней нужен ключик или бесплатные узлы (для тех, кому актуально — можно прочитать тут).

Вообще, Portainer появился в 2016 году на базе Docker UI. Команда проекта поменяла интерфейс, а также пересобрала архитектуру, чтобы превратить GUI для докера в универсальную платформу управления контейнерной инфраструктурой. Сейчас Portainer поддерживает Docker Standalone, Docker Swarm, Azure ACI и Kubernetes.
Как работает
Portainer разворачивается как веб-приложение в виде контейнера на сервере с Docker Engine. Панель работает на Linux, Windows и в средах с WSL. Сам образ компактный, порядка 3-4 МБ, поэтому потребляет минимум ресурсов.

Вы его запускаете (об этом дальше), задаёте пароль администратора и выбираете Docker-хост для управления — локальный или удалённый. Дальше инструмент подключается к Docker-демону через Docker API, либо по локальному сокету, либо по HTTPS, и начинает отображать состояние контейнеров.

После входа в интерфейс открывается дашборд со списком доступных окружений и их текущим состоянием.

Если подключены локальный Docker и несколько удалённых хостов — они отображаются на главной странице с краткой информацией о количестве контейнеров и общей нагрузке. Между окружениями можно переключаться и управлять каждым из них из одного интерфейса.

Из этого всего вытекает архитектура из двух контейнеров:
Portainer Server — основной контейнер. Он отвечает за отображение панели, хранение настроек и взаимодействие с Docker или Kubernetes API.
Portainer Agent — вспомогательный контейнер, который устанавливается на удалённые хосты. Он принимает команды от сервера Portainer, выполняет их локально через Docker.sock и возвращает результат.
По умолчанию интерфейс доступен на порту 9443. Также используется 8000 порт для TCP-туннелей, но он нужен только при работе с Edge-агентами.
Что внутри
В интерфейсе всё разложено по разделам. На главной логично отображается список всех контейнеров — отсюда же их можно запустить, остановить и удалить. Внутрь каждого контейнера можно зайти, посмотреть его логи и базовые метрики, например, CPU, память, I/O. По мне, это значительно упрощает отладку.
В Images можно скачать образ из Docker Hub или другого реестра через интерфейс, не заходя в консоль с docker pull. Тут же видно, какие образы уже загружены и сколько они весят — ненужные можно сразу удалить, чтобы освободить место.

В Networks показываются все Docker-сети и куда они подвязаны. Кроме того в разделе можно создать новые подключения (bridge, overlay в Swarm и т.д.).
В Volumes видны томы для хранения данных — прямо через интерфейс можно создать новый или удалить неиспользуемый. Отмечу, содержимое томов Portainer не правит, но для бытовых задач этого и не нужно.

Раздел Stacks нужен для развёртывания приложений через Docker Compose или стеки Swarm. К слову, Portainer поддерживает быстрое развертывание через загрузку docker-compose.yml. Внутри панели будут видны все сервисы и контейнеры, их можно перезапускать, обновлять образы и править переменные окружения. Помогает, когда нужно деплоить сразу несколько связанных контейнеров.
В App Templates лежит библиотека типовых развёртываний, вроде WordPress, MySQL и nginx. С их помощью Portainer сам подтягивает образ и запускает контейнер с базовыми настройками. Также можно подключить свой каталог шаблонов через JSON в настройках.

Отдельно есть управление пользователями и доступом — можно создать учётки и группы, а затем раздать права. Однако в CE можно делегировать доступ только к определённым эндпоинтам или стекам на уровне просмотр/управление.
Кроме этих разделов, разработчики добавили Registries для подключения приватных реестров образов, Events с журналом событий и настройки самой панели. Отдельно отмечу, что у панели есть REST API для автоматизации, так что почти всё можно скриптовать через запросы.
С чем может помочь
Теперь к сценариям. Я напишу наиболее общие, но их гораздо больше (если вы еще не пользовались панелькой, очень рекомендую потыкать ее самостоятельно). Portainer поможет:
Проверять состояние
Как уже писал, в панели видно состояние работы всех контейнеров. Если что-то упало, можно открыть логи и перезапустить всё из панели. В таких случаях это проще, чем заходить на сервер и последовательно выполнять docker ps и docker logs.
Развертывать сервисы
Через панель можно быстро поднимать новые сервисы, не придется даже писать команды с кучей параметров. Зашли в Portainer, выбрали образ, настроили порты, тома и переменные — если что-то забыли, сама панель об этом напомнит.
Обновлять приложения
Если у образа вышла новая версия, его можно подтянуть в Images и перезапустить контейнер уже на обновлённом варианте. Со стеками логика такая же. Это не отменяет нормальный пайплайн, но в небольших окружениях помогает быстро обновляться.
Подключать хосты
Если есть несколько серверов с Docker, в интерфейсе их можно подключить как отдельное окружение. Для этого нужно на новые хосты поставить Portainer Agent, после эндпоинты можно добавить в интерфейс. Дальше можно переключаться между хостами и выполнять одни и те же действия в разных окружениях (например, разворачивать на них одинаковые стеки), не открывая отдельные сессии.
Работать в команде
Если инфраструктурой пользуются несколько человек, панель помогает развести права. Например, разработчикам можно открыть только dev-окружение, чтобы они сами перезапускали контейнеры, а тестировщикам дать просмотр логов тестового стенда. В этом случае в журнале событий будет видно, кто и какие действия выполнил, а если что-то пойдет не так, то можно откатить изменения.
Как установить
Теперь к самому главному — к установке Portainer CE. Пройдемся по основным платформам.
Docker Standalone
Linux
В Linux платформа ставится как контейнер, поэтому у вас должен быть установлен Docker Engine. Развернуть Portainer можно через docker run или через Docker Compose. Ниже первый вариант:
1. Создайте том, в котором Portainer будет хранить свою базу данных:
docker volume create portainer_data
2. Скачайте и запустите Portainer Server:
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
Если по историческим причинам нужен HTTP-порт 9000, добавьте в docker run команду -p 9000:9000. Проверить, что контейнер запустился, можно через docker ps:
root@server:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7963585688a9 portainer/portainer-ce:lts "/portainer" 8 seconds ago Up 8 seconds 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp, 0.0.0.0:9443->9443/tcp, [::]:9443->9443/tcp, 9000/tcp portainer
После установки откройте браузер и перейдите по адресу: https://localhost:9443
Windows
Для Windows сначала нужно добавить исключения в брандмауэре. Сделать это можно через PowerShell:
netsh advfirewall firewall add rule name="cluster_management" dir=in action=allow protocol=TCP localport=2377
netsh advfirewall firewall add rule name="node_communication_tcp" dir=in action=allow protocol=TCP localport=7946
netsh advfirewall firewall add rule name="node_communication_udp" dir=in action=allow protocol=UDP localport=7946
netsh advfirewall firewall add rule name="overlay_network" dir=in action=allow protocol=UDP localport=4789
netsh advfirewall firewall add rule name="swarm_dns_tcp" dir=in action=allow protocol=TCP localport=53
netsh advfirewall firewall add rule name="swarm_dns_udp" dir=in action=allow protocol=UDP localport=53
Также нужно установить Windows Container Host и Docker. У Microsoft для этого есть PowerShell-скрипт — скачайте и запустите его:
Invoke-WebRequest -UseBasicParsing "https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1" -o install-docker-ce.ps1
.\install-docker-ce.ps1
После этого перезагрузите сервер и уже после можно ставить Portainer. Сначала в PowerShell создайте том под базу данных Portainer
docker volume create portainer_data
Затем скачайте и запустите Portainer Server:
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart always -v \\.\pipe\docker_engine:\\.\pipe\docker_engine -v portainer_data:C:\data portainer/portainer-ce:lts
По умолчанию Portainer генерирует самоподписанный SSL-сертификат для порта 9443. Альтернатива та же, можно использовать свой сертификат.
Если нужен HTTP-порт 9000, добавьте в docker run команду -p 9000:9000. После установки адрес тот же (https://localhost:9443).
Установка в WSL тут.
В своей среде Kubernetes
Перед установкой Portainer в Kubernetes проверьте, что у вас есть рабочий кластер Kubernetes, доступ к helm или kubectl, права администратора кластера (Portainer создаёт ServiceAccount и ClusterRoleBinding, без этого он к кластеру не подключится), включённый и рабочий Kubernetes RBAC, StorageClass по умолчанию (если у вас нет StorageClass с тегом default, будет ошибка). Дальше будут два варианта.
Через Helm
Для начала убедитесь, что ваш Helm не ниже версии 3.2, чтобы работал флаг --create-namespace. Если все ок, добавьте репозиторий Portainer и обновите его:
helm repo add portainer https://portainer.github.io/k8s/
helm repo update
Дальше установить Portainer можно тремя вариантами. Через NodePort сервис открывается наружу на портах нод, через Ingress сервис остаётся внутри как ClusterIP и публикуется доменом через контроллер, и через LoadBalancer под сервис выделяется отдельный внешний IP. Проще всего первый вариант, где нужно выполнить одну команду:
helm upgrade --install --create-namespace -n portainer portainer portainer/portainer \
--set tls.force=true \
--set image.tag=lts
Отмечу, что по умолчанию Portainer генерирует самоподписанный SSL-сертификат для порта 30779 — если нужен HTTP на 30777, уберите параметр --set tls.force=true
Также, если нужно закрепить платформу за конкретным узлом при установке Helm-чартом, добавьте в команду:
--set nodeSelector.kubernetes\.io/hostname=<YOUR NODE NAME>
Через YAML-манифесты
YAML-манифесты поддерживают доступ через NodePort и Load Balancer. Для NodePort нужно будет выполнить одну команду:
kubectl apply -n portainer -f https://downloads.portainer.io/ce-lts/portainer.yaml
Portainer будет доступен на 30777 для HTTP и 30779 для HTTPS. Войти в интерфейс можно будет через https://localhost:30779/ или через http://localhost:30777/. Учтите, что для других способов установки URL отличаются.
Установка в WSL тут.
В заключение отмечу, что по умолчанию Portainer использует самоподписанный SSL-сертификат для порта 9443. Его можно заменить либо во время установки, либо уже после, через интерфейс. И ещё напомню, компрометация интерфейса даёт доступ ко всем вашим контейнерам, поэтому помните о базовых правилах ИБ — обновляйтесь и ставьте надежные пароли.
Portainer — не единственная платформа, есть еще аналогичные Podman, Komodo и Arcane. Делитесь в комментариях, пользовались ли вы ими.
Также, как вы уже могли заметить, это мой первый обзор, поэтому пишите, стоит ли делать ещё и какие инструменты вам интересны.
© 2026 ООО «МТ ФИНАНС»
Комментарии (8)

Dev_Ops312
29.01.2026 03:25Удобная панель, если нужно что-то быстро запустить, не подключаясь по SSH или перезапустить

Xard471
29.01.2026 03:25Здравствуйте. Неплохая статья, но если я не ошибаюсь в Portainer достаточно много уязвимостей. Хоть от версии к версии их исправляют, но добавлять еще одну обертку к консольным командам, которые и так обарачивают в alias чтобы не писать постоянно docker ps, docker run особого смысла не вижу. Видимо по этой причине он не популярен как и остальные веб панельки для docker.

Beginer_First
29.01.2026 03:25Я кстати пользовался когда несколько нод с котнейнерами было , и на каждом несколько приложух , мне показалось удоьным .
Хотя можете осудить в итоге перешел на кубер хехехе

DS2
29.01.2026 03:25Не очень содержательная статья :-(
Какие отличия между версиями не написано
Скриншоты где с темной темой, где со светлой
Как ставить portainer agent и настраивать не написано

alienator
29.01.2026 03:25Portainer довольно удобен, но только на небольших кластерах. Когда у вас больше 20-30 нод, больше пары сотен контейнеров, лаги интерфейса становятся слишком долгими. Агенты и так неповоротливые, а когда начинают отвечать километровыми JSON'ами, создавать сотни запросов на управляющие ноды, периодически отваливаться, это превращается в ад. Просмотр логов становится болью. Так что не привыкайте к портейнеру сильно, если планируете увеличивать workloads.
А, и еще, все, что вы делаете не через сам портейнер, он может не увидеть изменения и потерять синхронизацию.
Еще поиск в нем слабый.
Roman_Cherkasov
Развернул себе домашний сервер, хостить всякое. Ну думаю Portainer поставлю, буду из браузера всем рулить, логи смотреть, перезапускаться. В итоге оказалось что в консоли это все просто быстрее получается. Единственное что показалось удобнее - логи смотреть, но и тут возникла проблема. Подключаешься к контейнеру, который сыпет логами(Gitlab при загрузке например) и через 15 секунд вкладка начинает жрать 1.5гб памяти, ещё через пару секунд Oops. Chrome ее прибил.
jurikobe
интересный кейс, пойду придумывать какой то сброс старых логов для моего kubegui.net, спасибо за наводку)