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

