UCS - коллекция мануалов

Практика - критерий истины...

Инструменты пользователя

Инструменты сайта


linux:docker:portainer

Это старая версия документа!


Быстрое развёртывание Portainer на своем linux-сервере

Что такое Portainer и с чем его едят?

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

Основные возможности

  • Управление контейнерами: Запуск, остановка, перезапуск, просмотр логов, удаление. Можно быстро менять политику рестарта .
  • Работа с образами: Скачивание новых образов, удаление старых, просмотр их размера и тегов.
  • Управление сетями и томами: Создание, удаление и настройка сетей (bridge, host) и томов для постоянного хранения данных.
  • Стеки (Stacks): Полноценная поддержка docker-compose. Можно развернуть целый проект из одного YAML-файла и управлять им как единым целым .
  • Мониторинг: Просмотр состояния всех сервисов, использования ресурсов (ЦП, память) и времени работы.

Способы установки

Внимание!!! Если вы тупой или очень ленивый, чтобы читать всю эту нудятину статью и вам нужна лишь быстрая инструкция, то вам надо жмакнуть сюда, там есть все, что вам необходимо. Берите и валите нафиг, как это сказано в S.T.A.L.K.E.R. - проходи, не задерживайся! 🤣

🐳 Установка на Docker

Это самый распространенный сценарий для одиночного хоста. Portainer Server и Portainer Agent запускаются как обычные Docker-контейнеры.

docker run (простой и быстрый):
Сначала создается том для данных, затем запускается контейнер.

docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts

Где:

  • 9443 — порт для защищенного веб-интерфейса (HTTPS) .
  • 8000 — опциональный порт для Edge-агентов .
  • 9000 — устаревший порт для HTTP-доступа .

Docker Compose (для удобства управления и не менее быстрый):
Конфигурация описывается в YAML-файле, что упрощает обновление и хранение настроек.

services:
  portainer:
    container_name: portainer
    image: portainer/portainer-ce:lts
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    ports:
      - 9443:9443
      - 8000:8000
volumes:
  portainer_data:
    name: portainer_data

Запуск: docker compose up -d.

Развернуть за обратным прокси (Nginx, Traefik):
Portainer можно развернуть за реверс-прокси для организации доступа через домен и централизованного управления SSL-сертификатами. В документации есть готовые примеры с использованием docker-compose для связки с Nginx и Traefik .

🐳 Установка в Docker Swarm

Для кластера Swarm используется стек (stack). Метод автоматически разворачивает Portainer Server (реплика) и Portainer Agent (глобальный сервис на каждой ноде).

curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml
docker stack deploy -c portainer-agent-stack.yml portainer

По умолчанию UI будет доступен на порту 9443.

☸️ Установка в Kubernetes

Portainer разворачивается в кластере Kubernetes через Helm-чарты или готовые YAML-манифесты.
Предварительное условие: Кластер должен иметь StorageClass для хранения данных Portainer (по умолчанию или заданный явно).
Способы доступа: Можно настроить через NodePort (порты 30777/30779), LoadBalancer (порты 9000/9443) или Ingress.

Способ через Helm (пример):

helm repo add portainer https://portainer.github.io/k8s/
helm repo update
helm upgrade --install --create-namespace -n portainer portainer portainer/portainer \
    --set service.type=LoadBalancer \
    --set tls.force=true

Этот пример разворачивает Portainer с доступом через LoadBalancer на порту 9443 .

🔧 Особенности и зависимости

Независимо от способа установки, у Portainer есть несколько общих требований:

  • Сохранение данных: Обязательно требуется персистентное хранилище для базы данных и конфигурации (portainer_data том для Docker, PersistentVolumeClaim для Kubernetes).
  • Доступ к API: Для управления контейнерами Portainer подключается к Docker API через сокет (/var/run/docker.sock).
  • Порты: Основной порт для защищенного интерфейса — 9443 (HTTPS). Порт 8000 нужен только для Edge-функций.

Как это сделано у меня

Здесь показан способ, как за 10-15 минут развернуть Portainer, не думая, как это работает, тупо копипастите что надо и все готово! 😄
Необходимые условия:

  • У вас на сервере уже «поднят» и настроен NGINX и certbot, а также - docker.io, docker-buildx, docker-compose-v2
  • У вас есть доступ к панели регистратора и собственно арендован домен.
  • Вы не настолько тупы, чтобы не понять эту инструкцию…

