Docker Compose

Docker Compose to super narzędzie, jeśli nasze konfiguracje kontenerów zaczynają się rozrastać.

Jeśli chcemy aby nasz kontener był uruchomiony w danej sieci, był podpięty pod wolumeny to całe polecenie zaczyna się rozrastać. Najgorsze jest to, że trzeba takie komendy gdzie trzymać…

I tutaj z pomocą przychodzi Docker Compose jako sposób na przechowywanie całej tej konfiguracji.

Konfiguracja

Konfiguracja jest przechowywana w plikach yaml (lub skróconej wersji yml). Przykładowo docker-compose.yaml lub docker-compose.yml.

Określanie wersji składni

Na początku należy zdefiniować wersję składni, której będziemy używać przy definicji. Dostępne wersje można sprawdzić tutaj:

Definiujemy kontenery (serwisy)

Aby rozpocząć definicję kontenera (serwisu) należy wpisać nazwę serwisu w sekcji services:

version: '3.8'
services:
  backend:
    ...
  frontend:
    ...
Obraz dla kontenera

Aby zdefiniować obraz dla kontenera można skorzystać z trzech opcji:
-wprowadzić nazwę obrazu (opcja image):

version: '3.8'
services:
  backend: 
    image: node

-wprowadzić ścieżkę do pliku Dockerfile (opcja build):

version: '3.8'
services:
  backend: 
    build: ./backend/Dockerfile

-szersza konfiguracja (rozszerzona opcja build):

version: '3.8'
services:
  backend:
    build:
      dockerfile: Dockerfile
      context: ./backend/
      args:
        NETWORK_NAME: network_name

dockerfile to ścieżka do pliku, context to kontekst wykonania pliku Dockerfile (warto tutaj zaznaczyć, że czasami nie jest to ten sam katalog, w którym znajduje się plik Dockerfile). Opcja args to odpowiednik opcji ARG w Dockerfile. Pełna specyfikacja sekcji build.

Definicja wolumenów

Wolumeny definiujemy w sekcji volumes (na tym samym poziomie wcięcia co services):

version: '3.8'
services:
  backend:
    ...
volumes:
  db_volume:

Dzięki czemu możemy ich później użyć w sekcji build:

version: '3.8'
services:
  backend:
    build:
      ...
    volumes:
      db_volume:/data-db/
volumes:
  db_volume:

Możliwe jest też podpięcie lokalnego katalogu (bind mounts):

version: '3.8'
services:
  backend:
    build:
      ...
    volumes:
      /some/local/path:/some/container/path/

Zmienne środowiskowe

Zmienne środowiskowe można przekazać bezpośrednio:

version: '3.8'
services:
  backend:
    build:
      ...
    environment:
      - LOGIN=LOGIN
      - PASSWORD=PASSWORD

Lub też za pomocą wskazania na plik:

version: '3.8'
services:
  backend:
    build:
      ...
    env_file:
      - ./backend/.env

Wskazanie „otwartych” portów

Docker Compose wspiera także możliwość „otwarcia” portów (pierwszy port to host a drugi to port kontenera):

version: '3.8'
services:
  backend:
    build:
      ...
    ports:
      - 3456:80

Zależności pomiędzy serwisami

Możliwe jest także zdefiniowanie zależności od innych kontenerów – czyli wymuszenie kolejności poprzez użycie depends_on:

version: '3.8'
services:
  db:
    ...
  backend:
    depends_on:db

Dzięki temu mamy pewność, że serwis backend zostanie uruchomiony dopiero po uruchomieniu serwisu db.

Kwestia sieci

Dostęp do Internetu

Kontenery powstające za pomocą narzędzie Docker Compose, tak samo jak kontenery podnoszone za pomocą docker run, mają domyślnie dostęp do zasobów Internetowych.

Porozumiewanie pomiędzy kontenerami

Dzięki Docker Compose nie jest konieczne tworzenie specjalnej sieci aby kontenery mogły się ze sobą komunikować. Docker Compose tworzy automatycznie sieć pomiędzy kontenerami wchodzącymi w skład definicji Docker Compose (oczywiście możliwe jest przypisanie kontenerów do dodatkowych sieci ręcznie).

Aby odwołać się do jakiegoś kontenera, należy użyć nazwy serwisu lub też nazwy kontenera.

Dostęp do komputera hosta

Dostęp do komputera hosta odbywa się na identycznych zasadach jak przy docker run – należy użyć specjalnej nazwy – host.docker.internal.

Uruchomienie

Aby uruchomić zdefiniowane serwisy należy użyć komendy:

* warto tutaj wspomnieć, że aby komenda zadziałała to plik z konfiguracją musi mieć nazwę docker-compose.yml lub docker-compose.yaml. Docker domyślnie szuka takich właśnie plików w aktualnym katalogu.

Aby zatrzymać serwisy:

Aby móc w jednym oknie terminala uruchomić serwisy i móc później je zatrzymać można użyć opcji -d (detached mode):

docker compose up -d
docker compose down

Warto zajrzeć

1. https://docs.docker.com/compose/

Pozostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *