Docker Compose to potężne narzędzie, które rewolucjonizuje sposób definiowania i uruchamiania wielokontenerowych aplikacji Docker. Zamiast zarządzać każdym kontenerem oddzielnie, Docker Compose pozwala zdefiniować całe środowisko w jednym pliku konfiguracyjnym, a następnie uruchomić je jednym poleceniem. W tym artykule nauczysz się, jak efektywnie wykorzystać Docker Compose do zarządzania złożonymi aplikacjami.

⚡ Ekspresowe Podsumowanie:

  1. Definicja usług w pliku YAML: Docker Compose używa deklaratywnego podejścia do konfigurowania aplikacji w pliku docker-compose.yml.
  2. Łatwe zarządzanie zależnościami: Określanie relacji między kontenerami, sieciami i wolumenami w jednym miejscu.
  3. Szybkie wdrażanie środowisk: Uruchamianie wielu kontenerów jednym poleceniem, idealne dla rozwoju i testowania.
  4. Doskonałe rozwiązanie dla mikrousług: Zarządzanie złożonymi aplikacjami składającymi się z wielu niezależnych usług.

🗺️ Spis Treści - Twoja Mapa Drogowa


📌 Czym jest Docker Compose i kiedy go używać?

Docker Compose to narzędzie do definiowania i uruchamiania aplikacji Docker składających się z wielu kontenerów. Używając Docker Compose, opisujesz wszystkie usługi, sieci i wolumeny potrzebne aplikacji w jednym pliku YAML, a następnie uruchamiasz całe środowisko jednym poleceniem.

Kiedy warto używać Docker Compose:

  • Środowiska programistyczne - szybkie tworzenie izolowanych środowisk lokalnych
  • Automatyczne testowanie - uruchamianie testów dla całych aplikacji i ich zależności
  • Pojedyncze aplikacje z wieloma usługami - zarządzanie aplikacjami składającymi się z bazy danych, backendu, frontendu itd.
  • Demonstracje i prototypy - łatwe udostępnianie działających aplikacji
  • CI/CD potoki - automatyzacja procesu wdrażania

✨ Pro Tip: Docker Compose jest idealny dla lokalnego rozwoju i testowania, ale dla produkcyjnych wdrożeń na dużą skalę warto rozważyć bardziej rozbudowane narzędzia orkiestracji, takie jak Kubernetes.

🔧 Instalacja Docker Compose

Przed rozpoczęciem pracy z Docker Compose, musisz mieć zainstalowany Docker. Następnie możesz zainstalować Docker Compose.

Dla systemów Linux:

# Pobierz najnowszą stabilną wersję Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# Nadaj uprawnienia wykonywania
sudo chmod +x /usr/local/bin/docker-compose

# Sprawdź instalację
docker-compose --version

Dla systemów z Docker Desktop (Windows / macOS):

Docker Compose jest już dołączony do Docker Desktop, więc nie wymaga osobnej instalacji.

Uwaga: Nowsze wersje Docker CLI zawierają polecenie docker compose (bez myślnika), które zapewnia funkcjonalność podobną do docker-compose. W tym przewodniku będziemy używać tradycyjnej składni docker-compose.

📄 Struktura pliku docker-compose.yml

Plik docker-compose.yml to serce Docker Compose. W tym pliku definiujesz wszystkie usługi, sieci, wolumeny i inne zasoby potrzebne aplikacji.

Podstawowa struktura:

version: '3'  # Wersja składni Docker Compose

services:
  # Definicje kontenerów/usług
  webapp:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./website:/usr/share/nginx/html

  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: app_db
    volumes:
      - db_data:/var/lib/mysql

volumes:
  # Definicje wolumenów
  db_data:

networks:
  # Definicje sieci (opcjonalnie)
  backend_network:
    driver: bridge

Główne sekcje pliku:

  1. version - określa wersję formatu Docker Compose
  2. services - definicje poszczególnych kontenerów/usług
  3. volumes - definicje trwałych wolumenów danych
  4. networks - konfiguracja sieci między kontenerami

🔍 Kluczowe opcje konfiguracyjne usług

Dla każdej usługi w Docker Compose możemy skonfigurować szereg opcji. Oto najważniejsze z nich:

Podstawowe opcje:

