Как установить Portainer на VPS и управлять Docker-контейнерами

Валерий Волков

Время прочтения 15 минут

Portainer — это веб-панель для управления Docker-контейнерами, образами, сетями, volumes и Docker Compose Stack без постоянной работы через командную строку. В этом руководстве Portainer будет установлен на VPS с Ubuntu, запущен в отдельном контейнере и подключён к локальному Docker Engine.

Для безопасного доступа к панели будет настроен отдельный домен, Nginx в роли reverse proxy и HTTPS-сертификат Let’s Encrypt. Административный интерфейс не потребуется публиковать напрямую в интернет через стандартный порт Portainer.

После установки через веб-интерфейс будут выполнены основные операции:

  • Запуск отдельного Docker-контейнера;
  • Развёртывание приложения как Docker Compose Stack;
  • Просмотр логов и перезапуск контейнеров;
  • Создание Docker-сети и Volume;
  • Обновление контейнеров и Stack;
  • Резервное копирование конфигурации Portainer;
  • Проверка автозапуска после перезагрузки VPS.

В результате получится защищённая панель управления Docker, доступная по адресу вида: https://portainer.example.com

Настройки Portainer будут храниться в отдельном Docker Volume, поэтому контейнер можно обновлять или пересоздавать без потери конфигурации.

Как работает Portainer

Portainer — это веб-интерфейс для управления Docker-средой. Он подключается к Docker Engine на сервере и позволяет выполнять основные операции с контейнерами, образами, сетями и volumes через браузер.

В этом руководстве Portainer будет запущен на том же VPS, где работает Docker. Доступ к панели будет организован через отдельный домен, Nginx и HTTPS. Сам административный интерфейс не потребуется публиковать напрямую через стандартный порт Portainer.

Какие задачи решает Portainer

Через Portainer можно:

  • Создавать, запускать, останавливать и перезапускать контейнеры;
  • Загружать Docker-образы и удалять неиспользуемые версии;
  • Просматривать логи и статистику контейнеров;
  • Создавать Docker-сети и подключать к ним сервисы;
  • Создавать и подключать volumes для постоянного хранения данных;
  • Разворачивать Docker Compose-конфигурации в виде Stack;
  • Обновлять и пересоздавать контейнеры;
  • Управлять несколькими Docker-окружениями из одной панели.

Portainer не заменяет Docker Engine. Он работает поверх Docker API и предоставляет графический интерфейс для тех же операций, которые можно выполнить командами docker и docker compose.

Схема Docker, Portainer, Nginx и HTTPS

В итоговой конфигурации компоненты будут взаимодействовать следующим образом:

  1. Docker Engine запускает Portainer и остальные контейнеры.
  2. Portainer подключается к локальному Docker Engine через сокет /var/run/docker.sock.
  3. Portainer принимает запросы только на локальном интерфейсе VPS.
  4. Nginx принимает внешние запросы по доменному имени и передаёт их Portainer.
  5. Certbot выпускает SSL-сертификат для домена.
  6. Пользователь открывает панель через защищённое HTTPS-соединение.

Схема будет выглядеть так:

Браузер

   │

   │ HTTPS

   ▼

Nginx

   │

   │ reverse proxy

   ▼

Portainer

   │

   │ Docker socket

   ▼

Docker Engine

   ├── Containers

   ├── Images

   ├── Networks

   ├── Volumes

   └── Stacks

Такой подход позволяет не открывать административный порт Portainer напрямую в интернет и использовать стандартные порты 80 и 443.

Подготовка VPS

Для установки понадобится VPS с Ubuntu, публичным IP-адресом и доступом по SSH. Для тестовой установки достаточно сервера с 2 vCPU, 2–4 ГБ оперативной памяти и диском от 20 ГБ.

Также заранее понадобятся:

  • Домен или поддомен;
  • SSH-ключ;
  • Открытые порты 22, 80 и 443;
  • Пользователь с правами sudo.

Далее можно переходить к созданию VM.

Создание виртуальной машины

Создайте новую виртуальную машину в облачной панели. В качестве операционной системы выберите Ubuntu 24.04 LTS.

Для тестовой конфигурации можно использовать:

  • Операционная система: Ubuntu 24.04 LTS
  • Процессор: 2 vCPU
  • Оперативная память: 4 ГБ
  • Диск: 20 ГБ

