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 ООО «МТ ФИНАНС»