Kurulum rehberleri

Docker ile sunucuda uygulama yayınlama

Docker kurulumu, Compose ile çok servisli yapı, ters vekil arkasında HTTPS ve konteynerlerde veriyi kalıcı tutmanın yolu.

9 dakika okuma
Bulut platformunda uygulamaları temsil eden mavi Docker konteynerleri

Docker, uygulamanızı bağımlılıklarıyla birlikte paketleyip her sunucuda aynı şekilde çalıştırmanızı sağlar. "Bende çalışıyordu" sorununun büyük kısmı buradan çözülür.

Bu rehber bir VDS üzerinde tek sunuculuk bir kurulumu anlatır. Kubernetes gibi orkestrasyon katmanları, birden fazla sunucuya yayılan sistemler içindir; tek sunucuda Docker Compose fazlasıyla yeterlidir.

Kurulum

Dağıtımların kendi depolarındaki docker.io paketi genellikle eskidir. Resmî depoyu kullanın:

bashcurl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker --version

Root olmadan kullanmak için kendi kullanıcınızı docker grubuna ekleyin:

bashusermod -aG docker $USER

Bu grup üyeliğinin root yetkisine denk olduğunu bilin: docker grubundaki bir kullanıcı, ana makinenin dosya sistemini bir konteynere bağlayarak her şeye erişebilir. Grubu yalnızca güvendiğiniz kullanıcılara verin.

Değişikliğin geçerli olması için oturumu kapatıp açın.

Tek konteyner çalıştırmak

bashdocker run -d --name web -p 8080:80 --restart unless-stopped nginx:alpine

Parametrelerin anlamı: -d arka planda çalıştırır, -p 8080:80 sunucunun 8080 portunu konteynerin 80 portuna bağlar, --restart unless-stopped sunucu yeniden başladığında konteyneri de ayağa kaldırır.

Durumu görmek ve günlükleri okumak için:

bashdocker ps
docker logs -f web

Compose ile çok servisli uygulama

Gerçek uygulamalar tek konteynerden ibaret değildir. compose.yaml dosyası, uygulama ve veritabanını birlikte tanımlar:

textservices:
  app:
    image: ghcr.io/kullanici/uygulamam:1.4.2
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      DATABASE_URL: postgres://uygulama:${DB_PAROLA}@db:5432/uygulama
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: uygulama
      POSTGRES_PASSWORD: ${DB_PAROLA}
      POSTGRES_DB: uygulama
    volumes:
      - db-verisi:/var/lib/postgresql/data

volumes:
  db-verisi:

Çalıştırmak için:

bashdocker compose up -d
docker compose ps

Dikkat edilecek üç nokta var:

Port yalnızca yerele açık. 127.0.0.1:3000:3000 yazımı, uygulamanın doğrudan internete açılmasını engeller; dışarıya yalnızca ters vekil bakar. Yalnızca 3000:3000 yazmak, güvenlik duvarınızdan bağımsız olarak portu herkese açar.

Etiket sabitleyin. latest yerine 1.4.2 gibi belirli bir sürüm kullanın; aksi hâlde bir sonraki pull beklenmedik bir sürüm getirir.

Parolalar dosyada durmaz. ${DB_PAROLA} aynı dizindeki .env dosyasından okunur; o dosyayı sürüm kontrolüne eklemeyin.

Veri kalıcılığı

Konteynerler geçicidir; silindiğinde içindeki her şey gider. Kalması gereken veri volume üzerinde durmalıdır — yukarıdaki örnekte db-verisi bunu sağlar.

Yedekleme, ana makinedeki dosyaları kopyalamakla olmaz; veritabanı dökümünü konteyner üzerinden alın:

bashdocker compose exec -T db pg_dump -U uygulama uygulama | gzip > yedek-$(date +%F).sql.gz

Yedekleme kurgusunun tamamı için 3-2-1 rehberimize bakabilirsiniz.

HTTPS: ters vekil

Uygulama konteyneri doğrudan 443 portunu dinlemez. Ana makinedeki Nginx, isteği karşılayıp konteynere aktarır:

textserver {
    listen 80;
    server_name uygulama.alanadiniz.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Ardından Certbot ile sertifikayı alın. Nginx kurulumunu Nginx rehberimizde anlattık.

Bakım

bashdocker compose pull && docker compose up -d    # guncelle
docker system df                                # disk kullanimi
docker system prune -a --volumes                # DIKKAT: kullanilmayan volume'lari da siler

Son komut disk temizler ama dikkatli kullanın: --volumes parametresi, o an bir konteynere bağlı olmayan veri birimlerini de siler.

Docker tabanlı kurulumunuz için kaynak planlaması yapmak isterseniz bize yazın.