Docker Compose: Çoklu Konteyner Uygulamalarını Tanımlama ve Çalıştırma (V2)

Docker Compose, birden fazla servisi tek bir YAML dosyası (docker-compose.yml) ile tanımlamanızı ve tek bir komutla tüm ortamı başlatmanızı sağlayan bir araçtır. Bu rehber, Compose V2'nin temel sözdizimini ve yaygın komutlarını açıklar.

L
Linuxize
15 görüntülenme
Docker Compose: Çoklu Konteyner Uygulamalarını Tanımlama ve Çalıştırma (V2)

Docker Compose: Çoklu Konteyner Uygulamalarını Tanımlama ve Çalıştırma (V2)

Docker Compose, birden fazla konteynerden oluşan uygulamaları (örneğin bir web sunucusu ve bir veritabanı) tanımlamak ve çalıştırmak için kullanılan bir araçtır. Her bir servisi tek tek docker run komutuyla başlatmak yerine, tüm servisleri, ağları ve birimleri tek bir YAML dosyasında tanımlarsınız ve tüm ortamı tek bir komutla ayağa kaldırırsınız.

Bu makale, modern Docker Compose V2'nin nasıl çalıştığını, SvelteKit geliştirme sunucusu ve PostgreSQL veritabanı içeren pratik bir örnek üzerinden anlatmakta ve en sık kullanılan Compose yönergelerini ve komutlarını kapsamaktadır.

Ön Koşullar

Bu rehberdeki örnekler için Docker ve Compose eklentisinin (Compose V2) kurulu olması gerekmektedir. Docker Desktop bunu varsayılan olarak içerir. Linux'ta, Docker Engine ile birlikte docker-compose-plugin paketini kurmanız gerekir.

Compose'un mevcut olup olmadığını doğrulamak için şu komutu çalıştırın:

$ docker compose version

Not: Compose V2, docker compose (bir boşlukla) olarak çalışır, eski V1 ikilisi olan docker-compose değildir.

Compose Dosyası (docker-compose.yml)

Compose dosyaları, uygulamanızın ortamını tanımlamak için üç ana üst düzey anahtar kullanır:

  • services: Her bir konteyneri (görüntü, portlar, birimler, ortam değişkenleri ve bağımlılıklar) tanımlar.
  • volumes: Konteyner yeniden başlatmaları boyunca verileri kalıcı hale getiren adlandırılmış birimleri bildirir.
  • networks: Servis iletişimi için özel ağlar tanımlar (Compose varsayılan olarak bir ağ oluşturur).

Modern Compose dosyaları için üst kısımda version: alanı gerekli değildir. Yapısal hiyerarşi için girintileme (sekme değil, boşluk kullanılarak) esastır.

Örnek Kurulum: SvelteKit ve PostgreSQL

Bu örnekte, bir SvelteKit geliştirme sunucusunu bir PostgreSQL 16 veritabanıyla birlikte çalıştıracağız. Öncelikle projenizi oluşturun:

$ npm create svelte@latest myapp
$ cd myapp

Ardından, proje kök dizininde docker-compose.yml dosyasını oluşturun:

services:
  app:
    image: node:20-alpine
    working_dir: /app
    volumes:
      - .:/app
      - node_modules:/app/node_modules
    ports:
      - "5173:5173"
    environment:
      DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/myapp
    depends_on:
      db:
        condition: service_healthy
    command: sh -c "npm install && npm run dev -- --host"

  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: myapp
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:
  node_modules:

Compose, proje dizinindeki .env dosyasını otomatik olarak okur. Veritabanı şifresi için .env dosyasını oluşturun:

POSTGRES_PASSWORD=changeme

Uyarı: .env dosyasını asla sürüm kontrol sistemine (Git) kaydetmeyin. Kimlik bilgilerini gizli tutmak için .gitignore dosyanıza ekleyin.

Temel Bileşenlerin Açıklaması

services altındaki her anahtar (app, db) bir servisi temsil eder ve aynı zamanda servisler arası iletişimde ana bilgisayar adı olarak kullanılır (örneğin, app servisi veritabanına db:5432 üzerinden erişir).

  • volumes: .:/app bir bağlama (bind mount) olup, host makinenizdeki kaynak kodun konteynere aktarılmasını sağlar (hot-reload için). node_modules ise, bağlama işleminin node_modules klasörünü silmesini önlemek için kullanılan adlandırılmış bir birimdir. postgres_data, veritabanı kalıcılığı için kullanılır.
  • depends_on & healthcheck: condition: service_healthy kullanılarak, app servisi başlamadan önce db servisin PostgreSQL bağlantılarını kabul etmeye hazır olduğundan emin olunur. Bu, bağlantı hatalarını önler.
  • command: Geliştirme sırasında, bu komut her seferinde bağımlılıkları kurar (npm install) ve sunucuyu Docker'ın erişebilmesi için --host ile başlatır.

Uygulama Yönetimi Komutları

Tüm komutlar docker-compose.yml dosyasının bulunduğu dizinde çalıştırılmalıdır.

Servisleri Başlatma

Tüm servisleri arka planda (detached mode) başlatmak için:

$ docker compose up -d

Durum ve Logları Görüntüleme

Çalışan servislerin durumunu listelemek için:

$ docker compose ps

Belirli bir servisin loglarını gerçek zamanlı izlemek için:

$ docker compose logs -f app

Konteyner İçinde Komut Çalıştırma

Çalışan app konteynerinde etkileşimli bir kabuk açmak için:

$ docker compose exec app sh

Servisleri Durdurma ve Kaldırma

Servisleri durdurmak ancak birimleri ve ağı korumak için:

$ docker compose stop

Servisleri, ağı ve tüm adlandırılmış birimleri (veritabanı verileri dahil) kaldırmak için:

$ docker compose down -v

Sıkça Sorulan Sorular (FAQ)

docker compose down ile docker compose stop arasındaki fark nedir?
stop sadece konteynerleri durdurur ve verileri korur. down ise konteynerleri ve ağı kaldırır. Veritabanı verilerini kalıcı olarak silmek istiyorsanız down -v kullanın.

Üretimde Docker Compose kullanılabilir mi?
Evet, tek sunuculu (single-host) dağıtımlar için uygundur. Üretimde, restart: unless-stopped kullanılması ve sırların .env dosyaları aracılığıyla yönetilmesi önerilir.

Kaynak

Linuxize