Docker Compose automatyzuje tworzenie i uruchamianie wielu kontenerów. Znacznie upraszcza on pracę i eliminuje błąd ludzki zwłaszcza jeśli musimy uruchomić wiele kontenerów zależnych od siebie.
Pozwala na wykonanie czynności w warunkach, kolejności i kolejności i czasie. Dlatego często mówi się Docker Orchestration, czy też jak to jest w nazwie Compose (ang. kompozycja) – jako określenie zasad współpracy kontenerów.
Całość orkiestry definiujemy w postaci pliku, który zawiera wszystkie występujące po sobie czynności. W tym artykule przedstawię Ci praktyczny przykład jego budowy oraz wykorzystywania w praktyce.
Przykładowy scenariusz wykorzystania
Załóżmy, że mamy dwie aplikacje. Pierwsza aplikacja to API które udostępnia i zapisuje informacje w bazie danych. Druga aplikacja to klient, która komunikuje się z tym API i dokonuje określonych działań.
W przypadku klasycznego zarządzania kontenerami musimy pobrać obraz bazy danych, który jest niezbędny działania aplikacji z API. Następnie zbudować obrazy – osobny dla aplikacji z API oraz osobny dla klienta. Co w rezultacie sprawia, że musimy zarządzać trzeba obrazami.
Problematyczne staje się uruchamianie każdego obrazu osobno, pamiętając o prawidłowej kolejności i warunkach uruchomienia. Jednakże trzy obrazy są do ogarnięcia, a co jeśli tych obrazów mamy znacznie więcej? Tu z pomocą przychodzi Docker Compose który umożliwia zautomatyzowanie całego procesu.
Docker Compose – definiowanie zależności
W pierwszej kolejności tworzymy Dockerfile dla aplikacji API:
FROM openjdk:8u201-jdk-alpine3.9 ADD target/springboot-api-docker-0.0.1-SNAPSHOT.jar . EXPOSE 12121 CMD java -jar springboot-api-docker-0.0.1-SNAPSHOT.jar
A następnie dla aplikacji klienckiej:
FROM openjdk:8u201-jdk-alpine3.9 ADD target/springboot-client-docker-0.0.1-SNAPSHOT.jar . EXPOSE 12121 CMD java -jar springboot-client-docker-0.0.1-SNAPSHOT.jar
Ostatnim krokiem jest utworzenie pliku docker-compose.yml. Plik ten zawiera informacje dotyczące kontenerów, które przez niego mają zostać uruchomione:
version: '3' # wersja docker compose services: # serwisy jakie sa zarządzane przez bierzący docker compose api: # nazwa serwisu (dowolna, unikalna) build: ./springboot-api-docker # sciezka do pliku Dockerfile dla tego kontenera ports: - "10101:10101" # ustawienie mapowania portu depends_on: # zaleznosc - do uruchomienia tego serwisu wymagane wczesniejsze uruchomienie serwisu databases - databases client: build: ./springboot-client-docker ports: - "12121:12121" depends_on: - api databases: container_name: 'databases' # nazwa dla kontenera image: mysql # obraz bazy danych MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: animaldb MYSQL_USER: user ports: - "3306:3306"
Zwróć uwagę, że został uwzględniony w tym przypadku obraz dla bazy danych. Jego sposób sposób konfiguracji i definiowania zmiennych środowiskowych jest opisany na mysql – Docker Hub.
Natomiast wykorzystując polecenie depends_on zyskujemy możliwość sterowania kolejności uruchomienia.
Uruchomienie Docker Compose
Aby uruchomić wszystkie trzy obrazy należy przejść do katalogu, w którym znajduje się plik docker-compose.yml, a następnie wykonać w CLI komendę:
docker-compose up
Przewodnik wideo
Wideo, w trakcie którym pokazuje jak krok po kroku zrealizować opisane czynności przedstawiam we Wideo na moim kanale YouTube. Materiał tym bardziej ciekawy, gdyż przedstawia jak wiele błędów można popełnić w pozornie prostych czynnościach 😉