aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Oyun Sunucusu

Docker Oyun Sunucusu: Container'da Çalıştırma Rehberi

Bir Docker oyun sunucusu kurmak, sunucunu işletim sistemine ve tek bir makineye bağımlı olmaktan kurtarır: tüm bağımlılıklar, sürümler ve yapılandırma bir imajın içinde paketlenir, böylece sunucu nereye taşırsan taşı aynı şekilde çalışır. "Bende çalışıyordu ama VPS'te açılmadı" cümlesini bir daha kurmazsın. Bu yazıda bir oyun sunucusunu container'a almanın mantığını, kalıcı kayıt verisinin nasıl korunacağını, port yönlendirmeyi, otomatik yeniden başlatmayı ve yedek alıp başka sunucuya taşımayı pratik örneklerle göreceğiz.

Neden oyun sunucusunu container'a alalım?

Klasik kurulumda sunucuyu çıplak makineye atar, doğru çalışma zamanını (Java, .NET, belirli bir glibc sürümü vb.) elle kurar ve servis dosyaları yazarsın. Sorun, bu kurulumun o makineye özgü olmasıdır. Docker bu durumu tersine çevirir:

  • Taşınabilirlik: Aynı imaj, geliştirme makinende, bir VPS'te ve yedek sunucuda birebir aynı çalışır.
  • İzolasyon: Sunucu kendi konteynerinde çalışır; host sistemini kirletmez, başka servislerle sürüm çakışması yaşamaz.
  • Tekrarlanabilirlik: Yapılandırman bir Dockerfile ve compose.yaml dosyasında durur; kurulumu bir komutla yeniden üretebilirsin.
  • Kolay sürüm yönetimi: İmaj etiketleriyle (:1.20, :latest) sunucu sürümünü sabitler, gerektiğinde eskisine geri dönersin.

Hazır imaj mı, kendi Dockerfile'ın mı?

Popüler oyunların çoğu için topluluk imajları vardır. Örneğin Minecraft için itzg/minecraft-server olgun ve yaygın bir imajdır; EULA, sürüm ve bellek gibi ayarları ortam değişkenleriyle yönetir. Hazır imaj varsa onu kullanmak en hızlı yoldur. Ancak özel ya da kendi yazdığın bir sunucu için kendi imajını yazman gerekir. Basit bir Linux sunucu binary'si için tipik bir Dockerfile şöyle görünür:

FROM debian:12-slim

