Панель управления направляет команды к изолированным контейнерам на сервере
DevOps

Portainer для Docker: установка, возможности и защита панели

Устанавливаем Portainer CE через Docker Compose, открываем панель без публичного порта, подключаем локальный Docker и разбираем риски доступа к сокету.

Содержание

Portainer — веб-панель для управления Docker. В ней можно видеть контейнеры, образы, сети и тома, читать журналы, открывать консоль контейнера и разворачивать Compose-стеки. Она удобна для наблюдения и разовых операций, но не превращает настройку сервера в безопасный набор кликов: ошибочно удалённый том или остановленный контейнер останется реальной операцией Docker.

Ниже Portainer CE устанавливается на один VPS с уже работающим Docker. Панель будет слушать только локальный адрес сервера. Администратор откроет её через SSH-туннель, поэтому порт управления не придётся публиковать в интернете.

Что Portainer получает от Docker

Docker Engine предоставляет API — программный интерфейс для управления контейнерами. На Linux локальные программы обычно обращаются к нему через файл-сокет /var/run/docker.sock. Portainer подключает этот сокет внутрь своего контейнера и отправляет через него команды Docker.

Такое подключение даёт панели очень широкие права. Через Docker можно запустить привилегированный контейнер, подключить каталог хоста и изменить файлы сервера. Поэтому компрометация учётной записи Portainer сравнима не с потерей доступа к обычному сайту, а с потерей административного управления VPS.

Не устанавливайте панель «на пробу» на рабочем сервере, если не готовы обновлять её, ограничивать доступ и включать её данные в резервное копирование.

Подготовьте сервер и каталог проекта

Инструкция предполагает, что Docker Engine и плагин Compose уже установлены из поддерживаемого источника. Если команды docker и docker compose ещё не работают, начните с установки Docker на Ubuntu.

Проверьте версии и состояние службы на VPS:

docker --version
docker compose version
sudo systemctl is-active docker

Первые две команды должны вывести версии, третья — слово active. Они ничего не меняют. Если текущий пользователь не входит в группу docker, используйте sudo docker ...; добавление пользователя в эту группу фактически предоставляет ему административные возможности и не должно быть автоматическим решением ошибки доступа.

Создайте отдельный каталог конфигурации. Команды выполняются на VPS от пользователя с домашним каталогом, который вы включаете в резервные копии:

mkdir -p ~/services/portainer
cd ~/services/portainer

mkdir -p создаёт каталог, если его ещё нет. Команда не удаляет существующие файлы. Перед продолжением выполните pwd: путь должен заканчиваться на /services/portainer.

Опишите Portainer в Compose

Создайте в этом каталоге файл compose.yaml и поместите в него конфигурацию:

services:
  portainer:
    image: portainer/portainer-ce:lts
    container_name: portainer
    restart: unless-stopped
    ports:
      - "127.0.0.1:9443:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

volumes:
  portainer_data:

Тег lts выбирает длительно поддерживаемую ветку Portainer CE. Перед плановым обновлением всё равно читайте примечания к выпуску и делайте копию данных. Привязка 127.0.0.1:9443:9443 означает: порт 9443 доступен только с самого VPS и перенаправляется на HTTPS-порт контейнера.

Именованный том portainer_data сохраняет настройки панели при замене контейнера. Подключение docker.sock даёт Portainer управление локальным Docker. Порт 8000 из некоторых примеров нужен для туннеля Edge Agent; для управления только этим сервером он не требуется.

Проверьте синтаксис до запуска:

docker compose config --quiet

При успехе команда завершится без вывода и с кодом 0. Если она указывает строку с ошибкой, исправьте отступы YAML; табуляция в YAML недопустима. Не запускайте стек, пока проверка не проходит.

Запустите контейнер и проверьте порт

Теперь Compose скачает образ, создаст постоянный том и запустит контейнер в фоне. Команды выполняются из ~/services/portainer; существующий контейнер с таким же именем станет причиной ошибки, а не будет молча удалён:

docker compose up -d
docker compose ps
docker compose logs --tail 50 portainer

В docker compose ps контейнер должен иметь состояние running. В журнале не должно быть циклического перезапуска. При первом запуске Portainer создаёт самоподписанный TLS-сертификат, поэтому браузер не сможет подтвердить его издателя без отдельной настройки сертификата.

Убедитесь, что порт привязан только к loopback — локальному сетевому интерфейсу:

sudo ss -lntp '( sport = :9443 )'

Ожидается адрес 127.0.0.1:9443, а не 0.0.0.0:9443 и не [::]:9443. Если виден внешний адрес, остановите проект командой docker compose down, исправьте строку ports и запустите снова. down удалит контейнер и сеть проекта, но сохранит именованный том, пока вы не добавляете ключ --volumes.

