Docker ile Minecraft sunucusu kurmak, Ubuntu üzerine Java kurup jar indirmekle uğraşmadan tek bir yapılandırma dosyasından çalışan sunucu elde etmenin en hızlı yoludur. Bu rehberde Ubuntu 24.04 LTS üzerinde Docker Engine kurulumundan başlayıp, itzg/minecraft-server imajıyla Paper 26.2 sunucusu ayağa kaldıracak, kalıcı veri birimi, RAM sınırı, RCON konsolu, otomatik yeniden başlatma ve yedekleme yapılandırmasını adım adım kuracağız.
Docker’ın buradaki asıl kazancı izolasyon ve tekrarlanabilirliktir. Sunucunun Java sürümü, çalışma dizini, açtığı port ve kullandığı bellek tek bir compose.yml dosyasında yazılıdır. Aynı dosyayı başka bir makineye kopyalayıp docker compose up -d derseniz birebir aynı sunucu yeniden doğar. Aynı makinede farklı Java sürümleri isteyen iki sunucuyu (örneğin 26.2 ve 1.12.2) yan yana çalıştırmak da bu sayede sorun olmaz.
Docker ile kurmanın kazandırdıkları ve maliyetleri#
Karar vermeden önce iki tarafı da net görün. Docker her senaryoda doğru araç değildir.
Kazandırdıkları#
- Ana makineye Java kurmanıza gerek kalmaz; her sunucu kendi Java sürümüyle gelir.
- Sunucu çöktüğünde
restart: unless-stoppedile saniyeler içinde geri gelir. - RAM ve CPU tavanı çekirdek düzeyinde uygulanır; bir sunucu diğerlerini boğamaz.
- Sürüm yükseltmek tek satır değişikliği ve
docker compose up -d. - Tüm yapılandırma metin dosyasında; sürüm kontrolüne alınabilir.
Maliyetleri#
- Dosya izinleri konusu yeni başlayanları zorlar (UID/GID uyuşmazlığı).
- Konteyner içinde hata ayıklamak biraz daha fazla komut bilgisi ister.
dockergrubuna eklenen kullanıcı pratikte root yetkisine sahip olur.- OpenVZ tabanlı ucuz VPS’lerde Docker çoğu zaman çalışmaz; KVM tabanlı bir VDS gerekir.
Donanım ve sürüm gereksinimleri#
Konteynerleştirme donanım ihtiyacını azaltmaz. Minecraft’ın ana tick döngüsü tek çekirdekte çalıştığı için belirleyici olan çekirdek sayısı değil saat hızıdır. AMD Ryzen 9 7900X veya 7950X birinci tercihtir, alt sınır Ryzen 9 3900X’tir. Disk daima NVMe SSD olmalıdır; chunk okuma/yazma yükünü SATA SSD bile karşılamakta zorlanır. Ayrıntı için Minecraft sunucusu için doğru donanım seçimi sayfasına göz atın.
| Kullanım | Paket RAM | MEMORY (heap) | mem_limit | cpus | Disk |
|---|---|---|---|---|---|
| 2–10 oyuncu, vanilla veya hafif eklentili | 8 GB | 6G | 7g | 3 | 50 GB NVMe |
| 10–30 oyuncu, eklentili Paper | 12 GB | 10G | 11g | 4 | 50 GB NVMe |
| 30–60 oyuncu, minigame / çok dünyalı | 16 GB | 14G | 15g | 6 | 100 GB NVMe |
| Forge / Fabric modpack | 16–32 GB | 14G–28G | 15g–30g | 6–8 | 100 GB+ NVMe |
| 60+ oyuncu veya proxy’li sunucu ağı | 32 GB+ | 28G | 30g | 8+ | 200 GB NVMe |
Sürüm tarafında 11 Ağustos 2026 itibarıyla güncel kararlı Minecraft sürümü 26.2 “Chaos Cubed”dir (16 Haziran 2026, protokol 776). 26.1 ve sonrası Java 25 ister; imajın varsayılan etiketi bunu zaten karşılar. Hangi sürümün hangi Java’yı istediğini Java sürümü gereksinim tablosunda bulabilirsiniz.
VERSION değerini asla LATEST bırakmayın.Ubuntu 24.04 üzerine Docker Engine kurulumu#
Sunucunuza SSH ile bağlanın. Bağlantı adımlarını bilmiyorsanız SSH ile sunucuya bağlanma rehberine bakabilirsiniz.
-
Sistemi güncelleyin ve Docker’ı kurun#
Resmî kurulum betiği Ubuntu 24.04, Debian 12 ve AlmaLinux/Rocky üzerinde depo tanımını da yapar:
sudo apt update && sudo apt -y upgrade curl -fsSL https://get.docker.com | sudo sh sudo systemctl enable --now docker docker --version && docker compose version -
Sunucu için ayrı bir kullanıcı açın#
Konteynerleri root ile yönetmeyin. Ayrı bir kullanıcı açıp
dockergrubuna ekleyin, sonra oturumu yenileyin:sudo adduser --disabled-password --gecos "" minecraft sudo usermod -aG docker minecraft sudo su - minecraft -
Proje dizinini oluşturun#
Her sunucu kendi klasöründe dursun; ileride ikinci bir sunucu eklemek kolaylaşır.
mkdir -p /home/minecraft/survival/data cd /home/minecraft/survival
docker grubundaki bir kullanıcı, konteyner üzerinden ana makinenin dosya sistemine root olarak erişebilir. Bu gruba yalnızca sunucuyu yöneten kişileri ekleyin.İndirmeniz gerekenler#
Docker imajı docker compose up sırasında otomatik çekilir, elle jar indirmenize gerek yoktur. Yine de kendi jar’ınızı monte etmek veya sürüm notlarını okumak isterseniz resmî adresler şunlardır:
-
Docker EngineZorunluİndir
-
Paper 26.2 sunucu jar (isteğe bağlı)İndir
-
Purpur 26.2 (Paper alternatifi)İndir
Bağlantılar resmî kaynaklara gider. Üçüncü taraf sitelerden jar indirmeyin.
Tek komutla ilk sunucuyu ayağa kaldırma#
Yapılandırmayı yazmadan önce her şeyin çalıştığını görmek için tek satırlık bir test yapın. Aşağıdaki komut Paper 26.2 sunucusunu 25565 portunda başlatır:
docker run -d --name mc-test \
-e EULA=TRUE -e TYPE=PAPER -e VERSION=26.2 -e MEMORY=6G \
-p 25565:25565 \
-v /home/minecraft/survival/data:/data \
itzg/minecraft-server
Logları izleyin; “Done (… )! For help, type help” satırını gördüğünüzde sunucu hazırdır:
docker logs -f mc-test
Test bittiğinde konteyneri kaldırın: docker rm -f mc-test. Veri klasörü silinmez, bir sonraki adımda aynı dünyayı compose ile kullanmaya devam edeceksiniz.
docker compose ile kalıcı yapılandırma#
Kalıcı kurulum için compose.yml dosyası yazın. nano compose.yml komutuyla açıp aşağıdaki içeriği yapıştırın:
services:
mc:
image: itzg/minecraft-server
container_name: mc-survival
restart: unless-stopped
tty: true
stdin_open: true
ports:
- "25565:25565"
environment:
EULA: "TRUE"
TYPE: "PAPER"
VERSION: "26.2"
MEMORY: "6G"
USE_AIKAR_FLAGS: "true"
TZ: "Europe/Istanbul"
UID: "1000"
GID: "1000"
MOTD: "Batihost Survival - Paper 26.2"
MAX_PLAYERS: "20"
DIFFICULTY: "normal"
VIEW_DISTANCE: "8"
SIMULATION_DISTANCE: "6"
ONLINE_MODE: "true"
OPS: "KullaniciAdiniz"
ENABLE_RCON: "true"
RCON_PASSWORD: "buraya-uzun-ve-rastgele-bir-parola"
OVERRIDE_SERVER_PROPERTIES: "false"
volumes:
- ./data:/data
mem_limit: 7g
cpus: 3.0
stop_grace_period: 120s
Ardından sunucuyu başlatın:
docker compose up -d
docker compose logs -f
Birkaç önemli ayrıntı: stop_grace_period: 120s satırı, Docker konteyneri zorla öldürmeden önce sunucuya dünyayı diske yazması için 2 dakika verir. Bu satır olmadan varsayılan 10 saniyede kalırsınız ve büyük dünyalarda chunk bozulması riski doğar. OVERRIDE_SERVER_PROPERTIES: "false" ise elle yaptığınız server.properties değişikliklerinin her açılışta ezilmesini engeller.
UID ve GID değerlerini ana makinedeki kullanıcınızın kimliğiyle eşitleyin. Doğru değeri id -u ve id -g komutlarıyla öğrenirsiniz. Bu iki satır, “data klasörüne SFTP ile dosya atamıyorum” şikâyetinin en yaygın çözümüdür.En çok kullanılan ortam değişkenleri#
İmajın onlarca ortam değişkeni vardır; günlük kullanımda işinize yarayacak olanlar aşağıdadır. Bu değişkenlerin karşılıkları data/server.properties dosyasına yazılır; dosyayı elle düzenlemek isterseniz OVERRIDE_SERVER_PROPERTIES değerini false bırakmanız yeterlidir.
| Değişken | Örnek değer | Ne yapar |
|---|---|---|
| TYPE | PAPER / PURPUR / FABRIC / FORGE / VANILLA | Sunucu yazılımını seçer, jar’ı otomatik indirir |
| VERSION | 26.2 | Minecraft sürümü. Sabit yazın, LATEST bırakmayın |
| MEMORY | 6G | -Xms ve -Xmx değerini birlikte ayarlar |
| USE_AIKAR_FLAGS | true | G1GC tabanlı Aikar bayrak setini uygular |
| JVM_OPTS | -XX:+UseZGC | Kendi JVM bayraklarınızı eklemenizi sağlar |
| ENABLE_RCON / RCON_PASSWORD | true / uzun parola | rcon-cli ile konsola bağlanmayı açar |
| OPS | Oyuncu1,Oyuncu2 | İlk açılışta OP verilecek oyuncular |
| WHITELIST | Oyuncu1,Oyuncu2 | Beyaz listeyi doldurur |
| MODRINTH_PROJECTS | luckperms,spark | Belirtilen eklentileri her açılışta indirir |
| STOP_SERVER_ANNOUNCE_DELAY | 30 | Kapanmadan önce oyunculara uyarı süresi (sn) |
| TZ | Europe/Istanbul | Konteyner saat dilimi; log zaman damgaları için |
RAM, CPU sınırları ve JVM bayrakları#
Docker’da bellek iki katmanda tanımlanır ve ikisini karıştırmak en sık yapılan hatadır:
- MEMORY
- Java heap’i, yani
-Xmsve-Xmx. Sunucunun oyun verisi için kullanabileceği alan. - mem_limit
- Konteynerin tamamının kullanabileceği fiziksel RAM tavanı. Heap dışında metaspace, thread yığınları, ağ tamponları ve Java dışı süreçler de buraya sığmalıdır.
mem_limit değerini heap’ten en az 1 GB yüksek tutun. 8 GB’lık bir sunucuda MEMORY=6G ve mem_limit=7g doğru ikilidir; ana makineye de 1 GB pay kalır. Aksi halde konteyner “exit code 137” ile sessizce ölür, loglarda hata görünmez.
Çöp toplayıcı tarafında yanlış bilgi çok dolaşıyor: Minecraft 26.1 ile duyurulan G1GC’den ZGC’ye geçiş istemci tarafı bir değişikliktir, sunucuyu ilgilendirmez. Sunucu jar’ının launcher’ı yoktur; hangi çöp toplayıcının kullanılacağını tamamen sizin verdiğiniz bayraklar belirler. Java 25’te G1 hâlâ JVM’in varsayılan çöp toplayıcısıdır ve Aikar’s Flags 26.x sunucularında geçerliliğini korur. Pratik kural:
- 8–12 GB heap:
USE_AIKAR_FLAGS: "true"bırakın, G1GC kullanın. - 16 GB ve üzeri heap veya ağır modpack: Aikar bayraklarını kapatıp ZGC deneyebilirsiniz.
USE_AIKAR_FLAGS: "false"
JVM_OPTS: "-XX:+UseZGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem"
-XX:+ZGenerational bayrağını yazmayın. JEP 490 ile ZGC’nin non-generational modu kaldırıldı; bu bayrak Java 25’te obsolete’tir ve her açılışta uyarı basar. Doğru kullanım yalnızca -XX:+UseZGC şeklindedir. Bellek ayarlarının ayrıntısı için RAM ayarları ve JVM flag’leri sayfasına bakın.CPU tarafında cpus: 3.0 gibi bir tavan koymak, aynı makinede birden fazla konteyner çalıştırıyorsanız birinin diğerini boğmasını engeller. Tek sunucu çalıştırıyorsanız bu satırı tamamen kaldırmak daha iyidir; tick döngüsü sıkıştığında kısıtlama TPS düşüşüne yol açar.
Konsola bağlanma ve komut gönderme#
Konteyner içindeki sunucuya komut yazmanın üç yolu var. En temizi RCON üzerinden gitmektir:
# Etkileşimli konsol
docker exec -i mc-survival rcon-cli
# Tek komut çalıştırıp çıkma
docker exec mc-survival rcon-cli "say Sunucu 5 dakika içinde yeniden başlayacak"
docker exec mc-survival rcon-cli save-all
docker exec mc-survival rcon-cli list
İkinci yol docker attach mc-survival ile doğrudan sunucu çıktısına bağlanmaktır; bunun için compose dosyasındaki tty ve stdin_open satırları gerekir. Çıkarken mutlaka Ctrl+P ardından Ctrl+Q kullanın; Ctrl+C sunucuyu kapatır. Üçüncü yol olarak docker compose logs -f --tail 200 yalnızca okuma amaçlıdır; komut yazamazsınız.
Eklenti, mod ve dünya dosyalarına erişim#
Volume tanımı sayesinde sunucunun tüm dosyaları ana makinede duruyor:
/home/minecraft/survival/
├── compose.yml
└── data/
├── server.properties
├── eula.txt
├── paper-26.2-112.jar
├── plugins/
├── world/
├── world_nether/
└── logs/latest.log
Eklenti kurmak için jar dosyasını data/plugins içine kopyalayıp docker compose restart demeniz yeterli. Konteynerin içine girmenize gerek yok. Kurulum ayrıntıları ve uyumluluk kontrolü için plugin kurulumu rehberine bakabilirsiniz.
Eklentileri elle indirmek istemiyorsanız imaj bunu sizin yerinize yapabilir:
MODRINTH_PROJECTS: "luckperms,spark,viaversion"
MODRINTH_DOWNLOAD_DEPENDENCIES: "required"
Yedekleme ve sürüm güncelleme#
Docker kurulumunda yedek almak, data klasörünü arşivlemekten ibarettir. Dünya tutarlılığı için sunucuyu durdurun ya da en azından save-off ve save-all gönderin:
cd /home/minecraft/survival
docker exec mc-survival rcon-cli save-off
docker exec mc-survival rcon-cli save-all
tar -czf /home/minecraft/yedek/survival-$(date +%F-%H%M).tar.gz data
docker exec mc-survival rcon-cli save-on
Bu komutları bir kabuk betiğine koyup crontab -e ile gecelik çalıştırabilirsiniz. Kalıcı ve kurallı bir plan, saklama süresi ve dış kopya için Minecraft sunucu yedekleme rehberini inceleyin.
Sürüm yükseltmek iki adımdır: önce yedek alın, sonra compose dosyasındaki VERSION satırını değiştirip imajı tazeleyin.
docker compose pull
docker compose up -d
docker compose logs -f
26.1 öncesinden 26.1 veya 26.2’ye geçiyorsanız bunu bir sürüm atlaması gibi görmeyin. Unobfuscation nedeniyle eski derlenmiş eklentiler ve modlar çalışmaz; önce test sunucusunda deneyin. Sunucuyu başka bir makineye taşımak da bu kurulumda kolaydır: taşınacak tek şey compose.yml dosyası ve data klasörüdür.
Güvenlik duvarı ve erişim güvenliği#
Docker, iptables kurallarını kendi yönetir ve ports: ile yayınladığınız portlar UFW kurallarını atlayabilir. Bu yüzden yayınlama satırını gerçekten ihtiyaç duyduğunuz portla sınırlayın. RCON portunu (25575) dışarı asla açmayın; docker exec zaten konteynerin içinden erişiyor.
sudo ufw allow 22/tcp
sudo ufw allow 25565/tcp
sudo ufw enable
sudo ufw status numbered
Sunucuyu yalnızca belirli bir arayüze bağlamak isterseniz port satırını - "127.0.0.1:25565:25565" biçiminde yazıp önüne bir proxy koyabilirsiniz. Kural yazımının ayrıntıları için UFW ile Minecraft portunu açma sayfasına bakın.
Sık karşılaşılan hatalar ve çözümleri#
| Belirti | Sebep | Çözüm |
|---|---|---|
| Konteyner “exit code 137” ile kapanıyor | mem_limit heap’ten küçük veya çok yakın | mem_limit değerini heap + 1 GB yapın |
| “You need to agree to the EULA” | EULA değişkeni verilmemiş | EULA: "TRUE" ekleyip yeniden başlatın |
| data klasörüne dosya yazamıyorsunuz | UID/GID uyuşmazlığı | sudo chown -R 1000:1000 data ve compose’a UID/GID ekleyin |
| UnsupportedClassVersionError | Eski Java etiketli imaj | 26.x için varsayılan (Java 25) etiketi kullanın |
| “Failed to bind to port” | 25565 başka bir konteyner veya süreçte | sudo ss -tulpn | grep 25565 ile bulup kapatın |
| Eklentiler açılışta “Unsupported API version” | 26.1 unobfuscation kırılması | Eklentinin 26.2 için derlenmiş sürümünü kurun |
Daha geniş bir hata kataloğu ve log okuma yöntemleri için Minecraft sunucu hataları ve çözümleri sayfasına bakabilirsiniz.
Docker mı, systemd servisi mi, panel mi?#
Üç yaklaşımın da yeri var. Tek sunucu çalıştırıyor ve sade bir kurulum istiyorsanız klasik yöntemle kurup systemd servisi olarak otomatik başlatmak en az katman içeren çözümdür. Birden çok sürümü yan yana çalıştıracaksanız Docker açık ara pratiktir. Web arayüzünden yönetim, alt kullanıcı yetkileri ve otomatik yedek istiyorsanız Pterodactyl panel kurulumu doğru adrestir; Pterodactyl da arka planda her sunucuyu ayrı bir Docker konteynerinde çalıştırır.
Özetle#
Docker ile Minecraft sunucusu kurmak, doğru yapılandırıldığında hem taşınabilir hem de bakımı kolay bir kurulum verir. Kritik dört nokta şunlar: veriyi mutlaka ./data:/data volume’üne alın, VERSION değerini 26.2 gibi sabit yazın, MEMORY ile mem_limit arasında en az 1 GB pay bırakın ve stop_grace_period vererek sunucunun dünyayı diske yazmasına izin verin.
Donanım tarafında kısayol aramayın: 8 GB alt sınır, yüksek saat hızlı AMD Ryzen 9 işlemci ve NVMe SSD olmadan Docker da olsa TPS’i 20’de tutamazsınız. Kurulum tamamlandıktan sonra sunucu optimizasyonu rehberiyle ince ayarları yapın ve düzenli yedek almayı ilk günden alışkanlık hâline getirin.