EuroDB w kontenerach cz. II – instalacja komponentów

W dzisiejszym artykule z serii EuroDB przyjrzymy się Dockerowej instalacji EuroDB oraz jej poszczególnych komponentów. Zobaczymy także, w jaki sposób Docker wspiera zarządzanie grupą kontenerów.

W dzisiejszym artykule z serii EuroDB przyjrzymy się Dockerowej instalacji EuroDB oraz jej poszczególnych komponentów. Zobaczymy także, w jaki sposób Docker wspiera zarządzanie grupą kontenerów.

W przypadku instalacji EuroDB w kontenerach korzystamy z opcji instalatora, która pozwala na instalację oprogramowania w trybie nienadzorowanym, czyli z użyciem pliku z odpowiedziami, w tym scenariuszu nazwiemy go answer.

installer.sh -d -a answer

Dla każdego z programów wchodzących w skład pakietu przygotowujemy osobny plik Dockerfile oraz answer. W pliku answer określamy nazwy pakietów do instalacji oraz wartości dla parametrów instalacyjnych, przykładowo:

install_postgres
postgres_datadir="/dbdata"
postgres_listenaddress="0.0.0.0"
postgres_tcpport="5432"
postgres_datachecksums="1"
postgres_advanced=""
install_eurological

Plik Dockerfile zapewnia instalacje dodatkowych pakietów wymaganych przez niektóre komponenty EuroDB. Dockerfile służy także do wyboru użytkownika, z uprawieniami którego będzie działała aplikacja w kontenerze, a także do uruchomienia zainstalowanego pakietu.

Pierwszym krokiem przy instalacji jakiegokolwiek oprogramowania w kontenerach jest wybór sposobu przechowywania danych, musimy go dostosować do specyfiki naszego wdrożenia/projektu. Z pomocą przychodzą Dockerowe mechanizmy wolumenów. Dane zapisane w wolumenie są w pełni zarządzane przez Docker-a i izolowane od systemu gospodarza. Taki wolumen może być użyty przez wiele kontenerów równocześnie, co odpowiada potrzebom konteneryzacji EuroDB. W przypadku zatrzymania kontenerów dane są trwale zapisane w wolumenie (pisaliśmy o tym w I części, /blog/eurodb-w-kontenerach-cz-i/)

W naszej instalacji bazujemy na sprawdzonym obrazie najnowszej wersji EuroLinux 7, do którego korzystania również Państwa zachęcamy. (p. /blog/fbi-darmowe-i-wolne-repozytorium-eurolinux/)

Przyjmowane powszechnie „zalecenie”, aby instalować po jednym procesie na kontener, według nas nie zawsze jest właściwym podejściem. Przykładowo w naszym kontenerze z bazą danych mamy zainstalowane także oprogramowanie do replikacji logicznej.

Ostatnim krokiem jest udostępnienie w kontenerze wymaganych portów oraz właściwe uruchomienie kontenera. Kontener powinien działać tak długo, aby wykonać przydzielone mu zadanie, ale kontener bazy danych musi działać w sposób ciągły.

Bazując na powyższym sposobie, możemy przejść przez instalację kolejnych składników EuroDB, modyfikując tylko nieznacznie pliki Dockerfile i answer. Strukturę katalogów i plików przedstawiamy na zrzucie ekranu:

Całość instalacji wieńczymy plikiem docker-compose.yml:

version: "3.3"
services:
  eurodb_db:
        build: 
         context: ./eurodb
        image: eurodb
        volumes: 
             - psql_data9.6:/dbdata/
  eurodb_loganalyzer:
        build:
          context: ./loganalyzer/
        image: loganalyzer
        volumes:
             - psql_data9.6:/dbdata/

  eurodb_statsanalyzer:
         build:
          context: ./statsanalyzer
         image: statsanalyzer
         ports:
            - 80:80
         depends_on:
            - eurodb_db
         volumes:
             - psql_data9.6:/dbdata/

  eurodb_datagenerator:
         build:
          context: ./datagenerator
         image: datagenerator
         volumes:
             - psql_data9.6:/dbdata/

  eurodb_euromodeler:
         build:
          context: ./euromodeler

volumes:
 psql_data9.6:

Wudowany w Dockerze mechanizm DNS zapewnia automatyczny sposób komunikacji pomiędzy kontenerami za pomocą aliasów. Dzięki temu kontenery mogą komunikować się między sobą, używając ich nazw hosta.

Instalując nasz serwer bazodanowy, przekazujemy do kontenerów informacje konfiguracyjne ze zmiennych środowiskowych. Zmienne te możemy przekazywać do kontenerów za pomocą opcji -e klucz:wartość. Możemy ustawić wiele takich także za pomocą opcji –env-file plik_parametrów. Przykład dla kontenera PostgreSQL:

docker run -d -p 5432:5432 -v psql_data:/var/lib/pgsql/12/data -e POSTGRES_DBNAME=mydatabase -e POSTGRES_USERNAME=myusername -e POSTGRES_PASSWORD=mysecretpassword eurolinux/postgresql

Dla programów, które mają być wywoływane o określonym czasie, nie instalujemy daemona cron w kontenerze. Zamiast tego używamy cron-a z poziomu hosta gospodarza. Wówczas kontener jest uruchamiany tylko na czas wykonanej pracy – jak widać, kontenery sprawdzają się idealnie w takiej roli: wykonują zadanie i mogą być zatrzymane.

W naszych kontenerach pamiętamy także, aby uruchamiać procesy z użytkownika niebędącego administratorem. Korzystamy więc z opcji USER, by przypisać właściwego użytkownika.

EXPOSE 5432
USER postgres
CMD ["/run.sh"]

Na koniec jako ciekawostkę wygenerujemy graficzną strukturę (naszego projektu oczywiście :) ) przy pomocy innego kontenera, stworzonego do takich zadań (docker-compose-viz):

docker run --rm -it --name dcv -v $PWD/:/input pmsipilot/docker-compose-viz render -m image --force docker-compose.yml --output-file=EuroDB.png

Oczywiście przedstawione powyżej rozwiązane to jedno z możliwych dróg realizacji. Zmierzaliśmy do takiego przystosowania EuroDB, aby istniała możliwość uruchomienia jej w kontenerach. Osobnym zagadnieniem pozostają sposoby zarządzania kontenerami, bazujące na rozwiązaniach takich jak Kubernetes, Mesos, Marathon, Docker Swarm, a także rozwiązaniach chmurowych takich jak np.: ECS AWS-a. Postaramy się przybliżyć Państwu te mechanizmy w kolejnych artykułach.

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.