CodeGym /Kursy /Docker SELF /Tworzenie docker-compose.yml

Tworzenie docker-compose.yml

Docker SELF
Poziom 15 , Lekcja 2
Dostępny

3.1 Plik compose.yaml

Plik compose.yaml (lub jedna z następujących opcji: docker-compose.yaml, docker-compose.yml, compose.yml) — to podstawowy plik konfiguracji używany przez Docker Compose do definiowania i zarządzania aplikacjami wielokontenerowymi. Określa, które kontenery (usługi) powinny być uruchomione, jak się komunikują między sobą i jakie zasoby są im potrzebne.

Dla jednolitości w tym wykładzie będziemy używać wariantu compose.yaml, ponieważ jest on zalecany dla nowszych wersji Docker Compose.

Struktura pliku compose.yaml

Plik compose.yaml składa się z kilku sekcji, z których każda opisuje różne aspekty konfiguracji aplikacji. Główne sekcje obejmują:

  1. version: wskazuje wersję pliku Compose (na przykład '3.9').
  2. services: opisuje kontenery (usługi), ich ustawienia i zależności.
  3. volumes: definiuje wolumeny do przechowywania danych między kontenerami a hostem.
  4. networks: konfiguruje sieci, przez które usługi komunikują się między sobą.

3.2 Podstawowe dyrektywy

1. version

Dyrektywa version określa wersję składni Docker Compose używaną w pliku compose.yaml. Na moment pisania tego artykułu najbardziej aktualna jest wersja 3, w szczególności jej aktualizacje, takie jak 3.8 i 3.9.

Yaml

version: '3.9'

2. services

Sekcja services definiuje kontenery, które Compose powinien utworzyć i uruchomić. Każdy serwis to osobny kontener z określoną konfiguracją.

Przykład:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

W tym przykładzie zdefiniowano dwa serwisy: web i db. Serwis web korzysta z obrazu nginx:latest i otwiera port 80. Serwis db korzysta z obrazu mongo:latest i podłącza wolumen do przechowywania danych.

3. volumes

Sekcja volumes służy do definiowania wolumenów, które można podłączyć do kontenerów w celu przechowywania danych. Jest to przydatne do zachowania danych podczas ponownego uruchamiania kontenerów.

Przykład:

Yaml

volumes:
  mongo-data:

4. networks

Sekcja networks pozwala zdefiniować niestandardowe sieci, w których będą działać kontenery. Zapewnia to izolację i konfigurację połączeń sieciowych. Jeśli sieci nie są określone, Docker Compose utworzy domyślną sieć, a wszystkie serwisy zostaną do niej podłączone.

Przykład:

Yaml

networks:
  front-end:
  back-end:

3.3 Dyrektywy do konfiguracji usług

Podstawowe dyrektywy do konfiguracji usług:

1. image

Dyrektywa image wskazuje obraz, który będzie używany do stworzenia kontenera.

Przykład:

Yaml

services:
  web:
    image: nginx:latest

2. build

Dyrektywa build jest używana do wskazania ścieżki do Dockerfile, który ma być użyty do stworzenia obrazu.

Przykład:

Yaml

services:
  app:
    build: ./app

3. ports

Dyrektywa ports określa porty, które mają być otwarte i przekierowane z maszyny hosta na kontener.

Przykład:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

Dyrektywa volumes montuje woluminy w kontenerach, co pozwala na zachowanie danych pomiędzy restartami kontenerów.

Przykład:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

Dyrektywa environment ustala zmienne środowiskowe dla kontenera.

Przykład:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

Dyrektywa depends_on wskazuje, że dana usługa zależy od innych usług i powinna być uruchamiana po nich.

Ważne! Przy uruchamianiu usługi nie ma 100% gwarancji, że wszystkie niezbędne do jej działania usługi są w pełni gotowe. Zostaną uruchomione — tak, ale dalsza funkcjonalność nie jest gwarantowana. Ten problem rozwiązuje się za pomocą health-check, ale o tym później.

Przykład:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

Dyrektywa command pozwala nadpisać komendę, która zostanie wykonana przy uruchomieniu kontenera.

Przykład:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

Dyrektywa networks podłącza usługę do jednej lub kilku sieci.

Przykład:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 Pełny przykład

Przykład pełnego pliku compose.yaml

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

W tym przykładzie:

  • Zdefiniowane są trzy service'y: web, app i db.
  • web używa obrazu Nginx, montuje plik konfiguracyjny i zależy od service'u app.
  • app budowany jest z lokalnego Dockerfile, montuje kod źródłowy aplikacji i używa zmiennych środowiskowych.
  • db używa obrazu MongoDB i montuje volume do przechowywania danych.
  • Utworzono dwa volume'y i dwie sieci dla izolacji i zarządzania interakcjami service'ów.

Uwaga: jeden volume to mongo-data, a drugi to zamontowany katalog z host-machine (np. ./app).

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION