Docker Compose
Jak działa
Programista opisuje aplikację w pliku compose.yaml, używając elementów najwyższego poziomu: services (komponenty obliczeniowe aplikacji), networks (sposób komunikacji usług między sobą), volumes (trwałe dane współdzielone przez usługi) oraz opcjonalnie configs i secrets. Każda usługa wskazuje obraz do pobrania albo kontekst budowania, porty, zmienne środowiskowe, zależności (depends_on), healthchecki i podpięte wolumeny. Komenda docker compose up czyta plik, buduje lub pobiera obrazy, tworzy wspólną sieć, startuje kontenery we właściwej kolejności i spina je nazwami usług jako hostami DNS. Komendy pokrewne (down, ps, logs, exec, build) obejmują resztę cyklu życia. Compose V2 ignoruje przestarzały element version i interpretuje plik zgodnie z Compose Specification.
Rozwiązany problem
Uruchomienie realnej aplikacji wymaga zwykle kilku współpracujących kontenerów (API, baza danych, cache, kolejka, serwowanie modelu) połączonych w sieć i trzymających dane w wolumenach. Robienie tego ręcznie wieloma komendami docker run jest żmudne, niepowtarzalne i trudne do wersjonowania. Compose rozwiązuje to, opisując cały stos jako jeden plik w repozytorium i odtwarzając identyczne środowisko jedną komendą.
Komponenty
Pojedynczy plik YAML (domyślnie compose.yaml, alternatywnie compose.yml) w katalogu roboczym, opisujący usługi, sieci, wolumeny oraz opcjonalnie configs i secrets. Jest źródłem prawdy o stosie i trafia do repozytorium.
Każda usługa to kontener (lub ich zestaw) uruchamiany z określonego obrazu lub kontekstu budowania, z portami, zmiennymi środowiskowymi, zależnościami i healthcheckami. To główny budulec pliku Compose.
Usługi komunikują się ze sobą przez sieci. Compose tworzy domyślną sieć dla projektu, dzięki czemu usługi adresują się nawzajem po nazwach jako hostach DNS; można też definiować dodatkowe, izolowane sieci.
Usługi przechowują i współdzielą dane trwałe w wolumenach, które żyją niezależnie od cyklu życia kontenera. Typowo używane dla baz danych, indeksów wektorowych czy cache modeli.
Wtyczka CLI (Compose V2, napisana w Go) wywoływana jako docker compose. Komendy up/down/ps/logs/exec/build pokrywają start, zatrzymanie, podgląd statusu, logi i polecenia jednorazowe. Starsza wersja v1 była osobnym narzędziem w Pythonie wywoływanym jako docker-compose.
Implementacja
Stare materiały używają komendy docker-compose (v1, Python), podczas gdy aktualny Compose V2 to wtyczka CLI wywoływana jako docker compose. Różnice obejmują m.in. ignorowanie elementu version w V2.
Domyślnie depends_on zapewnia tylko kolejność startu kontenerów, nie czeka aż usługa (np. baza danych) będzie faktycznie gotowa do przyjmowania połączeń.
Compose zarządza stosem zwykle na jednym hoście i nie zapewnia schedulingu wielowęzłowego, samonaprawy ani autoskalowania między maszynami — to zadania dla Kubernetes czy Swarm.
Publikowanie tych samych portów hosta przez kilka stosów powoduje konflikty, a bind-mounty katalogów hosta bywają źródłem problemów z uprawnieniami i wydajnością (szczególnie na macOS/Windows).
Ewolucja
Pierwsza publiczna wersja beta narzędzia (0.0.1) wg Wikipedii; projekt wywodzi się z wcześniejszego narzędzia Fig (poprzednik Compose).
Compose v1 wydany w 2014 r., napisany w Pythonie i wywoływany jako docker-compose; wersja produkcyjna 1.0 udostępniona 16 października 2014 r.
Wprowadzenie formatu pliku Compose w wersji 2.x.
Wprowadzenie formatu pliku Compose w wersji 3.x.
Compose V2 ogłoszony w 2020 r.: przepisany w Go, wywoływany jako docker compose (wtyczka CLI). Ignoruje element version i w całości opiera interpretację pliku na otwartej Compose Specification.
Compose v5 wydany w 2025 r., funkcjonalnie tożsamy z Compose V2, ale wprowadza oficjalny SDK w Go do programistycznej integracji.
Hiperparametry (konfigurowalne osie)
Zestaw usług-kontenerów tworzących aplikację; podstawowy wymiar konfiguracji pliku Compose.
Dla każdej usługi: gotowy obraz do pobrania albo lokalny kontekst budowania (Dockerfile).
Publikacja portów kontenera na hoście; częste źródło konfliktów przy wielu stosach.
Konfiguracja usług przez zmienne środowiskowe i pliki .env (np. klucze API, adresy modeli).
Kolejność startu usług oraz warunki gotowości; depends_on sam w sobie czeka tylko na start, nie na pełną gotowość.
Warunkowe włączanie podzbiorów usług (np. dev vs. pełny stos) w jednym pliku Compose.