# Çalışma zamanı bağımlılıkları
RUN apt-get update && apt-get install -y --no-install-recommends \
        ca-certificates libstdc++6 \
    && rm -rf /var/lib/apt/lists/*

# Root yerine ayrı bir kullanıcı
RUN useradd --system --create-home --uid 1000 gameserver
USER gameserver
WORKDIR /home/gameserver

# Sunucu dosyalarını kopyala
COPY --chown=gameserver:gameserver ./server/ ./

# Oyun portu (örnek: UDP 27015)
EXPOSE 27015/udp

CMD ["./game_server", "--config", "server.cfg"]

Burada birkaç iyi alışkanlık var: imajı -slim tabandan kurmak boyutu küçük tutar, --no-install-recommends gereksiz paketleri eler ve sunucuyu root olmayan bir kullanıcı ile çalıştırmak güvenlik açısından önemlidir. Konteyner içinde root, host üzerinde riski artırır.

Kalıcı veri: kayıtlar volume'da durmalı

En kritik nokta budur. Konteyner geçici (ephemeral) bir yapıdır; docker rm ile silindiğinde içindeki dosya sistemi de gider. Dünya kaydı, oyuncu verileri ve yapılandırma konteynerin içinde kalırsa bir güncellemede her şeyi kaybedersin. Çözüm, bu klasörleri bir volume ya da host dizinine bağlamaktır:

docker run -d \
  --name oyun-sunucusu \
  -p 27015:27015/udp \
  -v /srv/oyun/data:/home/gameserver/data \
  --restart unless-stopped \
  benim-sunucum:1.0

-v /srv/oyun/data:/home/gameserver/data ifadesi, host üzerindeki kalıcı klasörü konteynerin veri dizinine bağlar. Artık konteyneri silsen, güncellesen veya başka makineye taşısan da kayıtlar host tarafında durur. Sunucunu yapılandırırken kayıt yolunun mutlaka bu bağlı dizine yazıldığından emin ol.

Port yönlendirme: TCP mi UDP mi?

Oyun sunucuları çoğunlukla UDP kullanır çünkü gerçek zamanlı oyunda düşük gecikme, paket kaybının tekrar iletilmesinden daha önemlidir. Bazı sunucular ek olarak bir TCP sorgu/RCON portu açar. -p bayrağında protokolü doğru belirtmen şarttır:

  • -p 27015:27015/udp — oyun trafiği için UDP portu.
  • -p 27015:27015/tcp — RCON / sorgu için TCP portu (gerekiyorsa).

Soldaki sayı host portu, sağdaki konteyner portudur. Sunucuya dışarıdan erişilmiyorsa ilk bakılacak yer budur: protokol yanlış (TCP/UDP karışmış) ya da VPS güvenlik duvarı (örneğin ufw) ilgili portu kapatıyordur.

Compose ile düzenli kurulum

Komut satırında uzun docker run satırları yazmak yerine yapılandırmayı bir compose.yaml dosyasına taşımak çok daha sürdürülebilirdir. Sunucunun tüm tanımı tek dosyada durur ve docker compose up -d ile ayağa kalkar:

services:
  game:
    build: .
    container_name: oyun-sunucusu
    ports:
      - "27015:27015/udp"
    volumes:
      - ./data:/home/gameserver/data
    environment:
      MAX_PLAYERS: "32"
      SERVER_NAME: "Aslain Sunucu"
    restart: unless-stopped
    deploy:
      resources:
        limits:
          memory: 2g
          cpus: "2.0"

Buradaki restart: unless-stopped, sunucu çökse ya da makine yeniden başlasa bile konteynerin otomatik olarak tekrar açılmasını sağlar — bir oyun sunucusu için kritik bir ayardır. deploy.resources.limits ise tek bir oyun sunucusunun tüm CPU ve RAM'i tüketip host'u kilitlemesini engeller.

Yedek alma ve başka sunucuya taşıma

Container yaklaşımının en güzel yanı, taşıma işleminin neredeyse sadece veri klasörünü kopyalamaya inmesidir. İmaj her yerde aynı olduğu için, yeni sunucuda yapman gereken tek şey imajı çekmek/derlemek ve veri dizinini geri yüklemektir:

# Veri klasörünün anlık yedeği (sunucu durmuşken almak en güvenlisi)
docker compose stop game
tar czf yedek-$(date +%F).tar.gz ./data
docker compose start game

# Yeni sunucuda:
tar xzf yedek-2026-06-28.tar.gz
docker compose up -d

Daha az kesinti için canlı bir sunucuda önce oyun içi "save" komutunu tetikleyip diske yazılmasını sağlayabilir, sonra yedeği alabilirsin. Bu yedekleme adımını bir cron görevine bağlayarak otomatik günlük yedekler de oluşturabilirsin.

Sık Sorulan Sorular

Docker oyun sunucusunda performans kaybı olur mu?

Linux'ta Docker, sanal makine değil; çekirdeği host ile paylaşan hafif bir izolasyon katmanı kullanır. CPU ve bellek için ölçülebilir ek yük çok düşüktür ve oyuncuların hissedeceği bir gecikmeye yol açmaz. Ağ tarafında varsayılan köprü (bridge) ağı küçük bir NAT yükü ekler; bunu istemiyorsan network_mode: host ile portları doğrudan host üzerinde açabilirsin.

Konteyner silinince dünya kaydım gider mi?

Veriyi bir volume veya host dizinine bağladıysan hayır. -v ile dışarı çıkarılan klasörler konteynerin yaşam döngüsünden bağımsızdır; konteyneri silip yeniden oluştursan da kayıtlar yerinde kalır. Veriyi mutlaka container dışında tutmak en önemli kuraldır.

Windows oyun sunucusunu da container'a alabilir miyim?

Docker'ın asıl güçlü olduğu yer Linux sunucularıdır. Sadece Windows üzerinde çalışan bir sunucu binary'si için Windows konteynerleri gerekir; bu daha sınırlı ve kullanışsız bir yoldur. Çoğu durumda Linux sürümü olan sunucuları tercih etmek Docker'dan en iyi verimi almanı sağlar.

Oyun sunucunu container'a taşımak mı istiyorsun? Dockerfile yazımından kalıcı veri, yedekleme ve VPS dağıtımına kadar tüm kurulumu birlikte planlamak için benimle iletişime geç.

Bu kategorideki tüm yazılar →

Devamı için