Подключите существующую сеть и security group. В правилах входящего трафика должны быть разрешены:

  • TCP 22 — SSH
  • TCP 80 — HTTP
  • TCP 443 — HTTPS

Порты Portainer 9000 и 9443 открывать в security group не требуется. Доступ к панели будет проходить через Nginx.

При создании VM выберите существующую SSH-пару ключей или создайте новую. Закрытый ключ необходимо сохранить на локальном компьютере.

Подключение публичного IP

После запуска VM подключите к ней Floating IP или другой публичный IPv4-адрес.

У виртуальной машины будет два адреса:

  • Приватный IP для работы внутри облачной сети;
  • Публичный IP для подключения по SSH и доступа к Portainer через домен.

Убедитесь, что VM находится в статусе Active, а публичный адрес отображается в панели управления.

Подключение по SSH и обновление Ubuntu

На Windows откройте командную строку или PowerShell и перейдите в каталог с закрытым SSH-ключом: cd C:\Users\Username\Downloads

Подключитесь к серверу: ssh -i .\portainer-guide.pem ubuntu@PUBLIC_IP

Замените portainer-guide.pem на имя своего ключа, а PUBLIC_IP — на публичный адрес VPS.

При первом подключении SSH покажет fingerprint сервера. После проверки подтвердите подключение: yes

Обновите индекс пакетов и установленные компоненты:

sudo apt update

sudo apt upgrade -y

Установите базовые пакеты: sudo apt install -y ca-certificates curl gnupg unzip ufw

После обновления сервер готов к установке Docker Engine и Portainer.

Установка Docker и Portainer

Portainer работает как Docker-контейнер, поэтому сначала на VPS нужно установить Docker Engine. Для управления Compose-конфигурациями также понадобится Docker Compose Plugin.

Установка Docker Engine и Compose Plugin

Добавьте официальный GPG-ключ Docker:

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \

  -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc

Создайте файл официального APT-репозитория:

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF

Types: deb

URIs: https://download.docker.com/linux/ubuntu

Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")

Components: stable

Architectures: $(dpkg --print-architecture)

Signed-By: /etc/apt/keyrings/docker.asc

EOF

Обновите индекс пакетов: sudo apt update

Установите Docker Engine, Docker CLI, containerd, Buildx и Compose Plugin:

sudo apt install -y \

  docker-ce \

  docker-ce-cli \

  containerd.io \

  docker-buildx-plugin \

  docker-compose-plugin

Это рекомендуемый способ установки Docker на Ubuntu: пакеты будут получены из официального репозитория и смогут обновляться через APT.

Включите Docker и добавьте сервис в автозапуск: sudo systemctl enable --now docker

Чтобы пользователь ubuntu мог выполнять Docker-команды без sudo, добавьте его в группу docker: sudo usermod -aG docker ubuntu

Выйдите из SSH-сессии: exit

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

docker --version

docker compose version

systemctl is-active docker

systemctl is-enabled docker

В выводе должны отображаться версии Docker и Docker Compose, а также статусы:

active

enabled

При необходимости дополнительно запустите тестовый контейнер: docker run --rm hello-world

Официальная документация Docker рекомендует использовать образ hello-world для проверки успешной установки движка.

Создание Volume и запуск Portainer

Настройки Portainer, учётные записи и сведения о подключённых окружениях должны храниться независимо от контейнера, чтобы они не удалялись при пересоздании и обновлении. Для этого создайте именованный Docker Volume: docker volume create portainer_data

Запустите Portainer Community Edition:

docker run -d \

  --name portainer \

  --restart=always \

  -p 127.0.0.1:9000:9000 \

  -v /var/run/docker.sock:/var/run/docker.sock \

  -v portainer_data:/data \

  portainer/portainer-ce:lts

В этой конфигурации:

  • /var/run/docker.sock предоставляет Portainer доступ к локальному Docker Engine;
  • portainer_data хранит постоянную конфигурацию панели;
  • --restart=always запускает контейнер повторно после перезагрузки VPS;
  • порт 9000 доступен только через 127.0.0.1 и не публикуется напрямую в интернет.

