home
Konfiguracja Portainer od podstaw: konta użytkowników, role i uprawnienia, bezpieczeństwo, środowiska oraz ustawienia globalne.
Przygotuj czytelną strukturę katalogów pod usługi Docker.
Przejdz do sekcji z konfiguracją usług.
Portainer to lekki, czytelny i bardzo wygodny panel webowy, który pozwala zarządzać Dockerem bez konieczności wklepywania każdej komendy w terminalu. Daje szybki wgląd w kontenery, obrazy, wolumeny, sieci, logi oraz zużycie zasobów — wszystko to, co Docker ma „pod maską”.
Jest to jedno z pierwszych narzędzi, które warto uruchomić po instalacji Dockera — szczególnie jeśli budujesz własną infrastrukturę self-hosted lub środowisko pod smart home.
W pierwszej kolejności stworzymy katalog na serwerze:
sudo mkdir /opt/portainer
Aby uruchomić Portainer, wykonaj poniższą komendę:
docker run -d -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/portainer/:/data \
portainer/portainer-ce:lts
coś poszło nie tak? sprawdź tu
Znajomość flag używanych w docker run pozwala:
Poniżej rozbijemy komendę uruchamiającą Portainera na części i dokładnie wyjaśnimy, co się w niej dzieje.
Znajomość flag docker run ułatwia:
Dobra, rozbijmy komendę do uruchomienia kontenera z portainer na części.
docker run - Mówimy silnikowi Docker: "hej, uruchom kontener na podstawie wskazanego obrazu."
-d - Detach mode — uruchamia kontener w tle, bez wyświetlania logów w terminalu. Używasz tego, kiedy nie chcesz, aby
działanie kontenera blokowało terminal.
-p 9443:9443 - Przekierowanie portów:
Dzięki temu możesz wejść w przeglądarce na: https://IP_Twojego_Serwera:9443
https://IP_Twojego_Serwera:8888 - warte
zapamiętania, ponieważ często zdarza się, że kilka usług chce działać w tym samym portie lub po prostu chcemy
uruchomić dwie takie same uslugi jednocześnie--name portainer - Nadaje nazwę kontenerowi. Dzięki temu możesz później w konsoli odnieść się do niego po nazwie, a
nie po ID, np.:
docker restart portainer
docker logs portainer
docker stop portainer
--restart=always - „jeśli kontener padnie, spróbuj go podnieść z powrotem”. Przydatne, gdy aplikacja
mogłaby czasem ulec awarii lub serwer się rebootuje. Falaga obsluguje również inne wartości takie jak unless-stopped
czy on-failure.
Volume -v - Kontener ma własny, odizolowany system plików. Flaga -v pozwala zamontować katalog z hosta do środka
kontenera.
W tej komendzie mamy dwa wolumeny:
pierwszy pozwala Portainer-owi komunikować się z lokalnym Docker Engine. Bez tego nie byłby w stanie zarządzać innymi kontenerami.
-v /var/run/docker.sock:/var/run/docker.sock
drugi:
-v /opt/portainer/:/data
Łączy folder na serwerze: /opt/portainer/ z katalogiem w kontenerze: /data.
W tym miejscu Portainer zapisuje:
Gdyby kontener zniknął lub został zaktualizowany, dane po stronie hosta zostają — i to jest właśnie sens wolumenów.
Ostatni element — obraz kontenera
portainer/portainer-ce:lts - To po prostu nazwa obrazu, z którego uruchamiany jest kontener.
portainer/portainer-ce — nazwa projektu,lts — tag obrazu (wersja długoterminowa, stabilna).Nie poprzedzamy tego żadną flagą — obraz zawsze stoi na końcu.
Trzymanie kontenerów w aktualnej wersji to dobry nawyk — zwłaszcza jeśli nie chcesz później szukać, dlaczego coś przestało działać. Proces aktualizacji Portainera jest szybki i sprowadza się do kilku kroków.
Najpierw pobieramy nowy obraz:
docker pull portainer/portainer-ce:lts
Następnie zatrzymujemy działający kontener Portainera:
docker stop portainer
Potem usuwamy stary kontener:
docker rm portainer
I uruchamiamy go ponownie — tyle że już na świeżym obrazie:
docker run -d -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/portainer/:/data \
portainer/portainer-ce:lts
Ale zaraz, zaraz… coś tu nie gra. Przecież znowu używam lts. Czy to nie zainstaluje tej samej wersji?
Już tłumaczę.
Tag lts to alias wskazujący na aktualną wersję long-term-support — np. 3.33.0.
Jeśli później pojawi się poprawka i wydadzą 3.33.1, to ten sam tag lts zostanie przepięty na nowy obraz.
Czyli:
kiedy wykonasz docker pull portainer/portainer-ce:lts,
zawsze dostaniesz najnowszą wersję LTS, niezależnie od tego, jaka była poprzednio.
Zobacz sam:
docker images | grep portainer
Przykładowy wynik:
REPOSITORY TAG IMAGE ID CREATED SIZE
portainer/portainer-ce lts 9bde3c70195f 6 days ago 186MB
portainer/portainer-ce <none> aa2ac1fdb557 4 weeks ago 186MB
Widzisz? Masz dwa obrazy:
jeden oznaczony jako lts (czyli najnowszy),
drugi bez taga (czyli poprzednia wersja, której tag lts został przepisany na nowszy obraz).
Dlatego po ponownym uruchomieniu kontenera Portainer wystartuje już na świeżej wersji.
*tip
Jeśli chcesz zrobić wszystko “za jednym strzałem”, możesz połączyć komendy:
&& — wykonaj następne polecenie tylko jeśli poprzednie zakończyło się sukcesem,\ — przenieś komendę do kolejnej linii (dla czytelności).Daje to jedną przejrzystą, wieloliniową komendę:
docker pull portainer/portainer-ce:lts && \
docker stop portainer && \
docker rm portainer && \
docker run -d -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/portainer/:/data \
portainer/portainer-ce:lts
I gotowe — Twój Portainer jest zaktualizowany.
pss. w sekcji "na skróty" możesz pobrać skrypt który zrobi to autamatycznie ;)
Czasem podczas startu lub aktualizacji Portainera zobaczysz taki komunikat:
docker: Error response from daemon: Conflict. The container name "/portainer" is already in use by container "7ca6d36d744a0915872105af2e66ffe6fe511c83871a27ade0dab3bd0f4464d3".
You have to remove (or rename) that container to be able to reuse that name.
Co on oznacza? Masz już kontener o nazwie portainer, który blokuje stworzenie nowego.
Sprawdźmy to.
docker ps -a -f status=exited -f status=created | grep portainer
Co tu się dzieje?
docker ps -a – pokazuje wszystkie kontenery, również zatrzymane-f status=exited – pokaż tylko kontenery, które zakończyły działanie-f status=created – oraz te, które powstały, ale nigdy nie ruszyły| grep portainer – zostaw tylko te, które w nazwie/obrazie mają „portainer”Po wykonaniu tej komendy dostaniesz coś w tym stylu:
7ca6d36d744a portainer/portainer-ce:lts "/portainer" 17 minutes ago Exited (2) About a minute ago portainer
7ca6d36d744a - to ID kontenera - jak widisz jest to rownież początek identyfikatora z błedu jaki otrzymałeś
No i wszystko jasne — to ID kontenera (7ca6d36d744a) pokrywa się z tym z komunikatu błędu.
Skoro nie jest uruchomiony i tylko przeszkadza, po prostu go usuń:
docker rm 7ca6d36d744a
Teraz wróć do polecenia, które wcześniej powodowało błąd — tym razem nic nie powinno już stać na przeszkodzie 😉
Jeden z częstszych problemów przy uruchamianiu wielu kontenerów na jednym hoście. Odpalasz kontener i nagle boom:
Error starting userland proxy: listen tcp4 0.0.0.0:9443: bind: address already in use
No dobra… co to znaczy? Krótko mówiąc: port 9443 jest już używany przez inną aplikację lub inny kontener.
Zaraz sprawdzimy przez kogo.
Użyjmy:
sudo lsof -i :9443
Jeśli zobaczysz coś takiego:
docker-pr 1234 root 3u IPv4 548123 TCP *:9443 (LISTEN)
to już wiemy — jakiś kontener Dockera siedzi na tym porcie.
Jaki to kontener?
Skoro docker-proxy blokuje port, sprawdźmy wszystkie uruchomione kontenery:
docker ps | grep 9443
Przykładowy wynik:
abc123def456 portainer/portainer-ce:lts "/portainer" 2 hours ago Up 2 hours 0.0.0.0:9443->9443/tcp portainer
Aha — czyli stary Portainer działa!
Zatrzymujemy winowajcę:
docker stop portainer
Jeśli chcesz go usunąć (Tylko jeśli chcesz uruchomić go od nowa z nowszym obrazem lub zmienioną konfiguracją.)
docker rm portainer
Spróbuj ponownie uruchomić swoją komendę
Powinno przejść bez problemu.
A co jeśli port jest zajęty przez coś spoza Dockera?
Może to być inna aplikacja, np. Nginx, HAProxy, jakiś serwis systemowy itp.
Jeśli lsof pokaże np.:
nginx 987 www-data 6u IPv4 488192 TCP *:9443 (LISTEN)
to znaczy, że:
masz działający serwer reverse proxy i on pilnuje portu 9443 - raczej nie spotykane, ale...
Wtedy najbezpieczniej zmienić port nowej usługi na inny np. z 9443 → 9444:
docker run -d -p 9444:9443 ...
No dobra… próbujesz uruchomić kontener z dostępem do Dockera:
-v /var/run/docker.sock:/var/run/docker.sock
i nagle:
docker: Error response from daemon:
failed to create shim task: permission denied: unknown.
lub
permission denied while trying to connect to the Docker daemon socket
Spokojnie — to klasyk. Zobaczmy, co może być przyczyną.
Nie masz uprawnień do pliku docker.sock
Sprawdźmy:
ls -l /var/run/docker.sock
Najczęściej zobaczysz coś takiego:
srw-rw---- 1 root docker 0 Jan 20 12:00 /var/run/docker.sock
To oznacza:
Jeśli Ty nie jesteś w grupie docker, to klops — widzisz permission denied
Dodaj siebie do grupy docker Uruchom:
sudo usermod -aG docker $USER
wymuś przeładowanie grup:
newgrp docker
I sprawdź:
docker ps
Jeśli działa bez sudo, to elegancko — problem rozwiązany.
Ale ja odpaliłem Dockera wcześniej za pomocą sudo… Wtedy często pojawia się ten błąd:
WARNING: Error loading config file: /home/user/.docker/config.json:
permission denied
To znaczy, że ten folder został utworzony przez sudo, więc właścicielem jest root.
Trzeba to naprawić:
sudo chown "$USER":"$USER" /home/$USER/.docker -R
sudo chmod g+rwx /home/$USER/.docker -R
Sprawdź teraz:
docker ps
Sprawdź, czy Docker na pewno działa
Głupie? A częste
sudo systemctl status docker
Jeśli inactive → odpal:
sudo systemctl start docker
Teraz spróbuj ponownie uruchomić Portainer
docker run -d -p 9443:9443 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/portainer/:/data \
portainer/portainer-ce:lts