艁adowanie

Portainer – GUI dla Docker’a

馃嚞馃嚙 Go to english version of this post / Przejd藕 do angielskiej wersji tego wpisu

Wszystkim Czytelnikom tego bloga Docker powinien by膰 znany, bo do艣膰 obszernie opisa艂em go w tym wpisie. Dzisiaj jednak p贸jd臋 o krok dalej i przedstawi臋 narz臋dzie o nazwie Portainer, kt贸re jest swego rodzaju interfejsem graficznym sprawiaj膮cym, 偶e zarz膮dzanie kontenerami Docker jest przyjemniejsze i bardziej intuicyjne. Co ciekawe Portainer uruchamia si臋 jako kontener – one ring container to rule them all!

Instalacja 艣rodowiska Docker – wersja skr贸cona

Tak jak pisa艂em wy偶ej, Docker zosta艂 przeze mnie om贸wiony szczeg贸艂owo w tym wpisie, jednak偶e tutaj jedynie z kronikarskiego obowi膮zku w skr贸cie przypomn臋 jak si臋 to robi poprzez wypisanie potrzebnych komend.

sudo apt install docker.io -y
sudo groupadd docker
sudo usermod -aG docker $USER

Jak uruchomi膰 Portainer

Tak jak ju偶 m贸wi艂em, Portainer’a uruchamia si臋 jako zwyk艂y kontener, dlatego zacznijmy od zrobienia wolumenu dla niego przeznaczonego. Nazwiemy go portainer_data.

docker volume create portainer_data

Skorzystamy z obrazu w wersji CE (Community Edition – z ang. edycja spo艂eczno艣ciowa) dost臋pnego na Docker Hub. Dla u艂atwienia przygotowa艂em gotow膮 komend臋, kt贸ra prawid艂owo uruchomi odpowiednio skonfigurowany kontener z dzia艂aj膮cym Portainer鈥檈m.

docker run -d \
-p 8000:8000 \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--name Portainer \
--restart unless-stopped \
portainer/portainer-ce:latest

Przejd藕my w skr贸cie linijka po linijce w celu opisania co tak naprawd臋 wykonujemy tym poleceniem. Zaczynamy od zwyk艂ej komendy s艂u偶膮cej do uruchomienia kontenera w trybie detached mode, st膮d flaga -d, kt贸ry w du偶ym uproszczeniu polega na uruchomieniu kontenera w tle i utrzymaniu jego dzia艂ania. Dalej spinamy (przekierowujemy ruch) porty 8000 (HTTP) oraz 9443 (HTTPS) pomi臋dzy kontenerem i maszyn膮, na kt贸rej jest uruchomiony. Pod tymi portami znajdowa膰 si臋 b臋dzie panel dost臋powy do Portainer鈥檃. Nale偶y pami臋ta膰, 偶e je偶eli chcemy mie膰 dost臋p z zewn膮trz, tj. z Internetu, tudzie偶 w jakikolwiek inny spos贸b spoza sieci lokalnej lub nawet maszyny, na kt贸rej jest uruchomiony, to musimy odpowiednio odblokowa膰 porty zar贸wno na serwerze (np. w iptables) jak i routerze i/lub innej infrastrukturze, w kt贸rej on dzia艂a (patrz臋 tutaj w kierunku Virtual Cloud Networks od Oracle). Przechodz膮c dalej, definiujemy dwa wolumeny. Pierwszym z nich podmontowujemy plik docker.sock, dzi臋ki czemu damy Portainer’owi mo偶liwo艣膰 sterowania prac膮 ca艂ego 艣rodowiska Docker, w kt贸rym operuje i ma zarz膮dza膰. Drugi to zwyk艂e miejsce na pliki Portainer’a. Ostatnie trzy linijki to standardowe – nadanie nazwy kontenerowi, okre艣lenie polityki ponownego uruchamiania (w tym przypadku uruchamiaj a偶 zostanie r臋cznie zatrzymany) oraz okre艣lenie jaki obraz ma zosta膰 u偶yty.

Ch臋膰 wykonania tak skonstruowanego polecenia potwierdzamy ENTER’em i po uruchomieniu kontenera mo偶emy przej艣膰 do przegl膮darki, w kt贸rej pasek adresu wpisujemy:

https://localhost:9443

Naszym oczom uka偶e si臋 bardzo prosty instalator, w kt贸rym wystarczy ustawi膰 jedynie nazw臋 i has艂o dla administratora. Na nast臋pnej stronie wybieramy przycisk Get Started jako, 偶e chcemy, aby Portainer u偶ywa艂 艣rodowiska znajduj膮cego si臋 na maszynie lokalnej, na kt贸rej jest uruchomiony. Finalnie zostaniemy przeniesieni do listy dost臋pnych 艣rodowisk, na kt贸rej b臋dzie jedynie jedno o nazwie local (z ang. lokalne). Aby rozpocz膮膰 zarz膮dzanie tym 艣rodowiskiem nale偶y po prawej stronie nacisn膮膰 niebieski przycisk Live connect. Poskutkuje to tym, 偶e po lewej stronie zamiast Environment: None selected pojawi膮 si臋 nam zak艂adki z opcjami do zarz膮dzania.