Современные версии Portainer используют HTTPS-порт 9443 по умолчанию, однако HTTP-порт 9000 можно включить для работы за reverse proxy. В данном руководстве внешнее TLS-соединение будет завершаться на Nginx, а его соединение с Portainer останется локальным.

Проверьте состояние контейнера: docker ps --filter name=portainer

Проверьте созданный Volume: docker volume ls --filter name=portainer_data

Убедитесь, что Portainer отвечает локально: curl -I http://127.0.0.1:9000

Ответ может содержать код 200, 301, 302 или 307 — главное, чтобы соединение устанавливалось и не возникала ошибка Connection refused.

Подключение домена и HTTPS

Панель можно открыть через локальный порт, но для постоянного использования лучше подключить отдельный поддомен и защитить соединение сертификатом Let’s Encrypt.

В примере будет использоваться адрес: portainer.example.com

Замените его своим доменом во всех командах и конфигурационных файлах.

Создание DNS-записи

В панели управления DNS создайте запись со следующими параметрами:

Type: A

Name: portainer

IPv4 address: PUBLIC_IP

TTL: Auto

Proxy status: DNS only

Вместо PUBLIC_IP укажите публичный IP-адрес VPS.

Если DNS обслуживается через Cloudflare, на время выпуска сертификата удобнее оставить режим DNS only. После сохранения записи проверьте её на локальном компьютере: nslookup portainer.example.com

В ответе должен отображаться публичный адрес VPS.

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

Настройка Nginx как reverse proxy

Установите Nginx: sudo apt install -y nginx

Включите сервис и добавьте его в автозапуск: sudo systemctl enable --now nginx

Создайте конфигурацию сайта: sudo nano /etc/nginx/sites-available/portainer

Добавьте следующий server block:

server {

    listen 80;

    listen [::]:80;

    server_name portainer.example.com;

    access_log /var/log/nginx/portainer_access.log;

    error_log /var/log/nginx/portainer_error.log;

    location / {

        proxy_pass http://127.0.0.1:9000;

        proxy_http_version 1.1;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600s;

        proxy_send_timeout 3600s;

        proxy_buffering off;

        client_max_body_size 0;

    }

}

Замените portainer.example.com своим поддоменом.

Portainer официально поддерживает работу за Nginx reverse proxy. Заголовки Upgrade и Connection нужны для корректной работы соединений, использующих WebSocket.

Активируйте конфигурацию:

sudo ln -s /etc/nginx/sites-available/portainer \

  /etc/nginx/sites-enabled/portainer

Удалите стандартный сайт Nginx: sudo rm -f /etc/nginx/sites-enabled/default

Проверьте синтаксис: sudo nginx -t

При успешной проверке появится:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Примените изменения: sudo systemctl reload nginx

Проверьте reverse proxy локально: curl -I -H "Host: portainer.example.com" http://127.0.0.1

После этого панель должна открываться по HTTP: http://portainer.example.com

Выпуск SSL-сертификата

Установите Certbot через Snap: sudo snap install --classic certbot

Создайте символическую ссылку: sudo ln -s /snap/bin/certbot /usr/local/bin/certbot

Если ссылка уже существует, команда может вернуть соответствующее предупреждение. В таком случае повторно создавать её не нужно.

Запустите выпуск сертификата: sudo certbot --nginx -d portainer.example.com

Certbot проверит домен, выпустит сертификат и автоматически внесёт HTTPS-настройки в конфигурацию Nginx. Официальные инструкции Certbot рекомендуют установку через Snap и поддерживают автоматическое изменение конфигурации Nginx через параметр --nginx.

Во время установки потребуется:

  1. Указать адрес электронной почты;
  2. Принять условия использования;
  3. Выбрать, нужно ли получать рассылку;
  4. Подтвердить перенаправление HTTP-запросов на HTTPS, если такой вопрос появится.

Проверьте конфигурацию после выпуска сертификата: sudo nginx -t

Проверьте тестовое автоматическое обновление: sudo certbot renew --dry-run

Certbot устанавливает механизм автоматического продления сертификатов, а команда renew --dry-run позволяет проверить его без реального обновления.

Откройте панель: https://portainer.example.com

В браузере не должно быть предупреждений о сертификате. На странице появится форма первоначальной настройки Portainer или входа в существующую учётную запись.

Первый вход и защита Portainer

