4.1 Inicjalizacja
Na tym etapie skonfigurujemy plik compose.yaml
, żeby uruchomić wszystkie serwisy naszej aplikacji multi-container. Plik compose.yaml
będzie zawierał ustawienia dla frontendu, backendu i bazy danych, a także definicję sieci i woluminów.
Definiowanie wersji Docker Compose
Zaczniemy od wskazania wersji Docker Compose. W tym przykładzie używana jest wersja 3:
version: '3'
4.2 Definiowanie usług
Usługa 1: Frontend (ReactJS)
Zdefiniujmy usługę dla frontendu, która będzie zbudowana z katalogu frontend i będzie dostępna na porcie 3000:
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
Usługa 2: Backend (Flask)
Zdefiniujmy usługę dla backendu, która będzie zbudowana z katalogu backend. Zależy ona od usługi bazy danych i będzie dostępna na porcie 5000:
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
Gdzie:
- depends_on: wskazuje, że usługa backend zależy od usługi database. Oznacza to, że baza danych zostanie uruchomiona przed uruchomieniem backendu.
- environment: konfiguruje zmienne środowiskowe dla połączenia z bazą danych.
Usługa 3: Database (PostgreSQL)
Zdefiniujmy usługę dla bazy danych, używając oficjalnego obrazu postgres:13. Skonfigurujemy zmienne środowiskowe do tworzenia bazy danych i danych uwierzytelniających użytkownika:
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
Gdzie:
-
environment
: konfiguruje zmienne środowiskowe do tworzenia bazy danych i użytkownika podczas uruchamiania kontenera. -
volumes
: łączy wolumen db-data do trwałego przechowywania danych.
4.3 Konfiguracja sieci i woluminów
Zdefiniujemy sieci i woluminy, które będą używane przez nasze serwisy:
networks:
task-network:
driver: bridge
volumes:
db-data:
Gdzie:
- networks: definiuje sieć
task-network
z typem driverabridge
, która będzie używana do komunikacji między kontenerami. - volumes: definiuje wolumin
db-data
do przechowywania danych bazy danych.
4.4 Pełny plik docker-compose.yml
Teraz połączymy wszystkie części w jeden plik docker-compose.yml
:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
networks:
task-network:
driver: bridge
volumes:
db-data:
Wyjaśnienia dotyczące konfiguracji
-
build
: wskazuje ścieżkę do katalogu zDockerfile
do budowy obrazu. -
ports
: otwiera porty na hoście, aby uzyskać dostęp do usług. -
depends_on
: wskazuje, że usługa zależy od innej, aby zapewnić odpowiednią kolejność uruchamiania. -
environment
: ustawia zmienne środowiskowe dla usług. -
networks
: definiuje sieć do komunikacji między kontenerami. -
volumes
: definiuje woluminy do trwałego przechowywania danych.
4.5 Uruchamianie aplikacji
Teraz, gdy plik compose.yaml
jest skonfigurowany, możemy uruchomić wszystkie serwisy za pomocą jednej komendy:
docker compose up
Ta komenda stworzy i uruchomi kontenery dla frontendu, backendu i bazy danych, używając ustawień zdefiniowanych w compose.yaml
.
Sprawdzanie działania
Po uruchomieniu kontenerów upewnij się, że wszystkie serwisy działają poprawnie:
- Frontend: otwórz przeglądarkę i przejdź pod adres http://localhost:3000, aby sprawdzić działanie frontendu.
- Backend: otwórz przeglądarkę i przejdź pod adres http://localhost:5000, aby sprawdzić działanie backendu.
- Baza danych: upewnij się, że kontener bazy danych jest uruchomiony i dostępny przez połączenie sieciowe z backendem.
GO TO FULL VERSION