7.1 Montowanie wolumenów
Montowanie wolumenów i sieci w Docker Compose pozwala tworzyć elastyczne i efektywne aplikacje wielokontenerowe. Wolumeny (volumes) są używane do przechowywania danych, które powinny być zachowane poza kontenerami, podczas gdy sieci (networks) zapewniają interakcję między kontenerami. W tym wykładzie szczegółowo omówimy, jak używać wolumenów i sieci w Docker Compose.
Wolumeny w Dockerze pozwalają przechowywać dane poza kontenerami, dzięki czemu są one dostępne nawet po zatrzymaniu lub usunięciu kontenerów. Jest to szczególnie przydatne do przechowywania danych baz danych, plików logów i innych danych, które muszą być trwałe.
Rodzaje wolumenów:
- Wolumeny nazwane (Named Volumes): zarządzane przez Dockera i przechowywane w specjalnym katalogu na hoście.
- Wolumeny powiązane (Bind Mounts): montowane w kontenerze z określonego katalogu na hoście.
Definiowanie wolumenów w Docker Compose
Przykład wolumenów nazwanych
W tym przykładzie został utworzony nazwany wolumen postgres-data
, który jest montowany w katalogu /var/lib/postgresql/data
wewnątrz kontenera db
.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Przykład wolumenów powiązanych
W tym przykładzie lokalne katalogi i pliki nginx.conf
oraz html
są montowane w kontenerze web
jako wolumeny powiązane.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 Montowanie sieci
Sieci w Docker Compose umożliwiają kontenerom interakcję między sobą. Każdy kontener może być podłączony do jednej lub kilku sieci, co zapewnia izolację i zarządzanie ruchem.
Typy sieci:
- Sieci mostkowe (Bridge): domyślnie kontenery podłączają się do sieci mostkowej, która umożliwia ich interakcję na jednym hoście.
- Sieci nakładkowe (Overlay): używane do komunikacji kontenerów uruchomionych na różnych hostach w klastrze Docker Swarm.
- Sieciowe wtyczki (Network Plugins): pozwalają używać zewnętrznych sterowników sieciowych dla bardziej złożonych konfiguracji.
Przykład tworzenia i użycia niestandardowych sieci
W tym przykładzie tworzone są dwie niestandardowe sieci front-end i back-end. Serwis app jest podłączony do obu sieci, serwis web tylko do front-end, a serwis db tylko do back-end.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
Praktyczne porady:
- Używanie nazwanych wolumenów: nazwane wolumeny są zarządzane przez Docker i zapewniają łatwość użycia i zarządzania danymi. Nazwane wolumeny można podłączyć do kilku serwisów jednocześnie. Na przykład, serwis backend zapisuje logi, a serwis monitorujący analizuje je i powiadamia w przypadku wykrycia błędów na poziomie
error
. - Podział sieci: używanie kilku sieci umożliwia izolowanie różnych części aplikacji i kontrolowanie ich interakcji.
- Przechowywanie plików konfiguracyjnych: użyj powiązanych wolumenów do montowania plików konfiguracyjnych, co pozwala łatwo zmieniać konfigurację bez ponownej budowy obrazów.
- Bezpieczeństwo sieci: ogranicz dostęp do sieci, aby tylko niezbędne kontenery mogły się komunikować, co zwiększa bezpieczeństwo aplikacji.
7.3 Przykłady użycia wolumenów i sieci
Przykłady użycia wolumenów i sieci w Docker Compose:
Przykład 1: Aplikacja z serwerem www i bazą danych
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
W tym przykładzie:
- Serwer www nginx i baza danych PostgreSQL są połączone z jedną siecią webnet, co pozwala im współdziałać. Jeśli jest jedna sieć, nie trzeba jej wskazywać - zostanie stworzona domyślna sieć.
- Dane bazy danych przechowywane są w nazwanym wolumenie db-data, co zapewnia ich trwałość po ponownym uruchomieniu kontenerów.
Przykład 2: Aplikacja z kilkoma poziomami
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
W tym przykładzie:
- Stworzono dwie sieci: front-tier i back-tier.
- Serwis frontend jest połączony z obiema sieciami, co pozwala mu współdziałać zarówno z backend, jak i z zewnętrznymi klientami.
- Serwisy backend i database są połączone tylko z siecią back-tier, co zapewnia ich izolację i współpracę.
- Dane serwisów backend i database są przechowywane w oddzielnych nazwanych wolumenach backend-data i db-data.
GO TO FULL VERSION