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, iż zarządzanie kontenerami Docker jest przyjemniejsze i bardziej intuicyjne. Co interesujące 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 uproszczeniu przypomnę jak się to robi poprzez wypisanie potrzebnych komend.
sudo apt install docker.io -y sudo groupadd docker sudo usermod -aG docker $USERJak 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_dataSkorzystamy 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’em.
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:latestPrzejdźmy w uproszczeniu 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’a. Należy pamiętać, iż o ile chcemy mieć dostęp z zewnątrz, tj. z Internetu, tudzież w jakikolwiek inny sposób spoza sieci lokalnej lub choćby 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 manualnie 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, iż 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, iż 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’a 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:
- Name – Nextcloud
- Image – lscr.io/linuxserver/nextcloud:latest
- Manual network port publishing (po naciśnięciu przycisku publish a new network port):
- host – 443
- container – 443
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:
container | volume | |
/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:
- PUID – 1000
- PGID – 1000
- TZ – Europe/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, iż 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 iż 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 suOtworzyć do edycji iptables:
nano /etc/iptables/rules.v4Odnaleźć 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 ACCEPTRuch 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, interesująca jest jego lokalizacja, prawda?
nano /var/lib/docker/volumes/nextcloud_config/_data/www/nextcloud/config/config.phpOdnajdujemy 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.