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ı:
.envdosyasını asla sürüm kontrol sistemine (Git) kaydetmeyin. Kimlik bilgilerini gizli tutmak için.gitignoredosyanı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:
.:/appbir bağlama (bind mount) olup, host makinenizdeki kaynak kodun konteynere aktarılmasını sağlar (hot-reload için).node_modulesise, bağlama işlemininnode_modulesklasö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_healthykullanılarak,appservisi başlamadan öncedbservisin 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--hostile 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.



