Cat

Один Portainer, чтоб править всеми

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

Все статьи

Icon Link

Реклама

Icon Link
Применение Docker proDream 03 Июль 2025 Просмотров: 11

Нельзя просто так взять и управлять Docker’ами с разных VPS… или всё-таки можно?

В прошлой статье «Быстрый деплой бота (и не только) на Docker‑хостинге с Portainer» я рассказал о том, как легко развернуть приложение на DockerHosting.ru с предустановленным Portainer без необходимости подключаться к серверу по SSH. Но тот материал касался только управления контейнерами на одном сервере.

А что если у вас несколько VPS и вы хотите централизованно управлять всеми Docker-хостами из одного интерфейса? Portainer поддерживает добавление сторонних Docker‑движков, и это открывает широкие возможности для администрирования сразу нескольких серверов в единой панели.


 

Розыгрыш книг по программированию

Нашему Telegram‑каналу «Код на салфетке» недавно исполнилось два года! В честь этого мы разыгрываем девять книг по программированию среди подписчиков.

До окончания конкурса осталось менее двух дней, поэтому не откладывайте участие на потом!

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


 

Portainer и способы подключения внешних Docker‑хостов

Portainer позволяет добавлять в свою панель не только локальный Docker‑демон, но и удалённые Docker‑хосты. Способы интеграции бывают разные — часть из них предназначена для Docker Swarm, Kubernetes или Podman, но мы рассмотрим лишь два метода, актуальных для классического Docker и Docker Compose:

  1. Прямое подключение к Docker API по TCP.
  2. Использование Portainer Agent.

Разберём каждый метод подробнее.

 

1. Подключение по Docker API

При таком подходе Portainer напрямую обращается к Docker‑демону на удалённом сервере через HTTP(S). Docker‑демон должен слушать TCP‑порт 2375 (без TLS) или 2376 (с TLS), а Portainer при добавлении эндпоинта указывает соответствующий адрес.

Настройка на хосте

Откройте файл конфигурации Docker‑демона:

sudo nano /etc/docker/daemon.json

Добавьте блок hosts:

Без TLS (все запросы открыты):

{
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2375"
  ]
}

С TLS (шифрование трафика):

{
  "tlsverify": true,
  "tlscacert": "/path/to/ca.pem",
  "tlscert":   "/path/to/server-cert.pem",
  "tlskey":    "/path/to/server-key.pem",
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2376"
  ]
}

Перезапустите Docker:

sudo systemctl restart docker

🔒 Важно: если вы отключаете TLS‑шифрование, обязательно настройте firewall так, чтобы доступ к порту был только с доверенных IP‑адресов. Иначе любой сможет управлять вашим Docker.

Плюсы и минусы

ПлюсыМинусы
• Не требуется дополнительное ПО на хосте — только сам Docker‑демон.• Настройка TLS и ротация сертификатов добавляют сложность.
• Прямой “родной” API‑доступ без прокси.• Без надёжного шифрования и firewall уязвимость для посторонних.

 

2. Portainer Agent

Portainer Agent — это лёгковесный прокси‑контейнер, который устанавливается на каждом Docker‑хосте. Agent принимает команды от Portainer, выполняет их через локальный сокет Docker и возвращает результат.

Установка агента

docker run -d \
  -p 9001:9001 \
  --name portainer_agent \
  --restart=always \
  -e AGENT_SECRET=mysecrettoken \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/docker/volumes:/var/lib/docker/volumes \
  -v /:/host \
  portainer/agent:2.27.8
  • -p 9001:9001 — порт для приёма команд от Portainer.
  • AGENT_SECRET — (рекомендуется) секретная фраза для аутентификации агента.

⚠️ Если не указать AGENT_SECRET, агент “доверит” первому подключившемуся Portainer, что может привести к несанкционированному доступу.

Для дополнительной безопасности можно настроить обратный прокси (NGINX, Caddy) с TLS‑шифрованием, чтобы весь трафик шёл через HTTPS.

Плюсы и минусы

ПлюсыМинусы
• Простая установка: не нужно редактировать daemon.json.• Без AGENT_SECRET, TLS и ACL подвержен “первому подключившемуся”.
• Централизованное управление десятками хостов из одного Portainer.• Понадобятся дополнительные меры безопасности: прокси, ACL, секрет.
• Поддержка host‑фич (FS‑патч, устройства и т. д.). 

 

Обновление Portainer и настройка AGENT_SECRET

Как мы уже упоминали, для безопасного взаимодействия Portainer с агентом требуется задать переменную окружения AGENT_SECRET и на стороне агента, и в самом Portainer. Сделать это через веб‑GUI Portainer нельзя — придётся перезапустить контейнер с нужным параметром.

DockerHosting.ru, помимо предустановленного Portainer, предоставляет также и SSH-доступ к серверу. Это поможет нам обновить Portainer до более новой версии, а также добавить ключ AGENT_SECRET.

 

Шаг 1. Подключаемся по SSH

ssh root@<IP_адрес>

📋 Пароль пользователя root можно найти в личном кабинете DockerHosting.ru.

 

Шаг 2. Останавливаем и удаляем старый контейнер

docker rm -f portainer

💾 Данные Portainer (базу, настройки и стенд) мы храним в Docker‑volumes portainer_data, поэтому они сохранятся при удалении контейнера.

 

Шаг 3. Скачиваем последнюю LTS‑сборку

docker pull portainer/portainer-ce:lts

 