services:
  example_service:
    # Obraz Docker do użycia
    image: nazwa_obrazu:tag

    # LUB budowanie własnego obrazu z Dockerfile
    build: 
      context: ./ścieżka/do/katalogu
      dockerfile: Dockerfile.dev

    # Mapowanie portów (host:kontener)
    ports:
      - "8080:80"

    # Zmienne środowiskowe
    environment:
      KEY: value
      ANOTHER_KEY: another_value

    # LUB korzystanie z pliku .env
    env_file:
      - ./common.env
      - ./app.env

    # Montowanie wolumenów (host:kontener)
    volumes:
      - ./data:/app/data
      - db_data:/var/lib/mysql

    # Zależności - usługa zostanie uruchomiona po uruchomieniu zależności
    depends_on:
      - database
      - redis

Zarządzanie sieciami:

services:
  frontend:
    image: my-frontend
    networks:
      - frontend_network

  backend:
    image: my-backend
    networks:
      - frontend_network
      - backend_network

  database:
    image: postgres
    networks:
      - backend_network

networks:
  frontend_network:
  backend_network:

Limity zasobów:

services:
  resource_limited:
    image: heavy-app
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

✨ Pro Tip: Używaj depends_on do określania zależności między usługami, ale pamiętaj, że Docker Compose czeka tylko na uruchomienie kontenera, a nie na to, aż usługa będzie gotowa do pracy (np. baza danych w pełni zainicjowana).

🚀 Podstawowe polecenia Docker Compose

Docker Compose oferuje szereg poleceń do zarządzania cyklem życia aplikacji:

Uruchamianie i zatrzymywanie:

# Uruchom wszystkie usługi zdefiniowane w docker-compose.yml
docker-compose up

# Uruchom w tle (tryb odłączony)
docker-compose up -d

# Zatrzymaj usługi
docker-compose stop

# Zatrzymaj i usuń kontenery, sieci
docker-compose down

# Zatrzymaj, usuń kontenery, sieci i wolumeny
docker-compose down -v

Zarządzanie usługami:

# Sprawdź status usług
docker-compose ps

# Uruchom konkretną usługę
docker-compose up -d service_name

# Wyświetl logi
docker-compose logs

# Wyświetl logi konkretnej usługi i śledź je
docker-compose logs -f service_name

# Wykonaj polecenie w uruchomionym kontenerze
docker-compose exec service_name command

# Uruchom polecenie w nowym kontenerze
docker-compose run service_name command

Zarządzanie obrazami:

# Zbuduj/przebuduj obrazy
docker-compose build

# Zbuduj bez użycia cache
docker-compose build --no-cache

# Zbuduj konkretną usługę
docker-compose build service_name

💻 Praktyczne przykłady zastosowań Docker Compose

Zobaczmy kilka praktycznych przykładów zastosowania Docker Compose w rzeczywistych scenariuszach.

Przykład 1: Aplikacja WordPress z bazą MySQL

version: '3'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    volumes:
      - db_data:/var/lib/mysql

volumes:
  wordpress_data:
  db_data:

Aby uruchomić tę aplikację, po prostu zapisz powyższy kod w pliku docker-compose.yml i wykonaj:

docker-compose up -d

WordPress będzie dostępny pod adresem http://localhost:8080.

Przykład 2: Stack aplikacji webowej (MERN)

version: '3'

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - REACT_APP_API_URL=http://localhost:5000
    depends_on:
      - backend

  backend:
    build: ./backend
    ports:
      - "5000:5000"
    volumes:
      - ./backend:/app
      - /app/node_modules
    environment:
      - MONGODB_URI=mongodb://db:27017/myapp
    depends_on:
      - db

  db:
    image: mongo:4.4
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db

volumes:
  mongo_data:

Ten przykład konfiguruje trójwarstwową aplikację składającą się z frontendu React, backendu Node.js i bazy danych MongoDB.

Przykład 3: Mikroserwisy z Nginx jako proxy

version: '3'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - service1
      - service2

  service1:
    build: ./service1
    expose:
      - "8000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/service1
    depends_on:
      - db

  service2:
    build: ./service2
    expose:
      - "8000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/service2
    depends_on:
      - db
      - redis

  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_MULTIPLE_DATABASES=service1,service2

  redis:
    image: redis:6
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

Ten przykład pokazuje bardziej złożoną architekturę mikroserwisów z serwerem Nginx jako reverse proxy, dwoma usługami, wspólną bazą danych PostgreSQL i Redis dla cache'owania.

🛠️ Zaawansowane techniki i najlepsze praktyki

Zmienne środowiskowe i pliki .env

Docker Compose może korzystać z plików .env do zarządzania zmiennymi środowiskowymi:

# Plik .env
COMPOSE_PROJECT_NAME=myproject
DB_PASSWORD=secret
EXTERNAL_PORT=8080

Następnie w pliku docker-compose.yml:

services:
  web:
    image: nginx
    ports:
      - "${EXTERNAL_PORT}:80"

  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

Rozszerzanie konfiguracji z wieloma plikami

Możesz podzielić konfigurację na wiele plików, np. podstawową i produkcyjną:

# Base configuration
docker-compose -f docker-compose.yml up -d

# Extend with production settings
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Skalowanie usług

Docker Compose pozwala na skalowanie wybranych usług:

# Uruchomienie 3 instancji usługi worker
docker-compose up -d --scale worker=3

Zdrowe praktyki:

  1. Używaj wolumenów nazwanych zamiast montowania bezwzględnych ścieżek.
  2. Określaj wersje obrazów - używanie tagów latest może prowadzić do niespodziewanych aktualizacji.
  3. Grupuj zmienne środowiskowe w plikach .env.
  4. Rozdzielaj konfiguracje dla różnych środowisk (dev, staging, production).
  5. Dokumentuj zależności między usługami za pomocą depends_on.

Uwaga: Chociaż Docker Compose obsługuje skalowanie usług, nie posiada zaawansowanych funkcji orkiestracji jak Kubernetes (np. automatyczne skalowanie, rolling updates, self-healing). Dla bardziej złożonych scenariuszy produkcyjnych warto rozważyć bardziej wyspecjalizowane narzędzia.

🔒 Bezpieczeństwo i Docker Compose

Bezpieczeństwo jest kluczowym aspektem przy pracy z kontenerami Docker. Oto kilka wskazówek dotyczących bezpieczeństwa:

Bezpieczne zarządzanie sekretami

Zamiast umieszczać poufne dane bezpośrednio w pliku docker-compose.yml, używaj zmiennych środowiskowych lub zewnętrznych rozwiązań:

services:
  webapp:
    image: myapp
    secrets:
      - db_password
    environment:
      - DB_PASSWORD_FILE=/run/secrets/db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt

Minimalizowanie uprawnień

Ogranicz uprawnienia kontenerów:

services:
  restricted_service:
    image: myservice
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    read_only: true
    security_opt:
      - no-new-privileges:true

Regularne aktualizacje obrazów

Upewnij się, że regularnie aktualizujesz obrazy, aby zawierały najnowsze poprawki bezpieczeństwa:

# Pobierz najnowsze wersje obrazów
docker-compose pull

# Uruchom z nowymi obrazami
docker-compose up -d

🚫 Częste problemy i ich rozwiązania

Problem 1: Kontenery nie komunikują się ze sobą

# Sprawdź, czy kontenery są w tej samej sieci
docker-compose exec service1 ping service2

# Upewnij się, że używasz nazw usług jako hostname'ów

Problem 2: Zmiany w Dockerfile nie są uwzględniane

# Wymuś przebudowę obrazów
docker-compose build --no-cache
docker-compose up -d

Problem 3: Problemy z uprawnieniami do wolumenów

# Sprawdź właściciela plików w kontenerze
docker-compose exec service_name ls -la /ścieżka/do/katalogu

# Zmień uprawnienia na hoście lub użyj użytkownika w Dockerfile
USER 1000:1000

Problem 4: Usługa zależna nie jest gotowa podczas uruchamiania

# W pliku docker-compose.yml
services:
  webapp:
    depends_on:
      - db
    command: sh -c "while ! nc -z db 5432; do sleep 1; done && npm start"

📊 Monitorowanie i debugowanie

Monitorowanie zasobów:

# Wyświetl wykorzystanie zasobów
docker stats

# Bardziej szczegółowe informacje o konkretnym kontenerze
docker stats container_id

Debugowanie:

# Połącz się z kontenerem
docker-compose exec service_name bash

# Sprawdź logi
docker-compose logs -f service_name

# Sprawdź zmienne środowiskowe wewnątrz kontenera
docker-compose exec service_name env

🔄 Integracja z CI/CD

Docker Compose można łatwo zintegrować z popularnymi systemami CI/CD:

GitLab CI/CD przykład:

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - docker-compose build

test:
  stage: test
  script:
    - docker-compose run --rm app npm test

deploy:
  stage: deploy
  script:
    - docker-compose up -d
  only:
    - master

GitHub Actions przykład:

name: Docker Compose CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Build containers
      run: docker-compose build
    - name: Run tests
      run: docker-compose run --rm app npm test
    - name: Deploy (only on main)
      if: github.ref == 'refs/heads/main'
      run: docker-compose up -d

🏁 Podsumowanie - Twoja droga do wielokontenerowej doskonałości

Gratulacje! Poznałeś teraz podstawy i zaawansowane techniki używania Docker Compose do zarządzania wieloma kontenerami jednocześnie. Podsumujmy kluczowe zagadnienia:

  1. Docker Compose pozwala definiować całe środowiska wielokontenerowe w jednym pliku YAML
  2. Możesz łatwo zarządzać zależnościami między usługami, sieciami i wolumenami
  3. Jedno polecenie wystarcza, aby uruchomić całe środowisko aplikacji
  4. Docker Compose doskonale sprawdza się w środowiskach rozwojowych, testowych i dla prostszych wdrożeń produkcyjnych
  5. Zaawansowane funkcje, takie jak zmienne środowiskowe, rozszerzone konfiguracje i skalowanie, zwiększają elastyczność

Docker Compose to potężne narzędzie, które znacznie upraszcza pracę z wielokontenerowymi aplikacjami, pozwalając skupić się na rozwijaniu funkcjonalności zamiast na zarządzaniu infrastrukturą.

🚀 Potrzebujesz profesjonalnego hostingu do uruchamiania aplikacji kontenerowych?

Sprawdź ofertę serwerów VPS w IQHost

Nasze serwery VPS oferują idealną platformę do uruchamiania aplikacji kontenerowych z Dockerem i Docker Compose, zapewniając wydajność, niezawodność i pełną kontrolę nad środowiskiem.

❓ FAQ - Odpowiedzi na Twoje Pytania

Jaka jest różnica między Docker Compose a Kubernetes?
Docker Compose to proste narzędzie do zarządzania wieloma kontenerami na pojedynczym hoście, idealne dla środowisk rozwojowych i mniejszych wdrożeń. Kubernetes to kompleksowa platforma orkiestracji kontenerów zaprojektowana do zarządzania klastrami wielu hostów, z zaawansowanymi funkcjami jak automatyczne skalowanie, rolling updates i self-healing.

Czy Docker Compose jest odpowiedni do użycia produkcyjnego?
Docker Compose może być używany w małych i średnich wdrożeniach produkcyjnych, szczególnie na pojedynczym serwerze. Jednak dla większych, krytycznych systemów produkcyjnych wymagających wysokiej dostępności, automatycznego skalowania i zaawansowanego zarządzania, lepszym wyborem będą narzędzia jak Kubernetes, Docker Swarm czy nomad.

Jak zarządzać sekretami w Docker Compose?
Docker Compose oferuje wsparcie dla sekretów, ale w podstawowej formie (jako pliki). Dla bardziej zaawansowanego zarządzania sekretami można użyć zmiennych środowiskowych, zewnętrznych magazynów sekretów (HashiCorp Vault, AWS Secrets Manager) lub Docker Swarm dla lepszej integracji z sekretami.

Czy mogę używać Docker Compose z istniejącymi kontenerami?
Tak, Docker Compose może zarządzać istniejącymi kontenerami, o ile są one zgodne z definicją w pliku docker-compose.yml. Jednak zwykle Docker Compose tworzy nowe kontenery zgodnie z konfiguracją.

Jak aktualizować usługi bez przestojów przy użyciu Docker Compose?
Docker Compose samo w sobie nie oferuje zaawansowanych strategii wdrażania bez przestojów. Dla prostych przypadków możesz użyć docker-compose up -d --no-deps --build service_name aby zaktualizować pojedynczą usługę. Dla bardziej zaawansowanych scenariuszy lepiej użyć Kubernetes lub Docker Swarm.

Czy ten artykuł był pomocny?

Wróć do listy wpisów
WordPress Hosting
7× szybszy NVMe SSD LSCache
Hosting zoptymalizowany pod WordPress

LiteSpeed + NVMe + wbudowany cache. Konfiguracja serwera dopasowana do WordPressa — bez ręcznego tuningowania. Strony ładują się w ułamku sekundy.