Docker Compose to narzędzie, które pozwala zdefiniować wielokontenerową aplikację w jednym pliku (docker-compose.yml) i uruchomić ją jednym poleceniem: docker compose up. Zamiast ręcznie uruchamiać każdy kontener Docker osobno (baza danych, serwer web, cache, kolejka) — definiujesz wszystko w YAML i Compose robi resztę.
W tym poradniku wyjaśniam co to jest Docker i Docker Compose, jak napisać pierwszy docker-compose.yml, jak uruchomić WordPress + MySQL w 5 minut i kiedy Compose jest potrzebny.
Spis treści
ToggleDocker w 60 sekund — szybkie przypomnienie
Docker to platforma do uruchamiania aplikacji w kontenerach — izolowanych środowiskach, które zawierają aplikację + wszystkie jej zależności (system, biblioteki, konfigurację). Kontener to jak „przenośny serwer”: działa tak samo na Twoim laptopie, na serwerze testowym i na produkcji. „U mnie działa” → „wszędzie działa”.
Obraz (image) = szablon kontenera (np. „WordPress 6.5 na PHP 8.2 z Apache”).
Kontener (container) = uruchomiona instancja obrazu (żywy serwer na podstawie szablonu).
Docker Hub = repozytorium gotowych obrazów (mysql, nginx, wordpress, redis, node — tysiące).
Po co Docker Compose — problem wielu kontenerów
Typowa aplikacja webowa składa się z kilku serwisów:
- Web server (nginx lub Apache) — serwuje stronę
- Aplikacja (PHP, Node.js, Python) — logika biznesowa
- Baza danych (MySQL, PostgreSQL) — dane
- Cache (Redis) — przyspieszenie
- Kolejka (RabbitMQ, Redis Queue) — zadania asynchroniczne
Bez Compose: musisz ręcznie uruchamiać 5 kontenerów z 5 długimi poleceniami docker run, konfigurować sieci, volumeny, zmienne środowiskowe. Przy 5 kontenerach to jeszcze do ogarnięcia. Przy 10+ — koszmar.
Z Compose: opisujesz wszystko w jednym pliku YAML i wpisujesz docker compose up. Compose uruchamia wszystkie serwisy, łączy je siecią, montuje volumeny i ustawia zmienne. Jedno polecenie = cała aplikacja działa.
Jak zainstalować Docker Compose
Docker Compose jest wbudowany w Docker Desktop (Windows, macOS) — jeśli masz Docker Desktop, masz Compose. Na Linuxie:
# Docker Desktop (Windows/macOS): Compose jest wbudowany
# Linux (jeśli nie masz Docker Desktop):
sudo apt update
sudo apt install docker-compose-plugin
# Sprawdź wersję:
docker compose version
Uwaga: starsza wersja to docker-compose (z łącznikiem, Python). Nowa (v2) to docker compose (bez łącznika, wbudowany plugin). Używaj nowej.
Pierwszy docker-compose.yml — WordPress + MySQL
Najprostszy praktyczny przykład: WordPress z MySQL — lokalnie, w 5 minut, bez instalowania PHP, Apache ani MySQL na Twoim komputerze.
Utwórz plik docker-compose.yml:
services:
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: supersecret
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
depends_on:
- db
volumes:
db_data:
wp_data:
Uruchom:
docker compose up -d
Otwórz przeglądarkę: http://localhost:8080 — zobaczysz instalator WordPressa. Bez instalowania PHP, Apache, MySQL — wszystko działa w kontenerach.
Co się właśnie stało
- Compose pobrał obrazy
mysql:8.0iwordpress:latestz Docker Hub. - Uruchomił kontener MySQL z bazą „wordpress” i użytkownikiem „wpuser”.
- Uruchomił kontener WordPress podłączony do MySQL.
- Zmapował port 80 kontenera WordPress na port 8080 Twojego komputera.
- Utworzył volumeny
db_dataiwp_datado trwałego przechowywania danych (dane nie znikają po wyłączeniu kontenerów).
Struktura pliku docker-compose.yml
services: # Lista serwisów (kontenerów)
nazwa_serwisu:
image: # Obraz z Docker Hub (lub Dockerfile)
build: # Ścieżka do Dockerfile (alternatywa dla image)
ports: # Mapowanie portów host:kontener
environment:# Zmienne środowiskowe
volumes: # Montowanie folderów (trwałe dane)
depends_on: # Zależności (uruchom X przed Y)
restart: # Polityka restartu (always, unless-stopped, on-failure)
networks: # Sieci (opcjonalne, Compose tworzy domyślną)
command: # Nadpisanie domyślnej komendy startu
volumes: # Definicje trwałych volumenów
networks: # Definicje sieci (opcjonalne)
Najważniejsze komendy Docker Compose
# Uruchom wszystkie serwisy (w tle)
docker compose up -d
# Uruchom i zobacz logi (foreground)
docker compose up
# Zatrzymaj wszystkie serwisy
docker compose down
# Zatrzymaj i usuń volumeny (DANE ZNIKNĄ!)
docker compose down -v
# Pokaż status serwisów
docker compose ps
# Pokaż logi
docker compose logs
# Pokaż logi konkretnego serwisu
docker compose logs wordpress
# Restartuj serwis
docker compose restart wordpress
# Uruchom komendę wewnątrz kontenera
docker compose exec wordpress bash
# Przebuduj obrazy (po zmianie Dockerfile)
docker compose build
# Przebuduj i uruchom
docker compose up -d --build
Przykład 2: Node.js + PostgreSQL + Redis
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://user:pass@db:5432/myapp
REDIS_URL: redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:16
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata:
build: . oznacza: zbuduj obraz z Dockerfile w bieżącym katalogu (zamiast pobierać z Docker Hub). Idealne dla własnych aplikacji.
Kiedy używać Docker Compose
- Lokalne środowisko deweloperskie — jeden
docker compose upi masz całą aplikację (web + baza + cache) gotową do kodowania. Nowy developer dołącza do projektu → klonuje repo →docker compose up→ pracuje. Zero „zainstaluj PHP 8.2, MySQL 8.0, Redis 7, skonfiguruj Apache”. - Testowanie — CI/CD pipeline uruchamia testy z Docker Compose (aplikacja + testowa baza + mock services).
- Prototypowanie — chcesz przetestować WordPress z WooCommerce, albo Next.js z PostgreSQL, albo n8n z Redis? Compose + gotowe obrazy z Docker Hub = 5 minut.
- Self-hosting — uruchamiasz własne instancje narzędzi: Gitea, n8n, Uptime Kuma, Nextcloud, Plausible Analytics — wszystkie mają gotowe docker-compose.yml.
Kiedy NIE Docker Compose
- Produkcja na skalę — Compose nie zarządza wieloma serwerami. Do orkiestracji kontenerów na wielu maszynach: Kubernetes (K8s), Docker Swarm, Nomad.
- Jedna aplikacja bez zależności — jeśli masz jeden kontener (np. statyczna strona na nginx), zwykły
docker runwystarczy. Compose jest do wielu kontenerów.
Docker Compose vs Kubernetes — porównanie
| Cecha | Docker Compose | Kubernetes |
|---|---|---|
| Złożoność | Prosty (1 plik YAML) | Złożony (wiele plików, koncepcji) |
| Skalowanie | 1 serwer | Wiele serwerów (klaster) |
| Auto-healing | Restart policy (basic) | Tak (pełne: replica sets, health checks) |
| Load balancing | Nie (ręcznie lub Traefik) | Wbudowane |
| Najlepszy do | Development, małe self-hosting | Produkcja, enterprise, duża skala |
| Krzywa uczenia | 30 minut | Tygodnie–miesiące |
Zasada: Compose do developmentu i małych deploymentów. Kubernetes gdy potrzebujesz skalować na wielu serwerach z auto-healingiem i load balancingiem. 95% projektów zaczyna od Compose i przechodzi na K8s dopiero gdy rośnie obciążenie.
Najczęściej zadawane pytania
Czy Docker Compose jest darmowy?
Tak — Docker Compose jest open source i darmowy. Docker Desktop (który zawiera Compose) jest darmowy do użytku osobistego i małych firm (do 250 pracowników i $10M przychodu). Powyżej: licencja Docker Business ($24/mc/user).
Czy dane znikają po docker compose down?
docker compose down — zatrzymuje kontenery, ale zachowuje volumeny (dane w bazie, pliki WordPress). docker compose down -v — usuwa WSZYSTKO, łącznie z volumenami (dane znikają bezpowrotnie). Ważna różnica!
Jak zaktualizować obraz w Compose?
docker compose pull # pobierz nowe wersje obrazów
docker compose up -d # zrestartuj z nowymi obrazami
Czy mogę uruchomić Compose na serwerze produkcyjnym?
Tak — wiele małych i średnich aplikacji działa na Compose w produkcji (na jednym serwerze). Dodaj reverse proxy (Traefik lub nginx-proxy) do obsługi HTTPS i routingu domen. Dla większych deploymentów: migruj na Kubernetes.
docker-compose.yml vs compose.yml — jaka różnica?
Obie nazwy działają. compose.yml (bez „docker-„) to nowa konwencja od Compose v2. docker-compose.yml to stara konwencja (v1). W praktyce: używaj którejkolwiek — Compose rozpoznaje obie.
Podsumowanie
Docker Compose to „jeden plik, jedno polecenie” do uruchamiania wielokontenerowych aplikacji. Piszesz docker-compose.yml (serwisy, porty, volumeny, zmienne), wpisujesz docker compose up -d — i masz gotowe środowisko: WordPress + MySQL, Node.js + Postgres + Redis, albo cokolwiek innego. Idealne do local developmentu, prototypowania i self-hostingu. Krzywa uczenia: 30 minut od „co to jest” do działającego WordPressa w kontenerze.






