PostgreSQL w środowisku aplikacji
Uruchomisz osobny kontener bazy, sprawdzisz gotowość i wykonasz pierwsze zapytanie bez wystawiania portu publicznie.
1. Krótka teoria
Aplikacja i baza mają odrębne cykle życia. Obraz aplikacji nie powinien zawierać plików PostgreSQL ani hasła bazy. Oficjalny obraz postgres:17 przy pierwszym uruchomieniu inicjalizuje bazę z wartości POSTGRES_USER, POSTGRES_DB i POSTGRES_PASSWORD. W tym ćwiczeniu wartości pochodzą z lokalnego pliku orders-db.env, który nie jest śledzony przez Git i ma ograniczony dostęp. Przekazywanie zmiennych przez env ułatwia konfigurację, ale nie stanowi pełnej ochrony sekretów; w środowisku produkcyjnym trzeba użyć odpowiedniego mechanizmu sekretów. PostgreSQL nasłuchuje zwykle na porcie 5432 wewnątrz kontenera. Aplikacja w tej samej sieci może łączyć się po nazwie app-db, bez publikowania portu bazy na hoście. Łańcuch połączenia opisuje schemat, użytkownika, hasło, host, port i nazwę bazy; znaki specjalne w haśle wymagają poprawnego kodowania albo parametrów sterownika. Nazwany volume chroni pliki danych przed usunięciem kontenera. pg_isready sprawdza gotowość serwera, a psql wykonuje zapytania SQL. Gotowość serwera nie dowodzi jeszcze, że schemat aplikacji jest aktualny.
2. Przykłady komend
docker volume create app-db-data
Tworzy trwałe miejsce na pliki bazy.
$ docker volume create app-db-data
docker network create orders-net
Tworzy prywatną sieć aplikacji i bazy.
$ docker network create orders-net
docker run -d --name app-db --network orders-net --env-file ./orders-db.env -v app-db-data:/var/lib/postgresql/data postgres:17
Uruchamia PostgreSQL z lokalną konfiguracją i volume, bez publikacji portu.
$ docker run -d --name app-db --network orders-net --env-file ./orders-db.env -v app-db-data:/var/lib/postgresql/data postgres:17
docker exec app-db pg_isready -U orders -d orders
Sprawdza gotowość bazy dla wskazanego użytkownika i nazwy.
$ docker exec app-db pg_isready -U orders -d orders
docker exec app-db psql -U orders -d orders -c 'SELECT 1;'
Wykonuje proste zapytanie w działającym kontenerze.
$ docker exec app-db psql -U orders -d orders -c 'SELECT 1;'
docker logs --tail 50 app-db
Sprawdza komunikaty startowe i błędy PostgreSQL.
$ docker logs --tail 50 app-db
3. Zadanie praktyczne
orders-db.env zawierający testowe wartości POSTGRES_USER=orders, POSTGRES_DB=orders i własne hasło testowe w POSTGRES_PASSWORD. Uruchom app-db z volume, bez -p. Sprawdź pg_isready, wykonaj SELECT 1 i zapisz elementy adresu postgresql://orders:…@app-db:5432/orders. Nie zapisuj hasła w notatce.
4. Typowe błędy
- Publikowanie portu 5432, choć korzysta z niego tylko aplikacja w prywatnej sieci.
- Commitowanie pliku z hasłem do repozytorium.
- Przechowywanie plików bazy wyłącznie w warstwie kontenera.
- Zakładanie, że zmiana POSTGRES_PASSWORD po inicjalizacji automatycznie zmieni hasło istniejącego użytkownika.
- Uznawanie pg_isready za test poprawności schematu aplikacji.
5. Podsumowanie
PostgreSQL uruchamiaj jako osobną usługę z volume i kontrolowaną konfiguracją. Port 5432 może pozostać wyłącznie w prywatnej sieci. Gotowość sprawdza pg_isready, a podstawowe połączenie i zapytanie psql.