После подключения домена откройте Portainer в браузере: https://portainer.example.com

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

Создание администратора

На странице первоначальной настройки укажите имя администратора и сложный пароль.

Рекомендуется использовать пароль длиной не менее 12–16 символов, включающий:

  • Буквы в разных регистрах;
  • Цифры;
  • Специальные символы;
  • Уникальную комбинацию, которая не используется в других сервисах.

Стандартное имя admin можно оставить, однако отдельное непредсказуемое имя пользователя дополнительно усложнит перебор учётных данных.

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

Подключение локального Docker Environment

Portainer, запущенный с подключением:

/var/run/docker.sock:/var/run/docker.sock

получает доступ к Docker Engine на том же VPS. Такое окружение обычно создаётся автоматически во время первоначальной настройки и отображается под именем local.

После входа откройте раздел Environments или главную страницу Home. В списке должно появиться локальное Docker-окружение со статусом Up.

Откройте его, чтобы перейти к управлению ресурсами сервера. В панели должны стать доступны разделы:

  • Containers;
  • Images;
  • Networks;
  • Volumes;
  • Stacks.

Portainer называет управляемый Docker-хост окружением — Environment. Помимо локального сервера, к одной панели можно подключать дополнительные Docker Standalone, Docker Swarm и другие поддерживаемые среды.

Если локальное окружение не появилось, проверьте, что Docker socket действительно подключён к контейнеру:

docker inspect portainer \

  --format '{{json .Mounts}}'

В выводе должны присутствовать:

/var/run/docker.sock

portainer_data

Также проверьте состояние контейнера:

docker ps --filter name=portainer

docker logs --tail=50 portainer

Далее поговорим о защите панели управления.

Как защитить панель управления

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

Для базовой защиты панели:

  • Используйте уникальный сложный пароль;
  • Оставляйте доступ только через HTTPS;
  • Не открывайте порты 9000 и 9443 во внешний интернет;
  • Своевременно обновляйте Portainer, Docker и Ubuntu;
  • Ограничьте доступ к панели по IP через firewall или Nginx, если она нужна только администраторам;
  • Оптимально - использовать VPN или настроить авторизацию на Nginx, например по сертификату (mtls);
  • Не передавайте обычным пользователям права глобального администратора;
  • Регулярно создавайте резервные копии portainer_data.

В текущей конфигурации порт 9000 привязан к 127.0.0.1, поэтому напрямую извне он недоступен. Внешние запросы принимает Nginx на порту 443 и передаёт их Portainer по локальному соединению.

При необходимости доступ можно дополнительно ограничить в server block Nginx:

allow 203.0.113.25;

deny all;

Здесь 203.0.113.25 нужно заменить публичным IP компьютера администратора. Такой способ подходит только при наличии у него постоянного IP-адреса.

Запуск контейнера через Portainer

Для проверки панели запустим через веб-интерфейс простой контейнер Nginx. Он будет отображать стандартную тестовую страницу и автоматически запускаться после перезагрузки Docker.

Создание и запуск тестового контейнера

Откройте локальное окружение и перейдите в раздел: Containers → Add container

Заполните основные поля:

Name: portainer-demo

Image: nginx:alpine

В блоке Network ports configuration нажмите Publish a new network port и укажите:

Host: 8080

Container: 80

Protocol: TCP

Portainer позволяет назначить порт автоматически или задать соответствие порта хоста и контейнера вручную.

Прокрутите страницу до блока Advanced container settings и откройте вкладку Restart policy. Выберите: Unless stopped

Эта политика перезапускает контейнер после сбоя и запуска Docker, кроме случая, когда администратор остановил его вручную.

Нажмите Deploy the container.

После запуска Portainer вернёт вас к списку контейнеров. У portainer-demo должны отображаться:

State: running

Image: nginx:alpine

Published ports: 0.0.0.0:8080 → 80/tcp

Для дополнительной проверки откройте: http://PUBLIC_IP:8080

Однако такой адрес заработает только при открытом порте 8080 в cloud firewall. Для самого руководства открывать этот порт необязательно: состояние контейнера можно проверить через Portainer или на VPS: curl -I http://127.0.0.1:8080

Ожидаемый ответ: HTTP/1.1 200 OK

Просмотр логов и перезапуск контейнера