Откройте панель через SSH-туннель

SSH-туннель связывает локальный порт компьютера с портом, который доступен на VPS. Команду выполняйте на своём компьютере, а не в сеансе VPS:

ssh -N -L 9443:127.0.0.1:9443 admin@SERVER_IP

Замените admin своим SSH-пользователем, а SERVER_IP — адресом VPS. Ключ -L создаёт локальное перенаправление, -N не запускает удалённую командную оболочку. Пока соединение открыто, перейдите в браузере на https://127.0.0.1:9443.

Предупреждение о сертификате ожидаемо для автоматически созданного самоподписанного сертификата, но всё равно проверьте, что адрес именно локальный и туннель установлен к вашему серверу. Если нужен привычный домен и доверенный сертификат, разместите панель за Nginx и оставьте доступ ограниченным корпоративной сетью или списком адресов.

При первом входе задайте отдельный длинный пароль администратора и завершите начальную настройку без задержки. Не используйте тот же пароль, что у хостера, SSH или почты. Затем выберите локальное окружение Docker.

Что можно делать в панели, а что лучше оставить в Git

Portainer хорошо подходит для просмотра состояния, журналов, потребления ресурсов и перезапуска конкретного контейнера. Compose-файлы рабочих приложений лучше хранить в Git и разворачивать одинаковым способом. Иначе конфигурация, созданная только в браузере, становится единственным описанием системы.

Перед удалением контейнера смотрите, какие тома к нему подключены. Сам контейнер обычно можно создать заново из образа, а данные базы или загруженные файлы могут находиться в томе и быть уникальными. Различия между томом и каталогом хоста разобраны в статье о Docker volumes и bind mounts.

Не используйте встроенную консоль контейнера как постоянный способ редактирования приложения. Изменение внутри контейнера исчезнет после его пересоздания. Исправляйте Dockerfile, Compose или подключённый конфигурационный файл, затем разворачивайте новую версию.

Обновляйте панель с возможностью возврата

До обновления сохраните compose.yaml, сделайте резервную копию данных Portainer и запишите текущий образ:

cd ~/services/portainer
docker inspect portainer --format '{{.Config.Image}}'
docker volume inspect portainer_portainer_data

Первая команда показывает тег запущенного образа. Вторая помогает найти фактическое имя тома; префикс зависит от каталога проекта. Не копируйте файлы работающего тома вслепую. Используйте согласованный способ резервирования и проверьте восстановление по инструкции о копиях Docker volumes.

После изучения примечаний к выпуску обновление выполняют из каталога проекта:

docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail 50 portainer

pull скачивает образ, но не меняет работающий контейнер. up -d пересоздаёт его с тем же томом. Успех — панель открывается, локальное окружение Docker доступно, а список контейнеров соответствует docker ps на сервере.

Для возврата укажите в compose.yaml ранее проверенный тег или digest образа, снова выполните docker compose up -d и проверьте журнал. Старый образ не гарантирует совместимость с уже обновлёнными данными, поэтому резервная копия до обновления обязательна.

Если панель не открывается

Разделите проверку на три участка:

Симптом Что проверить
контейнер перезапускается docker compose logs portainer, свободное место и доступ к тому
на VPS не отвечает 127.0.0.1:9443 состояние контейнера и привязку порта в docker compose ps
на VPS отвечает, на компьютере нет SSH-туннель, локальный порт 9443 и адрес SSH-сервера
панель видна, Docker недоступен подключение /var/run/docker.sock и журнал Portainer
забыли пароль администратора следовать актуальной процедуре восстановления из официальной документации, сохранив копию данных

Не открывайте 9443 всему интернету только ради диагностики. Локальный запрос на VPS и SSH-туннель позволяют проверить тот же сервис, не создавая новый публичный вход.

Источники

Рекламное местоВаша компания здесьРазместить рекламу

Самопроверка

Проверьте, что материал усвоен

Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.

01Почему доступ Portainer к docker.sock считается привилегированным?
02Что нужно сохранить для восстановления настроек Portainer?

Разбираем коротко

Частые вопросы

Заменяет ли Portainer команды Docker и Docker Compose?

Нет. Portainer даёт графический интерфейс к Docker, но файлы Compose, резервные копии и базовые команды всё равно нужны для воспроизводимого восстановления и диагностики.

Можно ли открыть порт Portainer 9443 всему интернету?

Технически можно, но для обычного VPS лучше ограничить порт firewall, SSH-туннелем или внутренней сетью. Панель управляет контейнерами и поэтому требует более строгой защиты, чем публичный сайт.

Что хранится в томе portainer_data?

В нём находятся настройки Portainer, пользователи, подключения и другие данные самой панели. Содержимое контейнеров приложений хранится отдельно и не попадает в этот том автоматически.