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.