Docker Compose — co to jest i jak uruchomić wiele kontenerów jednym poleceniem

Docker Compose — co to jest i jak uruchomić wiele kontenerów jednym poleceniem
Docker Compose to narzędzie do definiowania i uruchamiania wielu kontenerów Docker za pomocą jednego pliku YAML. Wyjaśniam co to jest, jak działa, jak napisać docker-compose.yml i kiedy go używać.

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.

Docker 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

  1. Compose pobrał obrazy mysql:8.0 i wordpress:latest z Docker Hub.
  2. Uruchomił kontener MySQL z bazą „wordpress” i użytkownikiem „wpuser”.
  3. Uruchomił kontener WordPress podłączony do MySQL.
  4. Zmapował port 80 kontenera WordPress na port 8080 Twojego komputera.
  5. Utworzył volumeny db_data i wp_data do 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 up i 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 run wystarczy. 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.

Picture of Tomasz Zieliński
Tomasz Zieliński

Tomasz zajmuje się tematyką SEO, sztucznej inteligencji i automatyzacji pracy w marketingu internetowym. W swoich artykułach analizuje zmiany w algorytmach wyszukiwarek, rozwój narzędzi AI oraz nowe sposoby tworzenia i optymalizacji treści. Interesuje go przede wszystkim to, jak technologia wpływa na codzienną pracę specjalistów SEO, marketerów i twórców internetowych.

Facebook
Twitter
LinkedIn
Pinterest

Najnowsze Wpisy

Śledź nas