В разделе Containers нажмите на имя portainer-demo, затем откройте Logs.

Portainer покажет стандартный вывод контейнера. Для Nginx записи появятся после обращения к его странице: curl http://127.0.0.1:8080 > /dev/null

Обновите журнал в Portainer. В нём должна появиться строка с HTTP-запросом и кодом ответа 200.

Portainer позволяет ограничивать количество отображаемых строк, включать автоматическое обновление и просматривать временные метки. Переход к журналу выполняется через Containers → имя контейнера → Logs.

Чтобы перезапустить контейнер, вернитесь к его странице и нажмите Restart. Эту же операцию можно выполнить из общего списка контейнеров, отметив нужный контейнер и выбрав соответствующее действие.

После перезапуска убедитесь, что состояние снова изменилось на: running

Проверить результат можно и через SSH: docker ps --filter name=portainer-demo

Для остановки используются кнопки Stop и Start. Удалять контейнер на этом этапе не нужно — он пригодится для дальнейшей демонстрации сетей и volumes.

Развёртывание Docker Compose Stack

В Portainer конфигурации Docker Compose разворачиваются в виде Stack. Stack объединяет связанные сервисы, сети и volumes в один управляемый объект. Его можно создать через веб-редактор, загрузить из файла или подключить к Git-репозиторию.

Создание Stack через Web Editor

Откройте локальное Docker-окружение и перейдите в раздел: Stacks → Add stack

Укажите имя: portainer-demo-stack

Выберите способ создания: Web editor

Вставьте в редактор следующую конфигурацию:

services:

  web:

    image: nginx:alpine

    container_name: stack-web

    restart: unless-stopped

    ports:

      - "127.0.0.1:8081:80"

    networks:

      - stack-network

  redis:

    image: redis:alpine

    container_name: stack-redis

    restart: unless-stopped

    volumes:

      - redis-data:/data

    networks:

      - stack-network

networks:

  stack-network:

    driver: bridge

volumes:

  redis-data:

Конфигурация создаёт:

  • Контейнер Nginx stack-web;
  • Контейнер Redis stack-redis;
  • Отдельную bridge-сеть;
  • Volume для данных Redis;
  • Локальный порт 8081 для проверки Nginx.

Порт привязан к 127.0.0.1, поэтому он не публикуется напрямую в интернет.

Нажмите: Deploy the stack

Portainer загрузит необходимые образы и создаст сервисы, сеть и Volume. После завершения откройте созданный Stack. Оба контейнера должны иметь статус running.

Проверить Nginx можно через SSH: curl -I http://127.0.0.1:8081

Ожидаемый ответ: HTTP/1.1 200 OK

Portainer поддерживает создание Stack через Web Editor, загрузку Compose-файла, Git-репозиторий и шаблон. Для текущего примера используется Web Editor, поскольку он позволяет вставить конфигурацию прямо в панели.

Изменение и повторное развёртывание Stack

Откройте: Stacks → portainer-demo-stack → Editor

Измените образ Nginx, например: image: nginx:stable-alpine

Либо добавьте переменную окружения для Redis:

environment:

  ALLOW_EMPTY_PASSWORD: "yes"

Для демонстрации безопаснее ограничиться заменой образа Nginx и не менять настройки Redis.

После изменения нажмите: Update the stack

Если Portainer предлагает повторно загрузить образы, включите опцию: Re-pull image

Portainer применит новую Compose-конфигурацию и при необходимости пересоздаст изменённые контейнеры. Раздел Editor доступен для Stack, созданных через Web Editor или загруженных из файла.

После обновления проверьте: docker ps --filter name=stack-

Также повторите запрос: curl -I http://127.0.0.1:8081

Если оба контейнера работают, повторное развёртывание прошло успешно.

Управление сетями и Volumes

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

Создание Docker-сети

Откройте локальное окружение и перейдите: Networks → Add network

Укажите:

Name: portainer-demo-network

Driver: bridge

Остальные сетевые параметры можно оставить пустыми. Docker автоматически назначит подсеть и шлюз.

Для возможности подключать к сети уже работающие контейнеры включите: Enable manual container attachment

Нажмите: Create the network

Portainer создаст пользовательскую bridge-сеть. Она появится в общем списке рядом со стандартными сетями bridge, host и none. При пустых настройках IPv4 Docker назначает диапазон адресов автоматически.

