CodeBlanks Logo Icon CodeBlanks

docker-compose

  • Go kursu
  • İleri seviye
  • Ders 50/68
  • 4 dk

docker-compose ile çoklu servis öğrenirsin.

docker-compose

Compose, birden çok konteyneri tek YAML dosyasıyla tanımlar ve birlikte başlatır. Go servisi ve veritabanı:

services:
  api:
    build: .
    ports: ["8080:8080"]
    environment:
      DATABASE_URL: postgres://app:gizli@db:5432/app?sslmode=disable
    depends_on: [db]
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: gizli

docker compose up ikisini aynı ağda başlatır; servis veritabanına db adıyla ulaşır.

depends_on ve hazır olma

depends_on yalnızca başlatma sırasını belirler; veritabanının bağlantı kabul etmeye hazır olduğunu garanti etmez. Ya healthcheck + condition: service_healthy kullanılır ya da Go tarafında Ping yeniden denenir:

for i := 0; i < 10; i++ {
    if err = db.Ping(); err == nil {
        break
    }
    time.Sleep(time.Second)
}

Uygulama Yeniden deneme

retry(n int, f func() error) error yaz: f'yi en çok n kez dene, başarılı olursa nil döndür, olmazsa son hatayı döndür. Üçüncü denemede başarılı olan bir fonksiyonla dene ve deneme sayısını yazdır.

Başlangıç kodu

main.go
package main

import (
    "errors"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "errors"
    "fmt"
)

func retry(n int, f func() error) error {
    var err error
    for i := 0; i < n; i++ {
        if err = f(); err == nil {
            return nil
        }
    }
    return err
}

func main() {
    deneme := 0
    err := retry(5, func() error {
        deneme++
        if deneme < 3 {
            return errors.New("hazır değil")
        }
        return nil
    })
    fmt.Println(deneme, err)
}

Beklenen çıktı

3 <nil>

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 api konteyneri veritabanına hangi adresle bağlanır?

  • localhost:5432
  • 127.0.0.1:5432
  • postgres.local:5432
  • db:5432 Doğru cevap

Açıklama: Compose servis adlarını ağ içinde DNS adı yapar; konteyner içinde localhost konteynerin kendisidir.

2 Port eşleme

Soru
services:
  api:
    build: .
    ____: ["8080:8080"]
Cevap
services:
  api:
    build: .
    ports: ["8080:8080"]

Açıklama: ports, ana makinedeki portu konteynerin portuna yönlendirir.

3 Compose anahtarları

Kavram Anlamı
build Dockerfile'dan imaj
image Hazır imaj
environment Ortam değişkenleri
depends_on Başlatma sırası

İleri seviye bölümündeki tüm dersler