Portainer — zarządzanie kontenerami Docker przez przeglądarkę
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS
Docker przez terminal jest potężny, ale zarządzanie dziesiątkami kontenerów na kilku serwerach za pomocą samych komend szybko staje się kłopotliwe. Portainer CE rozwiązuje ten problem: to open-source'owy panel webowy, który daje graficzny interfejs do całego ekosystemu Dockera — kontenerów, obrazów, sieci, woluminów, logów i Stacks (Docker Compose). Działa jako kontener, jest lekki (poniżej 100 MB RAM) i obsługuje zarówno lokalne, jak i zdalne Docker hosty przez Portainer Agent. Ten artykuł pokazuje instalację, najważniejsze funkcje i jak bezpiecznie wystawić Portainera w produkcji.
Instalacja Portainer CE przez Docker
Portainer wymaga tylko działającego Dockera. Instalacja zajmuje minutę — uruchamiasz jeden kontener, który sam zarządza pozostałymi. Dane konfiguracji przechowywane są w nazwanym woluminie, więc przeżyją restarty i aktualizacje Portainera.
# Utwórz wolumin na dane Portainera (trwałe storage) docker volume create portainer_data # Uruchom Portainer CE (wersja 2.x) docker run -d \ --name portainer \ --restart=always \ -p 9443:9443 \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest # Sprawdz status docker ps --filter name=portainer # Portainer dostepny pod: # https://IP_SERWERA:9443 (HTTPS, self-signed cert) # http://IP_SERWERA:9000 (HTTP, tylko dla dev/LAN)
Przy pierwszym wejściu Portainer poprosi o ustawienie hasła administratora (minimum 12
znaków). Następnie wybierasz środowisko — opcja "Get Started" automatycznie podłącza lokalny
Docker przez zamontowany socket /var/run/docker.sock. Interfejs jest od razu
gotowy do pracy.
Podstawowe operacje: kontenery, obrazy, logi
Panel Containers pokazuje wszystkie kontenery (uruchomione i zatrzymane) z informacją o statusie, użyciu CPU/RAM i portach. Dla każdego kontenera dostępne są akcje: Start, Stop, Restart, Kill, Pause, a także podgląd logów w czasie rzeczywistym, terminal (exec) i inspekcja konfiguracji.
| Sekcja | Co można zrobić | Odpowiednik CLI |
|---|---|---|
| Containers | Start/Stop/Restart, logi, exec terminal, stats CPU/RAM | docker ps, logs, exec, stats |
| Images | Pull, usuwanie nieużywanych, tagowanie, push do registry | docker pull, rmi, tag, push |
| Networks | Tworzenie sieci (bridge/overlay), podłączanie kontenerów | docker network create/connect |
| Volumes | Tworzenie, inspekcja, usuwanie nieużywanych | docker volume create/prune |
| Stacks | Deploy z YAML (Docker Compose), aktualizacja, rollback | docker compose up/down |
| Registries | Dodawanie prywatnych registry (Docker Hub, GHCR, Harbor) | docker login |
| Events | Historia zdarzeń Docker Engine (start, stop, pull, push) | docker events |
Stacks — Docker Compose przez interfejs webowy
Stacks to jedna z najważniejszych funkcji Portainera dla osób pracujących z Docker Compose. Wklejasz lub wgrywasz plik YAML, opcjonalnie definiujesz zmienne środowiskowe przez formularz (zamiast pliku .env), i klikasz "Deploy the stack". Portainer uruchomi wszystkie zdefiniowane usługi. Poniżej przykładowy stack z WordPress i MySQL:
version: '3.8'
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: {{ MYSQL_ROOT_PASS }}
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: {{ MYSQL_USER_PASS }}
volumes:
- db_data:/var/lib/mysql
networks:
- wp_net
wordpress:
image: wordpress:6-php8.2-fpm
restart: always
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: {{ MYSQL_USER_PASS }}
volumes:
- wp_data:/var/www/html
networks:
- wp_net
volumes:
db_data:
wp_data:
networks:
wp_net:
Zmienne {{ MYSQL_ROOT_PASS }} i {{ MYSQL_USER_PASS }}
możesz zdefiniować w formularzu Portainer w sekcji "Environment variables" — nie musisz ich hardcodować
w YAML. Portainer doda je automatycznie jako zmienne środowiskowe przy deploymencie.
Portainer Agent — zarządzanie zdalnymi Docker hostami
Jeden Portainer może zarządzać wieloma serwerami Docker jednocześnie. Wystarczy zainstalować Portainer Agent na każdym zdalnym hoście, a następnie dodać go jako nowe środowisko w panelu. Agent działa jako kontener i nasłuchuje na porcie 9001.
# Na ZDALNYM serwerze (kazdy VPS ktory chcesz zarzadzac) docker run -d \ --name portainer_agent \ --restart=always \ -p 9001:9001 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var/lib/docker/volumes:/var/lib/docker/volumes \ portainer/agent:latest # W Portainerze: Settings > Environments > Add environment # Typ: Docker Standalone / Agent # Endpoint URL: IP_ZDALNEGO_SERWERA:9001 # WAZNE: port 9001 powinien byc otwarty TYLKO dla IP serwera z Portainerem # UFW na zdalnym hoście: ufw allow from IP_PORTAINERA to any port 9001
RBAC — Role-Based Access Control dla zespołów
Portainer CE obsługuje podstawowy RBAC: możesz tworzyć użytkowników i przypisywać im role per środowisko. Portainer Business (płatny) oferuje bardziej granularny RBAC, ale nawet darmowa wersja pozwala na separację uprawnień między adminami a zwykłymi użytkownikami. Dostępne role w CE:
- Administrator — pełny dostęp do wszystkiego, w tym ustawień Portainera i zarządzania użytkownikami.
- Standard User — dostęp do przypisanych środowisk, bez dostępu do ustawień globalnych. Może uruchamiać/zatrzymywać kontenery i deployować Stacks.
- Read-Only User — tylko odczyt; widzi kontenery i logi, ale nie może niczego zmieniać. Przydatne dla QA i monitoringu.
Nginx reverse proxy z HTTPS dla Portainera
Zamiast wystawiać Portainera bezpośrednio na zewnętrzny port 9000, lepiej schować go za
Nginx z HTTPS. Zmienisz adres dostępowy z http://IP:9000 na
https://portainer.twoja-domena.pl, z ważnym certyfikatem SSL.
# /etc/nginx/sites-available/portainer.conf
server {
listen 80;
server_name portainer.twoja-domena.pl;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name portainer.twoja-domena.pl;
ssl_certificate /etc/letsencrypt/live/portainer.twoja-domena.pl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/portainer.twoja-domena.pl/privkey.pem;
location / {
proxy_pass https://localhost:9443;
proxy_ssl_verify off; # self-signed cert Portainera
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;
}
}
# Wydaj certyfikat (przed tym ustaw DNS A portainer.twoja-domena.pl → IP serwera)
certbot --nginx -d portainer.twoja-domena.pl
nginx -t && systemctl reload nginx Po tej konfiguracji ogranicz dostęp do portów 9000 i 9443 przez UFW tylko do localhost lub sieci wewnętrznej — cały ruch zewnętrzny będzie przechodził przez Nginx na portach 80/443.
Aktualizacja Portainera bez utraty danych
# Zatrzymaj i usun stary kontener (dane sa w woluminie portainer_data) docker stop portainer docker rm portainer # Pobierz najnowszy obraz docker pull portainer/portainer-ce:latest # Uruchom nowy kontener z tymi samymi opcjami docker run -d \ --name portainer \ --restart=always \ -p 9443:9443 \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest # Sprawdz wersje po aktualizacji docker exec portainer portainer --version