Чтобы подключить тестовый контейнер portainer-demo, откройте: Containers → portainer-demo → Duplicate/Edit

В разделе сетевых настроек выберите: portainer-demo-network

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

Проверить подключение через SSH можно командой: docker network inspect portainer-demo-network

В разделе Containers должен отображаться portainer-demo.

Не удаляйте сеть, пока к ней подключены контейнеры. Сначала отключите или пересоздайте связанные сервисы.

Создание и подключение Volume

Откройте: Volumes → Add volume

Укажите имя: portainer-demo-data

Для локального хранения оставьте стандартный драйвер: local

Нажмите: Create the volume

Portainer позволяет создавать volumes и затем подключать их к контейнерам для постоянного хранения данных.

Теперь откройте: Containers → portainer-demo → Duplicate/Edit

Перейдите во вкладку Volumes и нажмите: Map additional volume

Выберите созданный Volume: portainer-demo-data

В качестве пути внутри контейнера укажите: /usr/share/nginx/html

Однако пустой Volume перекроет стандартные файлы Nginx, поэтому перед его подключением лучше сначала создать в нём тестовую страницу через временный контейнер:

docker run --rm \

  -v portainer-demo-data:/data \

  alpine sh -c \

  'echo "<h1>Portainer Volume Demo</h1>" > /data/index.html'

После этого подключите Volume к контейнеру и подтвердите пересоздание.

Проверьте результат: curl http://127.0.0.1:8080

В ответе должно появиться: <h1>Portainer Volume Demo</h1>

Portainer подключает Volume к существующему контейнеру через операцию Duplicate/Edit, поскольку изменение mounts требует пересоздания контейнера.

Обновление контейнеров

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

Перед обновлением проверьте документацию образа, список изменений и совместимость новой версии. Для сервисов с постоянными данными также рекомендуется заранее создать резервную копию.

Загрузка новой версии образа

Откройте локальное окружение и перейдите в раздел: Images

В поле образа укажите нужный репозиторий и тег. Например: nginx:stable-alpine

Нажмите: Pull the image

Portainer загрузит образ из Docker Hub или другого подключённого registry. Новый образ появится в списке Images, но уже работающий контейнер продолжит использовать прежнюю версию до пересоздания.

Не рекомендуется без проверки заменять фиксированный тег на latest: содержимое такого тега может меняться, из-за чего повторное развёртывание становится менее предсказуемым.

Пересоздание контейнера без потери данных

Откройте: Containers → portainer-demo → Duplicate/Edit

В поле Image укажите новый образ: nginx:stable-alpine

Проверьте, что сохранились:

  • опубликованный порт 8080;
  • restart policy Unless stopped;
  • сеть portainer-demo-network;
  • подключение portainer-demo-data к /usr/share/nginx/html.

Нажмите: Deploy the container

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

При пересоздании удаляется старый контейнер, но именованный Volume остаётся на сервере. Поэтому страница Portainer Volume Demo, сохранённая в portainer-demo-data, не должна исчезнуть.

Проверьте результат: curl http://127.0.0.1:8080

Также можно посмотреть используемый образ:

docker inspect portainer-demo \

  --format '{{.Config.Image}}'

Ожидаемый результат: nginx:stable-alpine

Сохранность данных зависит именно от Volume или bind mount. Данные, записанные только во внутренний слой контейнера, при его удалении будут потеряны.

Обновление Docker Compose Stack

Откройте: Stacks → portainer-demo-stack → Editor

Измените тег нужного образа. Например:

services:

  web:

    image: nginx:stable-alpine

Перед обновлением проверьте, что раздел volumes остался в конфигурации:

services:

  redis:

    volumes:

      - redis-data:/data

volumes:

  redis-data:

Нажмите: Update the stack

Для принудительной загрузки актуальных образов включите опцию Re-pull image. Она заставляет Portainer повторно получить образы перед развёртыванием Stack.

После обновления проверьте состояние сервисов: docker ps --filter name=stack-

И доступность тестового Nginx: curl -I http://127.0.0.1:8081

Именованный Volume redis-data не удаляется при обычном обновлении Stack, поэтому данные Redis сохраняются. Однако перед крупным обновлением приложения или базы данных нужно отдельно изучить требования к миграции.

