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
В итоговой конфигурации компоненты будут взаимодействовать следующим образом:
- Docker Engine запускает Portainer и остальные контейнеры.
- Portainer подключается к локальному Docker Engine через сокет /var/run/docker.sock.
- Portainer принимает запросы только на локальном интерфейсе VPS.
- Nginx принимает внешние запросы по доменному имени и передаёт их Portainer.
- Certbot выпускает SSL-сертификат для домена.
- Пользователь открывает панель через защищённое 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.
Во время установки потребуется:
- Указать адрес электронной почты;
- Принять условия использования;
- Выбрать, нужно ли получать рассылку;
- Подтвердить перенаправление 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:
- Ограничение по IP - через Nginx, фаервол на VPS или Security Groups в облаке;
- Аутентификацию на Nginx - это может быть как дополнительный логин\пароль, так и авторизация по клиентскому сертификату;
- VPN, желательно с двухфакторной аутентификацией, как подвариант - ssh-туннелирование;
- 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, а доступ к ним можно разграничивать между пользователями и группами.


