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

Нельзя просто так взять и управлять 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:
- Прямое подключение к Docker API по TCP.
- Использование 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‑канале «Код на салфетке» мы разыгрываем девять книг по программированию! У вас ещё есть время поучаствовать:
Все статьи