DevOps i automatyzacja Średnio zaawansowany 60 min

PostgreSQL w środowisku aplikacji

Uruchomisz osobny kontener bazy, sprawdzisz gotowość i wykonasz pierwsze zapytanie bez wystawiania portu publicznie.

Wróć do listy lekcji

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

Utwórz w katalogu ćwiczenia nieśledzony plik 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.

Flow nauki
  1. Teoria
  2. Przykład
  3. Ćwiczenie
  4. Quiz
  5. Praktyka
  6. Podsumowanie