Jak uruchomi膰 przyk艂adowy kontener

Samo uruchomienie Portainer鈥檃 to dopiero pocz膮tek zabawy i czu艂bym si臋 藕le, gdybym w tym momencie zako艅czy艂 wpis. Dlatego poka偶臋 jeszcze jak odpali膰 przyk艂adowy kontener. Jako reprezentanta wybra艂em Nextcloud, o kt贸rym pisa艂em ju偶 w tym wpisie.

Po wybraniu Environment – local wybieramy po lewej stronie zak艂adk臋 Containers. To tutaj b臋dziemy tworzy膰 i mie膰 wylistowane wszystko kontenery. Jak wida膰 w tym momencie jedynym kontenerem znajduj膮cym si臋 na li艣cie jest sam Portainer. Zanim podejmiemy pr贸b臋 rozszerzenia tej listy o kolejny kontener musimy najpierw przej艣膰 do zak艂adki Volumes, gdzie utworzymy dwa wolumeny niezb臋dne do prawid艂owej pracy Nextcloud.

Korzystaj膮c z niebieskiego przycisku Add volume, znajduj膮cego si臋 w prawym g贸rnym rogu, tworzymy wolumeny nextcloud_config i nextcloud_data. W kreatorze wolumenu wystarczy wpisa膰 nazw臋 w pole Name i potwierdzi膰 przyciskiem Create new volume.

Na li艣cie Volumes pojawi膮 si臋 dwa wolumeny oznaczone znacznikami Unused (z ang. nie u偶yte), a ich punkty montowania na serwerze to /var/lib/docker/volumes/(…)/_data. Teraz, gdy ju偶 mamy przygotowane miejsce dla kontenera Nextcloud mo偶emy przyst膮pi膰 do jego tworzenia. Wr贸膰my zatem do zak艂adki Containers i skorzystajmy z niebieskiego przycisku Add container, zlokalizowanego w prawym g贸rnym rogu. Zostanie otwarte okno kreatora, w kt贸rego pierwszej sekcji na g贸rze wype艂niamy pola:

  • NameNextcloud
  • Imagelscr.io/linuxserver/nextcloud:latest
  • Manual network port publishing (po naci艣ni臋ciu przycisku publish a new network port):
    • host443
    • container443

Przechodzimy do sekcji dolnej, w kt贸rej musimy przej艣膰 przez kilka zak艂adek. Pierwsz膮, do kt贸rej nale偶y zajrze膰 jest Volumes, gdzie do kontenera podepniemy te wolumeny, kt贸re utworzyli艣my wcze艣niej. W tym celu dwukrotnie (bo b臋dziemy konfigurowa膰 dwa wolumeny) naciskamy przycisk map additional volume i mapujemy w nast臋puj膮cy spos贸b:

containervolume
/config=>nextcloud_config – local
/data=>nextcloud_data – local

Istotne tutaj jest, aby zaznaczone by艂y pola Volume (a nie Bind) oraz Writable (a nie Read-only). Nast臋pna zak艂adka, do kt贸rej przechodzimy jest Env, co jest skr贸tem od Environment variables (z ang. zmienne 艣rodowiskowe). Dla Nextcloud musimy tutaj ustawi膰 trzy zmienne, wi臋c naciskamy trzykrotnie przycisk Add an environment variable i wpisujemy nast臋puj膮ce warto艣ci:

  • PUID1000
  • PGID1000
  • TZEurope/Warsaw

Ostatnia zak艂adka, kt贸ra nas w tym momencie interesuje to Restart policy, w kt贸rej wybieramy opcj臋 Unless stopped.

Teraz pozostaje nam tylko wr贸ci膰 do g贸rnej sekcji, na kt贸rej ko艅cu znajduje si臋 niebieski przycisk Deploy the container. To spowoduje pobranie obrazu i uruchomienie odpowiednio skonfigurowanego kontenera Nextcloud. Co mo偶na zaobserwowa膰 na li艣cie kontener贸w.

Kontener dzia艂a, wi臋c mo偶emy przej艣膰 do przegl膮darki, 偶eby dosta膰 si臋 do 艣wie偶o uruchomionego Nextcloud. Odpalili艣my go na porcie 443, a wi臋c domy艣lnym porcie do komunikacji HTTPS co znaczy, 偶e w pasek adresu w przegl膮darce wystarczy wpisa膰 nast臋puj膮c膮 fraz臋:

https://localhost

W pierwszej kolejno艣ci zobaczymy instalator, w kt贸rym ustawiamy nazw臋 i has艂o dla administratora oraz mo偶emy skonfigurowa膰 baz臋 danych, jednak偶e w tym przypadku zostawiam to w formie domy艣lnej, kt贸ra wykorzystuje SQLite, bo to jedynie rozwi膮zanie demonstracyjne. Ostatnie co nam pozostaje to nacisn膮膰 przycisk Zainstaluj.

Dost臋p do Nextcloud z zewn膮trz

