Generator Docker Compose produkcyjny
Plik compose.yaml dla aplikacji, PostgreSQL, Redis i Nginx z healthcheckami, sekretem w zmiennej i gotowym nginx.conf
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Opcje
Generator wstawi odwołanie do zmiennej środowiskowej, nigdy jej wartość.
Zmieniono ustawienia. Kliknij „Generuj compose” albo naciśnij Enter, aby odświeżyć plik.
Usługi
Linie pliku
Healthchecki
Wolumeny nazwane
compose.yaml
nginx.conf (montowany jako default.conf)
Zapisz plik jako compose.yaml, ustaw zmienną hasła w .env lub w środowisku, a potem sprawdź wynik poleceniem docker compose config.
Lista kontrolna dla tego pliku
| Kontrola | Status | Co to znaczy |
|---|---|---|
| Wersje obrazów | OK | Każdy obraz ma jawną wersję lub digest. Tag latest jest odrzucany. |
| Hasło bazy | OK | W pliku jest tylko odwołanie do zmiennej POSTGRES_PASSWORD. Ustaw jej wartość w pliku .env obok compose.yaml albo w środowisku serwera. |
| Porty bazy i Redisa | OK | Nie są publikowane na hoście, dostępne tylko w sieci app-net. |
| Healthchecki usług | OK | Liczba usług z healthcheckiem: 3. |
| Healthcheck aplikacji | Uwaga | Generator nie zna Twojej aplikacji, więc nie dodaje jej healthchecka. Dodaj własny. |
| Rotacja logów | OK | Sterownik json-file: 10 MB i 3 pliki na kontener. |
| Limity zasobów | Uwaga | Brak limitu: wyciek pamięci w aplikacji może zająć całą pamięć serwera. |
| Utwardzanie (no-new-privileges) | Wyłączone | Opcjonalne. Włącz w sekcji Opcje i przetestuj aplikację. |
| TLS (HTTPS) | Uwaga | Nginx nasłuchuje tylko na HTTP (port hosta 80). Certyfikaty i HTTPS skonfiguruj osobno albo postaw przed nim proxy z TLS. |
| Port aplikacji 9000 | Uwaga | Port 9000 to zwykle PHP-FPM (protokół FastCGI), a nginx.conf poniżej robi proxy HTTP. Dla PHP-FPM użyj fastcgi_pass app:9000 zamiast proxy_pass. |
Ściąga: polityki restartu
| Polityka | Kiedy kontener startuje ponownie | Wybrana |
|---|---|---|
| unless-stopped | Zawsze, ale nie po restarcie demona Dockera, jeśli kontener zatrzymano ręcznie. Dobry wybór domyślny na serwer. | Tak |
| always | Zawsze. Ręcznie zatrzymany kontener wstanie znów po restarcie demona Dockera. | |
| on-failure | Tylko gdy proces zakończył się kodem wyjścia różnym od zera. | |
| no | Nigdy. To domyślne zachowanie Dockera; generator tej polityki nie oferuje. |
Komendy po wygenerowaniu pliku
| Polecenie | Co robi |
|---|---|
| docker compose config | Sprawdza składnię i pokazuje plik po podstawieniu zmiennych. Uruchom przed pierwszym startem. |
| docker compose up -d | Tworzy i uruchamia usługi w tle. |
| docker compose ps | Pokazuje stan usług, także wynik healthchecków. |
| docker compose logs -f app | Śledzi logi wybranej usługi (tu: app). |
| docker compose down | Zatrzymuje i usuwa kontenery oraz sieć. Wolumeny nazwane zostają, usuwa je dopiero opcja -v. |
Warto wiedzieć
Hasło poza plikiem
W YAML trafia tylko odwołanie w postaci ${NAZWA:?komunikat}. Docker Compose przerwie start, jeśli zmienna jest nieustawiona lub pusta, więc baza nie ruszy bez hasła. Wartość wpisz do pliku .env obok compose.yaml albo ustaw w środowisku serwera. Nie dodawaj .env do repozytorium.
Kolejność startu
Aplikacja czeka na bazę i Redisa do momentu, aż ich healthcheck przejdzie (service_healthy). Nginx czeka na aplikację tylko do jej uruchomienia (service_started), bo generator nie zna healthchecka Twojej aplikacji. Gdy go dodasz, zmień warunek na service_healthy.
Porty i sieć
Klucz expose udostępnia port tylko innym kontenerom w sieci app-net i nie publikuje go na serwerze. Na zewnątrz wystawiony jest wyłącznie Nginx (ports). Baza i Redis nie mają publikowanych portów, więc nie są dostępne z internetu przez Dockera.
Wolumeny i aktualizacje
Wolumeny nazwane przeżywają docker compose down i zmianę obrazu. Usuwa je dopiero down -v, więc najpierw zrób kopię bazy. Przy zmianie głównej wersji PostgreSQL stary katalog danych jest niezgodny i wymaga migracji (dump i odtworzenie albo pg_upgrade).
Logi, limity, uprawnienia
Rotacja logów chroni dysk przed zapełnieniem. Opcja no-new-privileges blokuje podnoszenie uprawnień w kontenerze; włącz ją i przetestuj aplikację. Limity pamięci i CPU (deploy.resources.limits) generator dodaje tylko aplikacji, bazie i Redisowi dobierz je osobno.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator Docker Compose produkcyjny: bezpieczna baza stosu
Generator produkcyjnego Docker Compose składa plik compose.yaml dla aplikacji, PostgreSQL, Redis i Nginx, a przy zaznaczonym Nginx także pasujący nginx.conf. Wynik używa wersjonowanych obrazów, trwałych wolumenów, prywatnej sieci, healthchecków, rotacji logów oraz zależności czekających na gotowość bazy i cache. Hasło nie trafia do YAML: plik wymaga ustawienia wskazanej zmiennej środowiskowej. Oba pliki skopiujesz albo pobierzesz jednym przyciskiem.
Co znajduje się w wygenerowanym stosie
| Usługa | Rola | Zabezpieczenia i kontrola gotowości |
|---|---|---|
app | własny obraz aplikacji | brak publicznego portu, tylko expose; zmienne DB_* i REDIS_*; oczekiwanie na zdrowe db i redis; opcjonalne limity CPU i pamięci |
db | PostgreSQL | hasło przez wymaganą zmienną, pg_isready, wolumen danych, brak publikacji portu |
redis | cache lub kolejka | trwałość AOF, kontrola redis-cli ping, brak portu hosta |
nginx | wejście HTTP i reverse proxy | wersjonowany obraz, wybrany port hosta, nginx.conf tylko do odczytu, test nginx -t, zależność od aplikacji |
Generator nie dodaje przestarzałego klucza version; współczesny Docker Compose korzysta z Compose Specification. Pole name nadaje projektowi stabilną nazwę, więc kontenery, sieć i wolumeny nie zmieniają prefiksu zależnie od nazwy katalogu. Nazwa może mieć do 63 znaków: małe litery, cyfry, „-” i „_”.
Przyciski „Laravel” i „Node” ustawiają komplet czterech usług oraz port aplikacji (9000 albo 3000), a „Minimalny” zostawia samą aplikację. Preset nie podmienia obrazu aplikacji, więc wpisany adres z rejestru zostaje.
Wersje obrazów zamiast latest
Tag latest nie mówi, jaki kod uruchomi się po następnym pobraniu obrazu. Dlatego formularz wymaga tagu albo digestu @sha256: dla każdego obrazu: aplikacji, PostgreSQL, Redis i Nginx, a latest odrzuca z komunikatem błędu. Domyślnie baza używa gałęzi postgres:17-alpine, Redis redis:7.4-alpine, a Nginx nginx:1.28-alpine. W krytycznym wdrożeniu przypnij pełny tag poprawki lub digest sha256, a aktualizacje wykonuj kontrolowanym procesem.
Obraz aplikacji jest projektem użytkownika, więc generator nie może znać właściwego numeru. Domyślne registry.example.com/myapp:1.0.0 to przykład, który trzeba zastąpić adresem obrazu z własnego rejestru. Generator Dockerfile pomoże przygotować jego definicję, ale przed wdrożeniem obraz nadal należy zbudować, przetestować i przeskanować.
Sekrety poza plikiem compose.yaml
POSTGRES_PASSWORD, i wstawia interpolację ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in the environment}. Compose przerwie start z tym komunikatem, jeżeli zmienna jest nieustawiona lub pusta.To samo odwołanie trafia do POSTGRES_PASSWORD w usłudze db i do DB_PASSWORD w usłudze app, więc obie strony zawsze używają jednego hasła. Użytkownik i baza mają stałą nazwę app. Wartość ustaw w pliku .env obok compose.yaml (dodanym do .gitignore), w środowisku serwera albo w menedżerze sekretów CI/CD. Jeśli potrzebujesz szablonu nazw bez wartości, użyj generatora .env.example. W organizacji z dedykowanym magazynem sekretów można po wygenerowaniu zastąpić zmienną mechanizmem secrets i dostosować aplikację do odczytu pliku z /run/secrets.
Healthchecki i kolejność uruchamiania w Docker Compose
Samo uruchomienie procesu bazy nie oznacza, że przyjmuje ona połączenia. PostgreSQL dostaje test pg_isready -U app -d app co 10 s, z 10 próbami i 30-sekundowym okresem startowym, a Redis polecenie redis-cli ping co 10 s. Aplikacja używa długiej formy depends_on z warunkiem service_healthy, dlatego startuje dopiero po pozytywnym wyniku kontroli usług danych. Nginx czeka tylko na rozpoczęcie usługi aplikacji (service_started) i co 30 s weryfikuje własną konfigurację przez nginx -t.
Uniwersalnego healthchecka aplikacji dla dowolnego obrazu nie ma: PHP-FPM, Node, proces worker i aplikacja HTTP mają inne punkty gotowości. Po skopiowaniu pliku dodaj test dopasowany do obrazu, na przykład zapytanie do lekkiego endpointu /health, i zmień warunek Nginx na service_healthy. To uczciwsze niż test procesu, który dawałby zielony stan mimo niedziałających zależności. Gotowe polecenia testów podpowie generator healthcheck Docker.
Sieć, porty i trwałość danych
Wszystkie usługi należą do prywatnej sieci app-net ze sterownikiem bridge. PostgreSQL i Redis nie mają sekcji ports, więc nie są wystawione na interfejs hosta. Aplikacja używa expose, które dokumentuje port dostępny wewnątrz sieci, ale go nie publikuje. Jedynym wejściem z hosta jest Nginx: domyślnie mapowanie "80:80", a po zmianie pola portu na przykład "8080:80", gdy przed kontenerem działa już inne proxy.
Po zaznaczeniu wolumenów dane PostgreSQL i Redis trafiają do nazwanych wolumenów db-data i redis-data zadeklarowanych na najwyższym poziomie. Generator nie montuje generycznego katalogu aplikacji, bo jego ścieżka zależy od własnego obrazu i błędny mount mógłby zasłonić pliki. Odznaczenie opcji usuwa montowania i deklaracje wolumenów usług danych, więc plik pozostaje składniowo poprawny, ale dane staną się nietrwałe. Produkcyjnie pozostaw wolumeny włączone i opracuj niezależny backup bazy; wolumen nie jest kopią zapasową.
Wygenerowany nginx.conf i pułapka PHP-FPM
Przy zaznaczonym Nginx narzędzie wypisuje blok server nasłuchujący na porcie 80, z proxy_pass http://app:PORT i nagłówkami Host, X-Real-IP, X-Forwarded-For oraz X-Forwarded-Proto. Plik zapisz jako nginx.conf obok compose.yaml; Compose montuje go jako /etc/nginx/conf.d/default.conf. To konfiguracja dla aplikacji, która sama mówi HTTP, czyli typowo Node na porcie 3000.
Port 9000 (domyślny i z presetu Laravel) to zwykle PHP-FPM, który używa protokołu FastCGI, a nie HTTP. Z proxy_pass Nginx zwróci błąd 502. Lista kontrolna pod wynikiem ostrzega o tym; zamień wtedy blok location na fastcgi_pass app:9000 z parametrami FastCGI. Pamiętaj też, że Nginx w kontenerze PHP-FPM nie widzi plików aplikacji, więc statyczne zasoby trzeba udostępnić osobno. Bloki dla PHP i plików statycznych pomoże złożyć konfigurator bloków location Nginx.
Logi, limity zasobów i utwardzanie
Rotacja logów jest domyślnie włączona: każda usługa dostaje sterownik json-file z max-size: "10m" i max-file: "3", czyli najwyżej około 30 MB logów na kontener. Bez tego logi mogą zapełnić dysk, o ile limitu nie ustawia konfiguracja demona Docker.
Opcja „Limity zasobów aplikacji” dodaje do usługi app blok deploy.resources.limits z pamięcią w formacie 512m lub 2g i CPU od 0,01 do 64 rdzeni (np. 0.5). Bazie i Redisowi limity dobierz sam, bo zależą od rozmiaru danych. Opcja no-new-privileges:true trafia do security_opt wszystkich usług i blokuje podnoszenie uprawnień w kontenerze; jest domyślnie wyłączona, bo część obrazów jej nie toleruje, więc po włączeniu przetestuj aplikację. Polityka restartu do wyboru to unless-stopped (domyślna), always albo on-failure.
Uruchomienie produkcyjnego compose.yaml i kontrola konfiguracji
- Wybierz preset albo usługi, podaj nazwę projektu, port procesu aplikacji i wersjonowane obrazy. Nginx wymaga zaznaczonej aplikacji, bo generowana konfiguracja zakłada reverse proxy.
- Ustaw nazwę zmiennej hasła. Nie podawaj wartości sekretu w generatorze.
- Pobierz
compose.yamlinginx.confdo jednego katalogu; dla PHP-FPM popraw bloklocation. - Ustaw sekret w środowisku, uruchom
docker compose configi przejrzyj rozwinięty model. Składnię możesz dodatkowo sprawdzić w walidatorze YAML. - Uruchom
docker compose up -d, a potem sprawdźdocker compose ps, logi, stan healthchecków i dostępność endpointu aplikacji.
Jeśli potrzebujesz prostszego pliku do pracy lokalnej, generator Docker Compose oferuje szerszy zestaw usług deweloperskich. Wariant produkcyjny celowo unika bind mountu całego kodu i skupia się na niezmiennym obrazie z rejestru.
Najczęściej zadawane pytania
Czy ten plik jest gotowy do wdrożenia bez zmian?
Jest bezpieczną bazą, ale trzeba podać własny obraz aplikacji, ustawić sekret, sprawdzić nginx.conf (dla PHP-FPM zmienić na FastCGI), dodać healthcheck aplikacji oraz dopasować backup, monitoring, limity zasobów i TLS do infrastruktury.
Dlaczego nie ma klucza version?
Nowoczesny Docker Compose wdraża bieżącą specyfikację i traktuje pole version jako przestarzałe. Jego pominięcie usuwa ostrzeżenia i nie odbiera funkcji użytych w pliku.
Dlaczego baza i Redis nie publikują portów?
Usługi komunikują się nazwami w prywatnej sieci Compose. Brak mapowania portu hosta ogranicza powierzchnię ataku; administrację najlepiej prowadzić przez kontrolowany tunel lub jednorazowy kontener w tej samej sieci.
Czy docker compose down usuwa dane bazy?
Nie. Polecenie usuwa kontenery i sieć, a nazwane wolumeny zostają; kasuje je dopiero docker compose down -v. Przy zmianie głównej wersji PostgreSQL stary katalog danych wymaga migracji przez dump i odtworzenie albo pg_upgrade.
Czy nazwany wolumen wystarcza jako backup?
Nie. Wolumen zachowuje dane przy wymianie kontenera, ale nie chroni przed usunięciem, awarią hosta ani błędem aplikacji. Potrzebny jest regularny backup z testem odtworzenia.
Jak bezpiecznie dodać HTTPS?
Wygenerowany Nginx obsługuje tylko HTTP. Zakończ TLS w zarządzanym load balancerze lub reverse proxy albo zamontuj certyfikaty jako sekrety i dodaj osobną konfigurację Nginx z portem 443. Nie kopiuj prywatnego klucza do obrazu ani repozytorium.