Jak wystawić forum dyskusyjne w pięć minut?

panwolfram
Posty: 4
Rejestracja: sobota 04 gru 2021, 21:25

Jak wystawić forum dyskusyjne w pięć minut?

Post autor: panwolfram »

Cześć wszystkim!

Admini z reguły dzielą się na dwie części - tych którzy robią kopie zapasowe i tych którzy będą je robić w przyszłości. Do tego dochodzi jeszcze jedna grupa - myślących że je robią.
Z racji że nasze Forum przeszło częściowy zanik pamięci, postanowiłem zmienić sposób w jakie jest uruchomione.
Zacznijmy od historii.

Na samym początku serwis działał na podstawowej instalacji LAMP - czyli Linux-Apache2-MySQL-PHP.
Instalacja LAMPa polega na zainstalowaniu w danym systemie Linux pakietów webservera (Apache2), silnika bazy danych (MySQL) oraz języka programowania PHP.
W kolejnym kroku wraz z dokumentacją silnika forum instalowało się dodatkowe biblioteki pozwalające np. na wysyłanie maili czy kompresję załączników. Później wprowadzana zostawała specyficzna konfiguracja Apache2, pozwalająca na przekierowanie wybranego bądź całego ruchu HTTP/HTTPS do modułu wsparcia języka PHP w webserverze.
Podczas instalacji zostawała również wprowadzana konfiguracja połączenia z bazą danych, ewentualnie podłączane zostawały również certyfikaty SSL, aby wyświetlała się zielona kłódka.

Tak stawiało się serwisy 20, 15, czy 10 lat temu - i z reguły dobrze przystosowany stack technologiczny pozwalał na wydajną i bezpieczną pracę.

Technologia, choć niektórzy by tego bardzo chcieli, nie stoi w miejscu. Silniki serwisów internetowych prędzej czy później będą podatne na ataki prowadzące do wycieków danych bądź użycie sprzętu na którym działają w nieautoryzowany sposób. W tym celu programiści publikują patche i aktualizacje oraz zalecają wprowadzania określonych poprawek do konfiguracji webservera. Nie każdy ma czas na przeglądanie obszernych list mailingowych i pieczołowite testowanie (a ktoś to jeszcze robi?) i zastosowywanie poprawek.

Najlepszym sposobem na tego typu wyzwania byłby silnik wstępnie przystosowany przez jego programistów, z dołączonym webserverem posiadającym zalecaną konfigurację. Do tego pozwalający na prostą aktualizację do nowszej i bezpieczniejszej wersji. A gdyby jeszcze dało się go szybko i całkowicie backupować?

Otóż coś takiego istnieje już od kilku lat, jednak wymaga lekkiej zmiany myślenia.

Z reguły osobom, które nie słyszały o Dockerze, porównuję go do nośnika DVD z instalacją Linuksa.
Po włożeniu do napędu i uruchomieniu z niego komputera pokazuje się od razu pulpit danej dystrybucji. Działa w nim przeglądarka internetowa, klient poczty czy menedżer plików. Pomimo, że użytkownik nie zainstalował jeszcze systemu. Z tego poziomu można nie tylko zainstalować system, ale również przetestować jego wybrane funkcjonalności.
Jednak z racji że korzystamy z nośnika DVD, po ponownym uruchomieniu z niego komputera, wprowadzone przez nas zmiany nie zostaną zapisane i zobaczymy system dokładnie taki sam jak przy pierwszym uruchomieniu. Jeżeli jednak włożymy do komputera również nośnik USB, możemy zapisać na nim pliki nad którymi pracowaliśmy a przy następnym uruchomieniu pracować nad nimi ponownie.

Docker działa praktycznie tak samo, tylko zamiast pełnej dystrybucji "obraz" zawiera jedynie dane oprogramowanie, np. webserver Apache2 lub nginx, silnik bazy danych MySQL czy silnik forum dyskusyjnego phpBB. Nośnikiem USB jest natomiast folder na dysku komputera, który będzie przechowywał dane które zmieniają się w trakcie działania oprogramowania.


"Przecież to wirtualna maszyna! Maszyny wirtualne żrą procesor, RAM i dysk! Uruchomię swojego LAMPa jak dotychczas, będzie szybciej i lepiej!"

I tak i nie. Silnik Docker uruchomiony na Linuksie w przeciwieństwie do maszyny wirtualnej nie wirtualizuje procesora, pamięci RAM czy dysku twardego. Programom w nim działającym przekazywany jest kernel Linuxa jak również wybrane urządzenia istniejące w systemie. Dzięki temu program uruchomiony w Dockerze zużywa marginalnie więcej lub tyle samo zasobów co ten uruchomiony "na gołym systemie". Nie ma tutaj koncepcji "wirtualnego procesora", "wirtualnego ramu", "dysku VHDX który puchnie i nie ma co z nim zrobić" czy "maszyna padła i nie wstaje".
Co więcej - jeżeli uruchamialibyśmy wiele maszyn wirtualnych, zużycie zasobów hosta wzrasta w dużym stopniu - trzeba emulować cały system operacyjny danej VMki - w Dockerze zasoby zajmują tylko działające oprogramowanie oraz wymagane przez nie zależności.
Kolejną zaletą programu uruchomionego w Dockerze jest możliwość dokładnego dostosowania wykorzystywanych zasobów (limitowanie zużycia CPU, RAMu, przypisywanie konkretnych portów sieciowych lub nawet udostępnienie interfejsu sieciowego hosta).