Mia艂 by膰 to wpis o narz臋dziu Portainer, ale pozwol臋 sobie przy okazji rozszerzy膰 jeszcze nieco temat Nextcloud. We wcze艣niejszym akapicie opisa艂em jak uruchomi膰 Nextcloud i dosta膰 si臋 do niego z poziomu sieci lokalnej. A co w przypadku, gdy chcemy dosta膰 si臋 do niego z zewn膮trz?

Je偶eli korzystamy z VPS od Oracle to pierwszym krokiem powinno by膰 odblokowanie ruchu z poziomu infrastruktury Oracle dla portu 443. Robi si臋 to w Networking -> Virtual cloud networks -> wybierz VNC swojego VPS’a -> Security Lists -> wejd藕 do listy odpowiedniej dla swojego VPS’a. Nale偶y doda膰 Ingress Rule w spos贸b analogiczny jak na poni偶szym zrzucie ekranu.

Sytuacja wygl膮da podobnie w przypadku serwera domowego i routera, kt贸rego porty nale偶y otworzy膰 jako 偶e jest on g艂贸wn膮 bram膮 w sieci domowej.

Nast臋pnie trzeba po艂膮czy膰 si臋 z serwerem po SSH i wej艣膰 w buty u偶ytkownika root:

sudo su

Otworzy膰 do edycji iptables:

nano /etc/iptables/rules.v4

Odnale藕膰 linijk臋:

(...)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
(...)

I zaraz po niej, w kolejnym wierszu, wklei膰:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

Ruch sieciowy zosta艂 prawid艂owo otwarty, wi臋c strona powinna by膰 osi膮galna po wprowadzeniu adresu:

https://[Adres IP Serwera]

Jednak偶e najprawdopodobniej zobaczymy co艣 takiego…

Rozwi膮zanie tego problemu jest stosunkowo proste, ale znalezienie go ju偶 nie do ko艅ca, bo trzeba troch臋 poszuka膰 w dokumentacji. Mogli to zrobi膰 zdecydowanie bardziej intuicyjnie… Na szcz臋艣cie macie mnie, czyli go艣cia, kt贸ry odwali艂 ju偶 ca艂膮 robot臋 i za chwile przedstawi gotowe i zwi臋z艂e rozwi膮zanie. Otwieramy w edytorze tekstowym plik config.php, o kt贸rym mowa w komunikacie, ciekawa jest jego lokalizacja, prawda?

nano /var/lib/docker/volumes/nextcloud_config/_data/www/nextcloud/config/config.php

Odnajdujemy w nim sekcj臋 trusted_domains i wype艂niamy j膮 analogicznie do tego:

(...)
'trusted_domains' =>
    array (
      0 => 'localhost',
      1 => '[VPS IP]',
  ),
(...)

Oczywi艣cie zamiast [VPS IP] nale偶y poda膰 adres IP swojego serwera. Po tych wszystkich dzia艂aniach mo偶na od艣wie偶y膰 stron臋 w przegl膮darce po czym dost臋p powinien by膰 ju偶 mo偶liwy.


Je偶eli podoba艂 Ci si臋 ten wpis to mo偶esz mnie wesprze膰! 馃檪

Tomasz Dunia

馃嚨馃嚤 Z wykszta艂cenia Mechatronik. Z zawodu G艂贸wny Konstruktor w PAK-PCE Polski Autobus Wodorowy (Neso Bus). Po pracy Ojciec Roku. W nocy Wannabe Programista. Wszystko to daje przepis na zwyk艂ego nerda :) 馃嚞馃嚙 Mechatronics by education. By profession Chief Constructor in PAK-PCE Polish Hydrogen Bus (Neso Bus). After work Father of the Year. At night Wannabe Programmer. All this gives a recipe for an ordinary nerd :)

svg

Co my艣lisz?

Poka偶 komentarze / Napisz komentarz

3 komentarze

  • MiKlo:~/citizen4.eu$馃挋馃挍

    17 listopada, 2023 / at 12:17 pm

    @to3kWarto doda膰, 偶e #portainer opr贸cz uruchamiania kontener贸w lokalnie potrafi r贸wnie偶 zarz膮dza膰 klastrami. Najprostszy klaster mo偶na uruchomi膰 przy u偶yciu narz臋dzi wbudowanych w samego dockera – czyli uruchomi膰 dockera w tzw trybie swarm.Tryb swarm nawet na pojedynczej maszynie daje dodatkowe funkcje w postaci np automatycznej replikacji czy r贸wnowa偶enia obci膮偶enia.Po stronie docker’a to tylko kilka dodatkowych polece艅 wykonanych jednorazowo:

    # portainer in swarm mode – manager nodeip=$(hostname -I | awk '{print $1}’)sudo docker swarm init –advertise-addr $ipsudo docker network create –scope swarm –attachable -d 'overlay’ websudo docker stack deploy –compose-file=portainer-agent-stack-swarm.yml portainer

    a portainer sk艂ada si臋 wtedy z dw贸ch us艂ug – na ka偶dym w臋藕le klastra dzia艂a tzw agent.Przyk艂adowy plik .yml dla portainer’a w trybie swarm.

Odpowiedz

svg
Szybka nawigacja
  • 01

    Portainer – GUI dla Docker’a