Шаг 4. Запускаем новый контейнер с AGENT_SECRET

docker run -d \
  --name portainer \
  --restart=always \
  -p 9000:9000 \
  -e AGENT_SECRET=<ваш_секрет_агента> \
  -v portainer_data:/data \
  -v /var/run/docker.sock:/var/run/docker.sock \
  portainer/portainer-ce:lts
  • Замените <ваш_секрет_агента> на ваш секретный ключ.

🔑 Важно: надёжно сохраните секретный ключ: он понадобится при добавлении новых агентов или восстановлении Portainer.

 

Шаг 5. Проверяем работу

Откройте в браузере:

https://<IP_адрес_сервера>:9000

Должна отобразиться главная страница Portainer:


 

Запуск Portainer Agent на новом хосте

Теперь давайте установим Portainer Agent на другой сервер и подключим его к уже запущенному Portainer.

Подключаемся по SSH к целевому хосту:

ssh root@<IP_адрес_агента>

Запускаем контейнер‑агент:

docker run -d \
  --name portainer_agent \
  --restart=always \
  -p 9001:9001 \
  -e AGENT_SECRET=<ваш_секрет_из_Portainer> \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/docker/volumes:/var/lib/docker/volumes \
  -v /:/host \
  portainer/agent:2.27.8
  • -p 9001:9001 — порт, на котором Agent слушает команды от Portainer.
  • AGENT_SECRET должен совпадать с тем, что вы указали при запуске основного Portainer.

Рекомендации по безопасности и доступности

  • Меняем внешний порт. 
    Стандартный порт 9001 легко обнаружить при сканировании сети, поэтому лучше пробросить его на более высокий и нестандартный, например: -p 15519:9001 (любой порт в диапазоне 5000–65535).
  • Открываем порт в фаерволе. 
    Если вы используете ufw, выполните: ufw allow 15519/tcp или, при использовании исходного порта: ufw allow 9001/tcp
  • Проверяем логи агента: docker logs -f portainer_agent.

 

Добавление агента в Portainer

Осталось зарегистрировать новый агент в вашем Portainer. Следуйте инструкции:

Переходим в раздел Environments

На боковой панели слева выберите пункт Environment‑related, а затем – Environments.

Создаём новое окружение 
На на открывшейся странице отображаются добавленные Docker-хосты (окружения). По умолчанию доступен только локальный Docker.

Нажмите Add environment:

Выбираем тип подключения

Поскольку мы используем Agent, кликните по карточке Docker Standalone, затем нажмите Start Wizard.

Заполняем параметры мастера

  • Name – произвольное название: рекомендуем указывать имя хоста или роль (например, prod-db1 или staging-app).
  • Environment address – адрес агента <IP_адрес_агента>:<порт> (например, 192.168.0.100:15519).

Подключаем агент

Нажмите Connect. При успешном соединении в правой части экрана появится карточка нового окружения:

Проверяем статус

Вернитесь на главную страницу — все добавленные хосты (локальный Docker и удалённые агенты) будут отображаться в виде единой панели:


 

Добавление через Docker API

Отличия с предыдущим в четвёртом пункте. Вместо Agent выбираем API:

Тут необходимо указать имя, адрес сервера в виде <ip>:<port> и прикрепить файлы сертификатов.

Если вы настроили проксирование Docker API через обратный прокси (NGINX, Caddy), можно отметить Skip Certification Verification, для игнорирования проверки сертификата.

В остальном всё идентично с настройков агента.


 

Что это даёт?

Объединив несколько Docker‑хостов в одном Portainer, вы получаете единый центр управления, где видно:

Все контейнеры и стеки

В списке отображаются не только запущенные контейнеры, но и Docker Compose‑стэки. Это позволяет сразу увидеть, какие сервисы входят в каждый проект, и получить к ним быстрый доступ.

Управление без SSH

Все основные действия (запуск, остановка, перезапуск контейнеров и стэков) выполняются через веб‑интерфейс — не нужно переключаться в терминал или подключаться к каждому серверу вручную.

Просмотр логов и метрик

Можно оперативно посмотреть логи контейнера или вывести текущие метрики (CPU, память, I/O) прямо в Portainer. Это ускоряет диагностику и позволяет находить узкие места без дополнительных инструментов.

Гибкая группировка и фильтры

Разделяйте хосты по тегам (например, prod, staging, dev) или по географии, чтобы сразу видеть состояние нужного окружения и быстро переключаться между ними.

Единая система доступа

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


 

Заключение

Единая панель управления несколькими Docker‑хостами через Portainer значительно упрощает повседневные задачи. Теперь вам не нужно держать открытыми десятки терминалов, чтобы:

  • просмотреть логи на удалённых серверах;
  • перезапустить контейнер или стек;
  • обновить образы и стеки.

Всё это доступно в одном интуитивном GUI, где вы видите текущее состояние контейнеров, стэков и самих хостов, а благодаря ролям и тегам можно гибко настраивать доступ и группировать окружения.

Кроме того, Portainer предлагает собственный REST‑API, которым можно управлять через скрипты и интегрировать в CI/CD‑пайплайны. Об этом я расскажу в следующей статье — будет интересно узнать, как автоматизировать деплой в связке с Portainer.

Не забывайте про наш конкурс: в Telegram‑канале «Код на салфетке» мы разыгрываем девять книг по программированию! У вас ещё есть время поучаствовать:

Присоединяйтесь к розыгрышу!

Автор

    Нет комментариев

    Реклама