"Silnik Docker uruchomiony na Linuksie. A na Windowsie albo Maku się da?"

Pewnie! Tylko musimy zgodzić się na pewne ustępstwa. W Windowsie czy macOS kernela Linuksowego nie ma - co nie znaczy że nie uruchomimy na nim Dockera. Istnieją oficjalne instalatory silnika Docker dla obydwóch tych systemów, które tworzą minimalistyczną maszynę wirtualną z Silnikiem.
Owszem, VMka - RAM zeżre, procesor zwolni, wirtualny dysk spuchnie i tyle będzie z tej zabawy? Nie do końca. W graficznym programie do konfiguracji Dockera definiujemy ile maksymalnie RAMu, procesora i wirtualnego dysku VMka będzie używać. Kiedy nie mamy uruchomionych żadnych programów w Dockerze, VMka przejdzie w stan minimalnego zużycia zasobów. Co więcej, jeżeli podłączymy do danych programów uruchomionych w Dockerze foldery z naszego hosta, dysk VMki nie będzie "puchnął" - bo dane będziemy mieli bezpośrednio w folderach na dysku twardym.


"No dobra, miało być w pięć minut."

Teraz, gdy wytłumaczyłem już czym jest Docker i jak działa, pora na kilka podstawowych pojęć:
- Obraz (image) to odpowiednik naszego nośnika DVD z danym linuksem. Obraz zawiera możliwą do uruchomienia działające środowisko danego oprogramowania.
- Kontener (container) to odpowiednik maszyny wirtualnej w której uruchamiamy obraz. Kontener można załączyć, wyłączyć, przypisać mu port, podłączyć do niego folder na komputerze.
- Wolumin (volume) to folder na komputerze który przekazujemy kontenerowi. Na przykład składnia /home/user/katalog-do-udostepniania-kontenerowi:/share przekaże folder "katalog-do-udostepniania-kontenerowi" z katalogu użytkownika linuksowego user do kontenera jako katalog o nazwie "share" w głównym poziomie systemu plików.

Silnik Docker instalujemy:
- W systemie Windows i macOS stąd: https://www.docker.com/products/personal/
- W systemie Linux tak jak opisane tutaj: https://docs.docker.com/engine/install/ubuntu/, lub: Please Login or Register to see this code Gdy już zainstalujemy silnik, możemy przetestować jego działanie: uruchamiamy dowolny terminal: Windows Terminal, cmd.exe, powershell.exe czy ich odpowiednik w macOS lub Linuksie i wpisujemy:
Please Login or Register to see this code Wygeneruje to informację podobną do tej poniżej: Please Login or Register to see this code Jeżeli informacja wyświetliła się, to znaczy że jesteśmy już w stanie uruchamiać aplikacje w Dockerze. To połowa drogi. Tradycyjnie aplikacje w Dockerze uruchamiało się wpisując komendę zawierającą wszystkie dane parametry. Dla przykładu uruchomienie serwera nginx udostępniającego stronę HTML z katalogu strona wygląda tak: Please Login or Register to see this code Uruchomienie kilku aplikacji to już klepanie kilku komend - a w przypadku forum phpBB przynajmniej dwóch (phpBB i MySQL).

W tym celu powstał program docker-compose oraz format specyfikacja specjalnie ułożonego pliku yml zawierającego informacje mówiące jakie kontenery z jakimi właściwościami mają być uruchomione. docker-compose jest domyślnie zainstalowany w systemach Windows i macOS, w Linuksie trzeba go doinstalować: Please Login or Register to see this code Następnie w folderze w którym ma działać nasza aplikacja tworzymy plik docker-compose.yml z zawartością: Please Login or Register to see this code Jeżeli uruchomimy komendę Please Login or Register to see this code Program docker-compose sprawdzi zawartość pliku docker-compose.yml i uruchomi zdefiniowane w nim aplikacje.


Teraz test bojowy.

Wiedza, którą do tej pory przekazałem pozwoli na uruchomienie forum na phpBB. Tworzymy folder w którym na zostać uruchomione nasze forum. Wewnątrz niego, plik docker-compose z zawartością: Please Login or Register to see this code Po uruchomieniu komendy Please Login or Register to see this code forum będzie dostępne pod adresem IP komputera na którym zostało wystawione.
Domyślnie istnieje konto administrator z hasłem superhaslo. Radzę zmienić je od razu.

