Jednym z najprostszych sposobów na wdrożenie całkiem sporej ilości aplikacji jest użycie Docker Container. Istnieje mnóstwo witryn hostingowych, które oferują hosting kontenerów, lub możesz zdecydować się na samodzielne hostowanie usługi za pomocą serwera dedykowanego lub VPS. Ręczne utrzymanie kilku różnych kontenerów docker ze zmiennymi środowiskowymi, zmapowanymi portami i woluminami może być dość uciążliwe. Tutaj z pomocą przychodzi Docker Compose.
Docker Compose
Jak podaje dokumentacja Dockera:
Compose to narzędzie do definiowania i uruchamiania wielokontenerowych aplikacji Docker.
Oznacza to, że będziemy mogli w łatwy sposób tworzyć, uruchamiać i zarządzać wieloma skonteneryzowanymi aplikacjami. Na potrzeby tego artykułu stworzymy dwie usługi: serwer backendowy PlayFramework oraz bazę danych PostgreSQL. Jeśli potrzebujesz hostować jakąś aplikację frontendową lub jakiś panel administracyjny możesz dodać więcej usług do pliku docker-compose
.
Serwis baz danych – PostgreSQL
Pierwszą rzeczą, którą będziemy musieli zrobić jest stworzenie pliku docker-compose.yml
. Po tym możemy przystąpić do konfiguracji. Pierwszą rzeczą, którą musimy dodać jest element najwyższego poziomu: services
w pierwszej linii naszego pliku. Pierwszą usługą, którą stworzymy będzie nasza baza danych. Do tego celu użyjemy obrazu PostgreSQL. Usługa będzie się nazywać db
. Upewnij się, że twoja usługa jest o jedno tiret głębiej niż element services
, a wszystkie inne elementy mają taką samą liczbę tiretów, jak w przykładzie poniżej.
db: image: postgres container_name: db restart: always ports: - "5432:5432" volumes: - ./docker/volumes/db:/var/lib/postgresql/data environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=database-name
Let’s explain this configuration:
db:
– nazwa usługiimage: postgres
– określa obraz, którego chcemy użyć. W tym przypadku jest to postgres.container_name: db
– nazwa kontenera, który zostanie utworzonyrestart: always
– ustawia politykę restartu dla konteneraports
– mapuje porty kontenera na porty maszyny głównejvolumes
– tworzy wolumen Docker, aby przechowywać dane bazy danych na maszynie głównejenvironment
– ustawia zmienne środowiskowe kontenera. Obraz PostgreSQL pozwala nam na utworzenie użytkownika i bazy danych podczas inicjalizacji kontenera poprzez ustawienie zmiennych środowiskowych.
Usługa aplikacji serwera PlayFramework
Następną usługą, którą będziemy potrzebować jest nasz serwer backendu Play. Do tego celu użyjemy obrazu aplikacji Play. Jeśli nie wiesz jak go stworzyć, możesz sprawdzić ten artykuł. Nazwiemy tę usługę play
.
play: image: your-apps-name:latest container_name: your-apps-name restart: always ports: - "9000:9000" volumes: - ./conf:/opt/docker/conf - ./docker/volumes/play/files:/opt/docker/your-app-name_files - ./docker/volumes/play/logs:/opt/docker/logs environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=database-name depends_on: - db
W tym serwisie mamy jeden nowy element: depends_on
. Dzięki temu nasza aplikacja do zabawy będzie się uruchamiać po db
, wktóry jest naszym kontenerem bazy danych. Jeśli nie wiesz dlaczego coś jest ustawione tak jak jest w tej usłudze, to prawdopodobnie znajdziesz odpowiedź w tym artykule, w którym pokazujemy jak stworzyć obraz serwera Play.
Ponieważ używamy zmiennych środowiskowych do przekazania poświadczeń bazy danych i nazwy do naszego kontenera serwera Play, musimy zmienić plik konfiguracyjny Play, aby użyć tych zmiennych.
default.driver = "org.postgresql.Driver" default.url = "jdbc:postgresql://db:5432/"${?POSTGRES_DB} default.username = ${?POSTGRES_USER} default.password = ${?POSTGRES_PASSWORD}
Powyższa konfiguracja bazy danych umieści określone zmienne w określonych miejscach. Po pierwsze, ponieważ używamy bazy PostgreSQL musimy ustawić odpowiedni sterownik. Następnie w adresie url chcemy połączyć się z bazą danych hostowaną przez serwis db
na porcie 5432. Możemy po prostu użyć nazwy naszej usługi z określonym portem jako części naszego adresu url. Następnie umieszczając ${?POSTGRES_DB}
dołączymy nazwę bazy danych ze zmiennej środowiskowej do adresu url "jdbc:postgresql://db:5432/"
. Nazwę użytkownika i hasło do bazy danych ustawimy w ten sam sposób – za pomocą ${?VARIABLE_NAME}
.
Environment Variables
Jak możesz zauważyć, musieliśmy zduplikować referencje Możemy to uprościć, używając zmiennych środowiskowych w naszym pliku docker-compose.yml
. W tym celu stworzymy plik .env
w tym samym katalogu co poprzedni plik. Powinien on wyglądać tak:
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_DB=database-name
APP_NAME=play-app-server
Ostatnia zmienna APP_NAME
będzie przechowywała nazwę aplikacji Play.
Teraz musimy podrasować plik docker-compose
aby używał tych zmiennych. Musimy zastąpić poświadczenia bazy danych przez ${?VARIABLE_NAME}
. Twój cały plik docker-compose
powinien wyglądać podobnie do tego z poniższego przykładu.
services: db: image: postgres container_name: db restart: always ports: - "5432:5432" volumes: - ./docker/volumes/db:/var/lib/postgresql/data environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} play: image: rakbud-server:latest container_name: ${APP_NAME} restart: always ports: - "9000:9000" volumes: - ./conf:/opt/docker/conf - ./docker/volumes/play/files:/opt/docker/your-app-name_files - ./docker/volumes/play/logs:/opt/docker/logs environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} depends_on: - db
Ostatnim krokiem jest otwarcie naszego terminala, wpisanie cd
do katalogu z plikiem docker-compose
i uruchomienie:
docker-compose config
To polecenie sprawdzi, czy utworzony docker-compose
jest poprawny. Jeśli jest, to wypisze go do terminala, gdzie można sprawdzić, czy zmienne środowiskowe zostały ustawione poprawnie.
Teraz, gdy mamy poprawny plik docker-compose
możemy uruchomić
docker-compose up -d
Ten komentarz uruchomi nasze kontenery w trybie detached, czyli będzie uruchamiał kontenery w tle. Aby uzyskać logi z kontenerów należy uruchomić:
docker-compose logs