Generator Docker Compose produkcyjny

Plik compose.yaml dla aplikacji, PostgreSQL, Redis i Nginx z healthcheckami, sekretem w zmiennej i gotowym nginx.conf

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  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

4

Linie pliku

104

Healthchecki

3

Wolumeny nazwane

2

compose.yaml

name: "myapp" services: app: image: "registry.example.com/myapp:1.0.0" restart: unless-stopped environment: APP_ENV: production APP_DEBUG: "false" DB_CONNECTION: pgsql DB_HOST: db DB_PORT: "5432" DB_DATABASE: app DB_USERNAME: app DB_PASSWORD: "${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in the environment}" REDIS_HOST: redis REDIS_PORT: "6379" depends_on: db: condition: service_healthy redis: condition: service_healthy expose: - "9000" networks: - app-net logging: driver: json-file options: max-size: "10m" max-file: "3" db: image: "postgres:17-alpine" restart: unless-stopped environment: POSTGRES_DB: app POSTGRES_USER: app POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in the environment}" healthcheck: test: ["CMD-SHELL", "pg_isready -U app -d app"] interval: 10s timeout: 5s retries: 10 start_period: 30s volumes: - db-data:/var/lib/postgresql/data networks: - app-net logging: driver: json-file options: max-size: "10m" max-file: "3" redis: image: "redis:7.4-alpine" restart: unless-stopped command: ["redis-server", "--appendonly", "yes"] healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 10 volumes: - redis-data:/data networks: - app-net logging: driver: json-file options: max-size: "10m" max-file: "3" nginx: image: "nginx:1.28-alpine" restart: unless-stopped ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro depends_on: app: condition: service_started healthcheck: test: ["CMD-SHELL", "nginx -t"] interval: 30s timeout: 5s retries: 3 networks: - app-net logging: driver: json-file options: max-size: "10m" max-file: "3" networks: app-net: driver: bridge volumes: db-data: redis-data:
2 180 znaków · 178 słów · 105 linii

nginx.conf (montowany jako default.conf)

server { listen 80; server_name _; location / { proxy_pass http://app:9000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
344 znaków · 27 słów · 14 linii

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

Co jest już w pliku, a co musisz dodać sam
KontrolaStatusCo 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

Wartość klucza restart
PolitykaKiedy kontener startuje ponownieWybrana
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

Uruchamiaj w katalogu z compose.yaml
PolecenieCo 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ługaRolaZabezpieczenia i kontrola gotowości
appwłasny obraz aplikacjibrak publicznego portu, tylko expose; zmienne DB_* i REDIS_*; oczekiwanie na zdrowe db i redis; opcjonalne limity CPU i pamięci
dbPostgreSQLhasło przez wymaganą zmienną, pg_isready, wolumen danych, brak publikacji portu
rediscache lub kolejkatrwałość AOF, kontrola redis-cli ping, brak portu hosta
nginxwejście HTTP i reverse proxywersjonowany 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

Nie wpisuj prawdziwego hasła bazy do formularza ani do pliku w repozytorium. Generator przyjmuje wyłącznie nazwę zmiennej, na przykład 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

  1. 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.
  2. Ustaw nazwę zmiennej hasła. Nie podawaj wartości sekretu w generatorze.
  3. Pobierz compose.yaml i nginx.conf do jednego katalogu; dla PHP-FPM popraw blok location.
  4. Ustaw sekret w środowisku, uruchom docker compose config i przejrzyj rozwinięty model. Składnię możesz dodatkowo sprawdzić w walidatorze YAML.
  5. 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.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!