Docker'ı kurmak beş dakika sürer. Asıl iş, uygulamayı alan adı, HTTPS ve kaybolmayan veriyle gerçekten yayına almaktır. Çoğu rehber hello-world çıktısında bitiyor. Docker, uygulamayı bağımlılıklarıyla birlikte izole bir kapsayıcıda (container) çalıştırır. Bu VDS Docker kurulumu rehberinde boş bir sunucudan HTTPS'li, yeniden başlatmaya dayanıklı bir uygulamaya komut komut ilerliyoruz. Örnek uygulamamız Uptime Kuma.
Başlamadan Önce: VDS, SSH ve Alan Adı Hazırlığı
Docker'ın çalışması için root yetkisi ve uyumlu bir çekirdek gerekir. Bunlar VDS'te bulunur, web hosting türleri arasında paylaşımlı hostingde bulunmaz. VDS Docker kurulumuna başlamadan önce üç şey hazır olsun:
- Sanal sunucu (VDS) ve sunucunun IP adresi
- SSH erişimi (kullanıcı adı ve parola ya da anahtar)
- Yayına alacağınız alan adı
Root erişimi ve Docker'ı destekleyen çekirdek
Docker, çekirdeğin cgroups ve namespaces özelliklerini kullanır. Bu yüzden VDS'inizde root erişiminiz ve Docker'ı destekleyen bir çekirdek olması gerekir. Paket detaylarını sanal sunucu (VDS) paketleri sayfasında inceleyebilirsiniz.
Sunucu boyutu ve işletim sistemi
Rehber Ubuntu LTS üzerinden ilerliyor. Küçük bir web uygulaması için 1-2GB RAM ile başlayabilirsiniz, ihtiyaç uygulamaya göre değişir. Docker'ın kendisi hafiftir. Belleği asıl tüketen, içinde çalıştırdığınız uygulamadır.
SSH ile bağlanın ve alan adını hazırlayın
Terminalden sunucuya bağlanın ve paket listesini güncelleyin:
ssh kullanici@SUNUCU_IP
sudo apt update && sudo apt upgrade -y
Alan adınız yoksa alan adınızı sorgulayın ve kaydını başlatın. Paylaşımlı hostingte Docker çalışmaz. Farkı paylaşımlı hosting ile VDS farkı yazısında okuyabilirsiniz.
İhtiyaca göre seçin → VDS paketleri
Ubuntu'ya Docker Kurulumu: Resmi Depodan Adım Adım
Kurulum üç adımda biter: eski paketleri temizleyin, resmi depoyu ekleyin, paketleri kurun. Ubuntu'nun kendi deposundaki docker.io paketi geriden gelir. Docker'ın resmi docker-ce deposu güncel sürümü ve Compose eklentisini birlikte verir. Komutlar docs.docker.com'daki "Install Docker Engine on Ubuntu" sayfasına dayanır. Yayın tarihinizde sayfayı bir kez kontrol edin.
Eski paketleri kaldırın ve resmi depoyu ekleyin
Önce varsa çakışan paketleri kaldırın:
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)
Sonra Docker'ın GPG anahtarını ve apt kaynağını ekleyin:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
docker-ce ve Compose eklentisini kurun
Beş paketi tek komutla kurun:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Kurulumu doğrulayın. Sürüm numaraları yazı tarihindeki örnektir:
docker --version
docker compose version
sudo docker run hello-world
Yeni komut docker compose boşluklu yazılır. Eski docker-compose tireli ve ayrı bir programdır. Bu rehberde yalnızca boşluklu sürümü kullanıyoruz.
Docker'ı sudo olmadan kullanın ve açılışta başlatın
Kullanıcınızı docker grubuna ekleyin, oturumu yenileyin ve servisi açılışa alın:
sudo usermod -aG docker $USER
newgrp docker
sudo systemctl enable docker
Docker grubu fiilen root yetkisi demektir. Bu gruba yalnızca güvendiğiniz kullanıcıları ekleyin.
Docker Compose ile İlk Uygulamayı Çalıştırma
docker run komutu tek seferliktir. Compose ise uygulamayı, volume'u (kalıcı veri alanı) ve yeniden başlatma politikasını tek dosyada tanımlar. Dosyayı sürüm kontrolüne koyabilir, tek komutla tekrar kurabilirsiniz. Örnek uygulamamız Uptime Kuma: web sitelerinizi izleyen, 3001 portunda çalışan ve verisini /app/data altında tutan bir araç. İmaj etiketini Docker Hub'daki louislam/uptime-kuma sayfasından kontrol edin.
Proje klasörünü ve Compose dosyasını oluşturun
Klasörü açın ve dosyayı yazın:
mkdir ~/uptime-kuma && cd ~/uptime-kuma
nano compose.yaml
services:
kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "127.0.0.1:3001:3001"
volumes:
- data:/app/data
volumes:
data:
Üç satır önemli. 127.0.0.1: öneki portu yalnızca sunucunun kendi içine bağlar. volumes veriyi container dışında tutar. restart: unless-stopped sunucu yeniden başlayınca uygulamayı açar. Dosyada eski version: satırı yok, Compose v2 onu istemiyor.
Uygulamayı başlatın ve çalıştığını doğrulayın
Arka planda başlatın ve durumu kontrol edin:
docker compose up -d
docker compose ps
docker compose logs -f
curl -I http://127.0.0.1:3001
ps çıktısında durum running görünmeli. curl 200 ya da 302 gibi bir HTTP yanıtı döndürmeli. Günlükten çıkmak için Ctrl+C yeterli, container çalışmaya devam eder.
Günlük kullanılan Docker komutları
| Komut | Ne işe yarar |
|---|---|
docker ps |
Çalışan container'ları listeler |
docker logs -f ad |
Container günlüğünü canlı izler |
docker compose pull |
İmajların yeni sürümünü indirir |
docker compose down |
Container'ları durdurup siler, volume kalır |
docker exec -it ad sh |
Container içinde kabuk açar |
docker system df |
Docker'ın disk kullanımını gösterir |
docker compose down -v komutu volume'u da siler, yani veriniz gider. Ayrıntısı güvenlik bölümünde.
Alan Adı ve HTTPS Bağlama: Nginx Ters Vekil ve Let's Encrypt
Dışarıya yalnızca 80 ve 443 portlarını açacağız. Tarayıcı Nginx'e 443 üzerinden ulaşır, Nginx isteği 127.0.0.1:3001'deki container'a iletir. Certbot sertifikayı alır ve yenilemeyi otomatikleştirir. İstek yolunu aşağıdaki şema gösteriyor.