Резервное копирование Portainer

Portainer хранит собственную конфигурацию в каталоге /data, который в этом руководстве подключён к именованному Volume portainer_data.

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

Что нужно сохранить

Резервная копия Portainer включает его внутреннюю базу данных и конфигурацию, в том числе:

  • Пользователей и настройки доступа;
  • Подключённые environments;
  • Параметры registries;
  • Конфигурацию панели;
  • Определения Stack, созданных через Portainer;
  • Связанные метаданные и настройки.

При этом такой архив не содержит сами Docker-контейнеры, образы и пользовательские данные из volumes или bind mounts. Их нужно резервировать отдельно.

Создание резервной копии конфигурации

Войдите в Portainer с правами администратора и откройте: Settings

Прокрутите страницу до раздела: Back up Portainer

Оставьте вариант: Download backup file

При необходимости включите: Password protect

Укажите сложный пароль и сохраните его в надёжном месте. Без этого пароля зашифрованный архив восстановить не получится.

Нажмите: Download backup

Браузер скачает архив в формате .tar.gz. Он содержит данные, которые Portainer хранит в /data.

Сохраните копию архива вне VPS, например в защищённом облачном хранилище или на локальном накопителе. Если резервная копия остаётся только на том же сервере, она не поможет при удалении VM или повреждении диска.

Восстановление конфигурации

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

Для восстановления остановите и удалите текущий контейнер:

docker stop portainer

docker rm portainer

Старый Volume пока не удаляйте. Создайте новый пустой Volume: docker volume create portainer_restore

Запустите временный экземпляр Portainer:

docker run -d \

  --name portainer-restore \

  --restart=always \

  -p 127.0.0.1:9001:9000 \

  -v /var/run/docker.sock:/var/run/docker.sock \

  -v portainer_restore:/data \

  portainer/portainer-ce:lts

Чтобы открыть его через существующий домен, временно измените proxy_pass в конфигурации Nginx: proxy_pass http://127.0.0.1:9001;

Проверьте и примените конфигурацию:

sudo nginx -t

sudo systemctl reload nginx

Откройте домен Portainer. На странице первоначальной настройки раскройте: Restore Portainer from backup

Выберите скачанный файл .tar.gz, укажите пароль, если архив был защищён, и запустите восстановление. После завершения откроется страница входа, а прежние пользователи и настройки будут возвращены.

Проверка после перезагрузки VPS

Финальная проверка нужна, чтобы убедиться, что Docker, Nginx и Portainer автоматически запускаются вместе с сервером, а панель остаётся доступной по HTTPS.

Первым делом перезагрузите VPS: sudo reboot

SSH-соединение будет закрыто автоматически. Подождите около минуты и подключитесь снова: ssh -i .\portainer-guide.pem ubuntu@PUBLIC_IP

Проверьте состояние Docker:

systemctl is-active docker

systemctl is-enabled docker

Ожидаемый результат:

active

enabled

Проверьте Nginx:

systemctl is-active nginx

systemctl is-enabled nginx

Сервис также должен находиться в состояниях:

active

enabled

Проверьте контейнер Portainer: docker ps --filter name=portainer

В столбце STATUS должно отображаться состояние Up.

Для компактного вывода выполните:

printf "docker: "

systemctl is-active docker

printf "nginx: "

systemctl is-active nginx

docker ps --filter name=portainer \

  --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

В результате должны быть видны активные сервисы Docker и Nginx, а также работающий контейнер portainer.

После этого откройте в браузере: https://portainer.example.com

Войдите в учётную запись и убедитесь, что:

  • Локальное Docker Environment имеет статус Up;
  • Тестовый контейнер работает;
  • Docker Compose Stack отображается в списке;
  • Созданные сеть и volumes сохранились;
  • Панель открывается без предупреждений о сертификате.

Если Portainer не запустился, проверьте его restart policy:

docker inspect portainer \

  --format '{{.HostConfig.RestartPolicy.Name}}'

Ожидаемый результат: always

Журнал контейнера можно посмотреть командой: docker logs --tail=100 portainer

Заключение