Forum będzie działać dopóki nie zakończymy komendy docker-compose. Aby działało w tle, należy użyć parametru daemonizacji: Please Login or Register to see this code
Co dalej?

Dane w woluminie i backupy
Jak widzimy, dane zarówno bazy danych jak forum znajdują się w folderze container_data. Wykonując ZIPa tego katalogu efektywnie robimy backup wszystkiego co w naszym rozwiązaniu jest zmienne. Jeżeli folder container_data przeniesiemy na inny komputer z zainstalowanym Dockerem i docker-compose, nasze forum będzie działać dokładnie tak samo.

Aktualizacje
Aby zaktualizować rozwiązanie, należy użyć komendy Please Login or Register to see this code Zaktualizuje ona wszystkie obrazy, z których składa się rozwiązanie.


W tym docker-composie jest tyle nieznanych rzeczy, to wcale nie jest takie proste!

docker-compose to rozbudowane narzędzie, które pozwala na dostosowywanie bardzo dużej liczby zmiennych, które sterują naszym rozwiązaniem.
Z grubsza wytłumaczę co oznaczają:
Please Login or Register to see this code Specyfikacja docker-compose ma swoje wersje. Wersji pierwszej już się nie stosuje, została wycofana. Wersja 2 jest obecnie wykorzystywana na potrzeby uruchamiania rozwiązań na lokalnym komputerze/serwerze. Wersja 3 posiada więcej parametrów do uruchamiania rozwiązań w klastrze i nie zawiera pewnej części parametrów z wersji 2. Obecnie wspierane wersje to zarówno 2 i 3. Wersja 2.4 to najnowsza edycja wersji 2.
Please Login or Register to see this code Klucz services zawiera listę kontenerów jakie mają być uruchomione w ramach danego rozwiązania.
Please Login or Register to see this code Klucz db to nazwa danego kontenera w obrębie rozwiązania. Może być dowolna. Niżej zobaczymy również klucz phpbb. To również nazwa kontenera. W obrębie klucza services możemy mieć tyle nazwanych według naszego gustu kontenerów ile chcemy.
Please Login or Register to see this code Klucz image to nazwa obrazu jaki wykorzystuje wskazany kontener.
Nazwa z reguły składa się z dwóch lub trzech członów: host.tld / nazwa_obrazu : wersja_obrazu
- Host: Obrazy Dockerowe dostępne są na tzw. rejestrach obrazów. Specyfikacja rejestru jest otwarta i każdy może zahostować własny rejestr. Jeżeli ten człon jest pusty, obrazy będą pobierane z domyślnego rejestru docker.io, dostępnego pod adresem https://hub.docker.com. W naszym przypadku nazwa rejestru została wpisana i jest nią docker.io
- Nazwa obrazu: Myślę że tego nie trzeba tłumaczyć. To nazwa pod którą widnieje obraz na przykład w serwisie https://hub.docker.com, dla przykładu: https://hub.docker.com/r/bitnami/mariadb, gdzie nazwę widzimy w nagłówku strony: bitnami/mariadb.
- Wersja obrazu: Każdy obraz posiada wersję, po to by dla danych potrzeb można było uruchomić go w starszej lub nowszej wersji. Wersje nazywa się również tag. Przykładowo, dla mariadb taki można znaleźć tutaj: https://hub.docker.com/r/bitnami/mariadb/tags.
Please Login or Register to see this code Klucz environment: określa zmienne środowiskowe które przekazujemy do kontenera. Ponieważ obrazy z reguły nie mają plików konfiguracyjnych (można je podmontować z folderu), to programiści obrazów dla wygody użytkownika udostępniają możliwość ustawienia wybranych parametrów za pomocą zmiennych środowiskowych. Możemy je odnaleźć w dokumentacji danego obrazu, np. dla bitnami/mariadb zmienne wypisane są z reguły na stronie danego obrazu. W naszym przypadku dla celów testowych nasze zmienne określają odpowiednio: puste hasło do bazy, użytkownika i bazę jako "forum".
Please Login or Register to see this code Koncepcję woluminów opisywałem wyżej, niemniej w tym miejscu opisana jest lista folderów z lokalnego systemu i odpowiadających im folderów z kontenera.
Please Login or Register to see this code Lista portów opisuje porty hosta które powiązujemy z portami wewnątrz kontenera. Ciąg 0.0.0.0 mówi, że port 80 wspomniany w dalszej części linijki udostępniamy na wszystkich adresach IP, które posiada host.
Please Login or Register to see this code Klucz depends_on to lista kontenerów od których dany kontener jest zależny. W tym przypadku kontener phpbb jest zależny od kontenera db - nie zostanie uruchomiony dopóki nie uruchomi się baza danych.


"To wszystko na dzisiaj?"

Tak myślę. Z chęcią przeczytam Wasze pytania, sugestie i wyjaśnię ewentualne niejasności.
ODPOWIEDZ