Alan adının A kaydını sunucu IP'sine yönlendirin
DNS bir telefon rehberi gibidir: alan adını sunucunun IP adresine çevirir. Alan adı panelinizde izleme.ornek.com için sunucu IP'sini gösteren bir A kaydı ekleyin. Alan adınız yoksa alan adı fiyatları sayfasına bakın. Kayıt yayılınca doğrulayın:
dig +short izleme.ornek.com
Çıktı sunucunuzun IP'sini göstermiyorsa birkaç dakika bekleyin. Yayılma süresi sağlayıcıya göre değişir.
Nginx'i kurun ve ters vekil ayarını yazın
Nginx'i sunucuya kurun:
sudo apt install nginx
sudo nano /etc/nginx/sites-available/izleme
Sunucu bloğu şöyle olsun. Uptime Kuma WebSocket kullandığı için Upgrade başlıkları şart:
server {
listen 80;
server_name izleme.ornek.com;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Siteyi etkinleştirip ayarı sınayın:
sudo ln -s /etc/nginx/sites-available/izleme /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Şimdi güvenlik duvarını açın. Sıra önemli: önce SSH'a izin verin, en son enable çalıştırın. Sırayı bozarsanız SSH bağlantınız kopar.
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
Certbot ile Let's Encrypt SSL sertifikasını alın
Certbot'u kurup sertifikayı isteyin:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d izleme.ornek.com
Certbot Nginx ayarını HTTPS için kendisi günceller. Otomatik yenilemeyi deneme modunda sınayın:
sudo certbot renew --dry-run
Tarayıcıda https://izleme.ornek.com adresini açın, adres çubuğunda kilidi görmelisiniz.
Güvenlik, Kalıcı Veri ve İleri Seviye Notlar
Üretimde çoğu kişi iki şeyi atlar: port sızıntısı ve veri kaybı. İkisi de sessizce gelir, ilk olay yaşanana kadar fark edilmez. Birincisi Docker ile UFW'nin etkileşiminden, ikincisi volume'un nasıl çalıştığından kaynaklanır.
Docker'ın UFW'yi neden atladığını anlayın
Docker kendi iptables kurallarını (DOCKER zinciri) ekler. -p 3001:3001 ile yayınlanan port, UFW kurallarından önce işlenir. Sonuç: UFW'de 3001'e izin vermemiş olsanız bile port internetten erişilebilir kalır.

Çözüm basit: Compose dosyasında portu en baştan 127.0.0.1: ile bağlayın. Biz bunu zaten yaptık. İleri seviye ikinci çözüm, DOCKER-USER zincirine kural yazmaktır. Bu zincir Docker kurallarından önce çalışır. Adres çevirisi sonrası çalıştığı için orijinal porta conntrack --ctorigdstport ile bakmanız gerekir.
Doğrulamak için iki kontrol yapın:
sudo ss -tlnp | grep 3001
Çıktıda 127.0.0.1:3001 görmelisiniz, 0.0.0.0:3001 değil. Sonra kendi bilgisayarınızdan nmap -p 3001 SUNUCU_IP ile portun kapalı olduğunu teyit edin. Güvenlik duvarı ve erişim kontrolü, her VDS hosting kurulumunda kullanıcıya düşen sorumluluktur.
Veriyi volume'da tutun ve yedek alın
Container silinince içindeki yazılabilir katman da gider. Veriyi named volume'da tutarsanız container'ı silip yeniden oluşturabilirsiniz. Veri yerinde durur. Bind mount ise host üzerindeki bir klasörü container'a bağlar. Dosyalara doğrudan erişmek istediğinizde uygundur.
docker compose down volume'a dokunmaz. docker compose down -v ise volume'u siler. Bu bayrağı alışkanlıkla yazmayın.
Önce volume adını bulun. Compose, klasör adını önek olarak ekler:
docker volume ls
docker run --rm -v uptime-kuma_data:/veri -v "$PWD":/yedek alpine \
tar czf /yedek/kuma-yedek.tar.gz -C /veri .
Bu komut volume'u tek bir arşive paketler. Arşivi sunucudan başka bir yere kopyalayın. VDS için yedeği kendiniz de almalısınız, sunucudaki kopya sunucu ile birlikte gider.
İleri seviye notlar (Cem için)
- Log rotasyonu: Varsayılan
json-filesürücüsü sınırsız büyür. Servise şunu ekleyin:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
- Kaynak limitleri: Servis altına
mem_limit: 512mvecpus: 1.0yazarak tek container'ın sunucuyu doldurmasını engelleyin. - AlmaLinux:
dnfile Docker'ın RHEL deposunu ekleyipdocker-cekurun. SELinux açıksa bind mount'larda:zetiketini kullanın.firewalldile Docker kural etkileşimini ayrıca sınayın. - Rootless Docker: Daemon'ı root olmadan çalıştırır, saldırı yüzeyini küçültür. Bazı özellikler (1024 altı portlar gibi) kısıtlanır.
Sıkça Sorulan Sorular
Docker kurulumunda en çok sorulan altı soruyu burada kısa ve tek başına okunacak şekilde yanıtlıyoruz.
VDS'te Docker çalıştırmak için kaç GB RAM gerekir?
Docker'ın kendisi hafiftir. Belleği asıl tüketen, içinde çalışan uygulamadır. Küçük bir web uygulaması için 1-2GB ile başlayabilirsiniz, ihtiyaç uygulamaya göre değişir. Paket seçeneklerini sanal sunucu (VDS) paketleri sayfasından karşılaştırabilirsiniz.
Docker Compose nedir, docker run'dan farkı nedir?
Compose, bir veya birden fazla container'ı tek bir YAML dosyasında tanımlar. docker run her seferinde uzun bir komut ister. Compose ile tüm ayarlar dosyada durur, sürüm kontrolüne girer ve docker compose up -d ile aynı sonuç tekrar elde edilir.
Docker'da yayınlanan port UFW'yi neden atlıyor?
Docker, kendi iptables kurallarını UFW'nin kurallarından önce işletir. Bu yüzden -p 3001:3001 ile açılan port UFW'de izin vermeseniz de dışarıdan erişilir. Çözüm, portu Compose dosyasında 127.0.0.1:3001:3001 biçiminde yalnızca sunucunun kendi içine bağlamaktır.
Paylaşımlı hostingde Docker çalışır mı?
Hayır. Paylaşımlı hostingde root erişimi ve Docker'ın ihtiyaç duyduğu çekirdek özellikleri yoktur. Docker için VDS gerekir. Farkın ayrıntısı paylaşımlı hosting ile VDS farkı yazısında anlatılıyor.
Docker container'ı sunucu yeniden başlayınca otomatik açılır mı?
Evet, iki ayar gerekir. Compose dosyasında restart: unless-stopped yazın. Sunucuda sudo systemctl enable docker komutunu çalıştırın. Böylece sunucu açıldığında Docker servisi başlar, Docker da container'ınızı kaldığı yerden ayağa kaldırır.
Container silinince uygulamanın verisi kaybolur mu?
Volume tanımlamadıysanız evet, kaybolur. Named volume kullandıysanız container silinse bile veri durur. Tek istisna docker compose down -v komutudur, volume'u da siler. Önemli veriyi her zaman ayrıca yedekleyin.
Sonuç
VDS Docker kurulumu beş adımda özetlenir: resmi depodan kurulum, Compose dosyası, Nginx ters vekil, Let's Encrypt ile HTTPS ve portu 127.0.0.1'e bağlama. Bu adımlarla ilk uygulamanız güvenli şekilde canlıya çıkar ve sunucu yeniden başladığında kendiliğinden açılır. Sıradaki iş, kendi uygulamanızın compose.yaml dosyasını yazmak.
Docker'a ihtiyacınız yoksa cloud hosting ile shared hosting farkı yazısı yönetilen seçenekleri anlatıyor. Docker için sunucu arıyorsanız ürün sayfasında VDS hosting seçeneklerini görebilirsiniz.
İhtiyaca göre seçin → VDS paketleri
VDS Docker Kurulumu: İlk Uygulamayı Yayına Alma için doğru paketi seçin
LuviHost paketleri NVMe disk, LiteSpeed ve 7/24 Türkçe destekle gelir.
Paketleri Karşılaştır