Portainer упрощает повседневное управление Docker на VPS и позволяет выполнять основные операции через веб-интерфейс. После установки администратор может запускать и перезапускать контейнеры, просматривать логи, управлять сетями и volumes, а также разворачивать приложения в виде Docker Compose Stack.

В рассмотренной конфигурации Portainer работает в отдельном контейнере и подключается к локальному Docker Engine через Docker socket. Настройки панели сохраняются в именованном Volume portainer_data, поэтому контейнер можно пересоздавать и обновлять без потери конфигурации.

Доступ к панели организован через отдельный домен, Nginx и сертификат Let’s Encrypt. Порт Portainer не публикуется напрямую в интернет: внешние HTTPS-запросы принимает Nginx и передаёт их панели по локальному соединению.

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

FAQ

Можно ли использовать Portainer без домена

Да. Portainer можно открыть напрямую по IP-адресу VPS и опубликованному порту, например: https://PUBLIC_IP:9443

По умолчанию Portainer использует HTTPS на порту 9443 и создаёт самоподписанный сертификат. Из-за этого браузер может показывать предупреждение о недоверенном сертификате. Для постоянной эксплуатации удобнее подключить домен и использовать сертификат Let’s Encrypt через Nginx.

Где Portainer хранит настройки

Portainer хранит свою базу данных и конфигурацию в каталоге /data внутри контейнера. В этом руководстве он подключён к именованному Docker Volume: portainer_data:/data

Благодаря этому настройки сохраняются после остановки, удаления или обновления контейнера Portainer. Встроенная резервная копия также создаётся из содержимого /data.

Как обновить Portainer без потери данных

Перед обновлением рекомендуется создать резервную копию конфигурации. Затем нужно остановить и удалить старый контейнер, загрузить новый образ и запустить Portainer повторно с тем же Volume portainer_data.

Пример:

docker stop portainer

docker rm portainer

docker pull portainer/portainer-ce:lts

После этого контейнер запускают заново с прежним подключением: -v portainer_data:/data

Пока Volume не удалён, Portainer использует сохранённую конфигурацию и обновляет внутреннюю базу данных при запуске новой версии.

Можно ли установить Nginx тоже в контейнер

Да, такая конфигурация возможна и поддерживается, более того, это может быть удобно при публикации приложений по https - чтобы не менять порты, а использовать стандартный 443. Наша схема развёртывания с Nginx на хосте - для примера и упрощения настроек.

Как можно защитить Portainer

Давать доступ к админке для всего интернета действительно не очень безопасно, даже при использовании доменного имени (которое злоумышленнику надо будет знать). Можно использовать, помимо нестандартного порта в Nginx:

  1. Ограничение по IP - через Nginx, фаервол на VPS или Security Groups в облаке;
  2. Аутентификацию на Nginx - это может быть как дополнительный логин\пароль, так и авторизация по клиентскому сертификату;
  3. VPN, желательно с двухфакторной аутентификацией, как подвариант - ssh-туннелирование;
  4. Fail2ban, в качестве защиты от брутфорса.

И, конечно же, сложный пароль от административной учётной записи.

Чем Stack отличается от обычного контейнера

Обычный контейнер представляет собой один экземпляр приложения, созданный из Docker-образа. Stack разворачивается из Docker Compose-конфигурации и может включать сразу несколько связанных сервисов, сетей, volumes, портов и переменных окружения.

Например, один Stack может одновременно создать веб-приложение, базу данных, Redis, общую сеть и постоянные volumes. Все компоненты такого приложения затем управляются как единая конфигурация.

Можно ли управлять несколькими VPS

Да. Один экземпляр Portainer может управлять несколькими окружениями. К нему можно подключать дополнительные Docker Standalone, Docker Swarm, Kubernetes и другие поддерживаемые среды.

Для подключения удалённых VPS обычно используют Portainer Agent, Edge Agent либо защищённое подключение к Docker API. После добавления серверы отображаются в разделе Environments, а доступ к ним можно разграничивать между пользователями и группами.

Список источников

  1. Portainer Documentation — Install Portainer CE with Docker on Linux
  2. Portainer Documentation — Updating on Docker Standalone
  3. Portainer Documentation — General settings and backups
  4. Portainer Documentation — Add a new environment

Подпишитесь на нашу рассылку и получайте статьи и новости

    Ознакомьтесь с другими нашими материалами