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)


  1. Roman_Cherkasov
    29.01.2026 03:25

    Развернул себе домашний сервер, хостить всякое. Ну думаю Portainer поставлю, буду из браузера всем рулить, логи смотреть, перезапускаться. В итоге оказалось что в консоли это все просто быстрее получается. Единственное что показалось удобнее - логи смотреть, но и тут возникла проблема. Подключаешься к контейнеру, который сыпет логами(Gitlab при загрузке например) и через 15 секунд вкладка начинает жрать 1.5гб памяти, ещё через пару секунд Oops. Chrome ее прибил.


    1. jurikobe
      29.01.2026 03:25

      интересный кейс, пойду придумывать какой то сброс старых логов для моего kubegui.net, спасибо за наводку)


  1. Dev_Ops312
    29.01.2026 03:25

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


  1. Xard471
    29.01.2026 03:25

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


    1. Beginer_First
      29.01.2026 03:25

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

      Хотя можете осудить в итоге перешел на кубер хехехе


  1. DS2
    29.01.2026 03:25

    Не очень содержательная статья :-(

    Какие отличия между версиями не написано

    Скриншоты где с темной темой, где со светлой

    Как ставить portainer agent и настраивать не написано


  1. alienator
    29.01.2026 03:25

    Portainer довольно удобен, но только на небольших кластерах. Когда у вас больше 20-30 нод, больше пары сотен контейнеров, лаги интерфейса становятся слишком долгими. Агенты и так неповоротливые, а когда начинают отвечать километровыми JSON'ами, создавать сотни запросов на управляющие ноды, периодически отваливаться, это превращается в ад. Просмотр логов становится болью. Так что не привыкайте к портейнеру сильно, если планируете увеличивать workloads.

    А, и еще, все, что вы делаете не через сам портейнер, он может не увидеть изменения и потерять синхронизацию.

    Еще поиск в нем слабый.


  1. ss-pol
    29.01.2026 03:25

    надо бы и proxmox упомянуть