Итак:

  • Идем в веб-панель вашего регистратора и создаем A-запись для поддомена, на котором будет доступен Portainer, например pm.example.tld (далее во всех конфигах будет фигурировать он)
  • Ждем, пока отрезолвятся DNS, у кого-то это происходит быстро, у кого-то медленно, проверить можно командой dig A pm.example.tld.
  • Как поддомен стал доступным, запрашиваем сертификат (в примере у LetsEncrypt):
certbot certonly --nginx -d pm.example.tld

Именно этот этап может быть самым затяжным, если DNS-записи резолвятся долго… Затем создаем рабочий каталог для Portainer. Заходим в него:

mkdir -p docker/portainer && cd docker/portainer

Я не помню, почему я вложил его в docker, возможно хотел там размещать все остальные докеры. 😄 История умалчивает об этом… 🤣
Создаем docker-compose.yml:

nano docker-compose.yml

Вставляем это содержимое:

services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: always
    ports:
      - "8000:8000"
      - "9080:9000"
      - "9443:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - portainer_data:/data
    networks:
      - portainer_net

networks:
  portainer_net:
    driver: bridge

volumes:
  portainer_data:
    external: true

Управляем сервисом в этой же директории:

  • запуск в режиме демона:

docker compose up -d

  • остановка сервиса:

docker compose down

  • обновление Portainer до последней версии:

docker compose down
docker compose pull
docker compose up -d

Создаем vhost (виртуальный хост) для nginx:

nano /etc/nginx/sites-available/pm.example.tld.vhost
server {
        listen 80;
        server_name     pm.example.tld;
        location / {
                proxy_pass http://127.0.0.1:9080;
                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;
        }
        return 301 https://$server_name$request_uri;
}
 
server {
		listen 443 quic;
		listen 443 ssl;
		http3 on;
		http2 on;
		quic_retry on;
		quic_gso on;
		add_header alt-svc 'h3=":443"; ma=864000; persist=1' always;
 
		server_name     pm.example.tld;
 
        ssl_certificate /etc/letsencrypt/live/pm.example.tld/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/pm.example.tld/privkey.pem;
 
		ssl_protocols TLSv1.2 TLSv1.3;
		ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
		ssl_ecdh_curve X25519:prime256v1:secp384r1;
		ssl_prefer_server_ciphers on;
		ssl_dhparam /etc/ssl/dhparam.pem;
		ssl_session_timeout 1d;
		ssl_session_cache builtin:1000 shared:MozSSL:10m;
		ssl_session_tickets off;
		ssl_early_data on;
		resolver 8.8.8.8 1.1.1.1 valid=300s;
 
		add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
		add_header X-Content-Type-Options "nosniff" always;
		add_header X-Frame-Options "SAMEORIGIN";
		add_header X-XSS-Protection "1; mode=block";
		add_header Referrer-Policy "strict-origin-when-cross-origin";
 
        access_log  /var/log/nginx/pm.example.tld_access.log combined;
        error_log /var/log/nginx/pm.example.tld_error.log info;
 
        location / {
                proxy_pass https://127.0.0.1:9443;
                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;
        }
 
}

Создаем симлинк в vhost для его «активации»:

ln -s /etc/nginx/sites-available/pm.example.tld.vhost /etc/nginx/sites-enabled/pm.example.tld.vhost

Проверяем, не напороли ли где-то в конфиге косяков:

nginx -t

Если все ОК, то перезагружаем NGINX:

systemctl restart nginx.service

При первом посещении страницы Portainer будет предложено создать аккаунт администратора,
Поэтому:

  • либо не щёлкайте таблом и успевайте это сделать раньше скан-ботов,
  • либо первое посещение осуществляйте до создания веб-ресурса по внутренней сети, если у вас есть такая возможность.

Надеюсь, вам не надо напоминать, что создание и использование логин-пары типа «root-qwerty» или «user-1234567890» карается виртуально-анальным фистингом и если вы так и сделали, то вы ССЗБ, каких свет не еще видел… В таком случае просто расслабьтесь и получайте удовольствие, IT точно не для вас.🤣

linux/docker/portainer.1785449244.txt.gz · Последнее изменение: Luciferus