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 --versionRoot olmadan kullanmak için kendi kullanıcınızı docker grubuna ekleyin:
bashusermod -aG docker $USERBu 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:alpineParametrelerin 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 webCompose 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 psDikkat 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.gzYedekleme 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 silerSon 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.
