Kısa cevap: Docker, bir uygulamayı çalışması için gereken her şeyle (kod, kütüphaneler, ayarlar, çalışma ortamı) birlikte "konteyner" adı verilen hafif ve taşınabilir paketlere koyan açık kaynaklı bir platformdur. Docker sayesinde bir uygulama sizin bilgisayarınızda nasıl çalışıyorsa sunucuda da aynen öyle çalışır. Docker'ı kalıcı ve 7/24 erişilebilir şekilde kullanmanın en pratik yolu, root erişimli bir Linux sunucuya kurmaktır. Bu iş için en dengeli seçenek genellikle VDS sunucu kiralama olur.

Bu rehberde Docker'ın ne olduğunu, sanal makineden farkını, hangi projelerde işinize yarayacağını ve Ubuntu ile AlmaLinux sunuculara adım adım nasıl kurulacağını anlatıyoruz. Ardından ilk konteynerinizi çalıştıracak, en çok kullanılan komutları öğrenecek, Docker Compose ile çok parçalı bir uygulama ayağa kaldıracak ve sunucunuzu güvenli hale getirecek ayarları yapacaksınız. Komutları kopyalayıp doğrudan kullanabilirsiniz.

Docker'ı Kısaca Tanıyalım: Konteyner Mantığı Nasıl Çalışır?

Docker'ın temel fikri şudur: Uygulamayı, çalıştığı ortamdan ayırıp tek bir paket halinde taşımak. Geleneksel yöntemde bir web uygulamasını sunucuya kurarken doğru PHP, Node.js veya Python sürümünü yüklemeniz, kütüphaneleri tek tek kurmanız ve ayar dosyalarını elle düzenlemeniz gerekir. Geliştiricinin bilgisayarında çalışan uygulama, sunucuda farklı bir sürüm yüzünden çalışmayabilir. Yazılım dünyasındaki meşhur "benim bilgisayarımda çalışıyordu" sorunu tam olarak budur.

Docker bu sorunu, uygulamayı ihtiyaç duyduğu her şeyle birlikte bir konteynere koyarak çözer. Konteyner, ana işletim sisteminin çekirdeğini (kernel) paylaşır ama kendi dosya sistemine, kendi süreçlerine ve kendi ağ ayarlarına sahiptir. Bu yüzden aynı sunucuda birbirini etkilemeden onlarca farklı uygulama çalıştırabilirsiniz. Örneğin biri PHP 7.4 isteyen eski bir proje, diğeri PHP 8.3 isteyen yeni bir proje olabilir.

Image, container, volume ve network: Dört temel kavram

Docker'ı rahat kullanmak için dört kavramı bilmeniz yeterlidir:

  • Image (imaj): Uygulamanın salt okunur şablonudur. İşletim sistemi katmanını, kütüphaneleri ve uygulama kodunu içerir. Bir yemek tarifi gibi düşünebilirsiniz.
  • Container (konteyner): Bir imajın çalışan halidir. Tariften pişirilmiş yemektir. Aynı imajdan istediğiniz kadar konteyner başlatabilirsiniz.
  • Volume (birim): Konteyner silinse bile kaybolmaması gereken verilerin tutulduğu kalıcı depolama alanıdır. Veritabanı dosyaları ve yüklenen görseller volume'da saklanır.
  • Network (ağ): Konteynerlerin birbiriyle ve dış dünyayla nasıl haberleşeceğini belirleyen sanal ağdır. Örneğin web uygulaması konteyneri, veritabanı konteynerine bu ağ üzerinden ulaşır.

Docker Engine, Docker Compose ve Docker Hub ne işe yarar?

Docker Engine, sunucuda arka planda çalışan ve konteynerleri yöneten asıl motordur. Docker Compose, birden fazla konteynerden oluşan bir uygulamayı tek bir YAML dosyasıyla tanımlayıp tek komutla başlatmanızı sağlayan araçtır. Docker Hub ise hazır imajların paylaşıldığı resmi kayıt merkezidir. Nginx, MariaDB, PostgreSQL, Redis, WordPress ve binlerce popüler yazılımın resmi imajları burada bulunur. Bu üçlü birlikte, karmaşık bir yazılım yığınını dakikalar içinde kurmanıza imkân tanır.

Docker ile Sanal Makine Arasındaki Fark Nedir?

Docker konteyneri ile sanal makine arasındaki temel fark şudur: Sanal makine donanımı sanallaştırıp her biri için ayrı bir işletim sistemi çalıştırır, konteyner ise ana işletim sisteminin çekirdeğini paylaşıp yalnızca uygulamayı izole eder. Bu yüzden konteynerler çok daha hafiftir, saniyeler içinde açılır ve aynı donanımda çok daha fazla uygulama çalıştırmanıza izin verir. Sanal makineler ise daha güçlü bir izolasyon sağlar ve farklı işletim sistemlerini (örneğin Linux sunucu içinde Windows) çalıştırabilir.

ÖzellikDocker konteyneriSanal makine Sanallaştırma seviyesiİşletim sistemi seviyesi (çekirdek paylaşılır)Donanım seviyesi (her VM'in kendi çekirdeği var) Açılış süresiGenellikle saniyelerGenellikle dakikalar BoyutOnlarca–yüzlerce MBBirkaç GB ve üzeri Kaynak tüketimiDüşük, yalnızca uygulamanın ihtiyacı kadarYüksek, her VM tam bir işletim sistemi çalıştırır İzolasyonSüreç seviyesinde, iyiDonanım seviyesinde, çok güçlü Farklı işletim sistemiHayır, ana sistemle aynı çekirdek ailesiEvet, Linux içinde Windows çalışabilir TaşınabilirlikÇok yüksek, imaj her yerde aynı çalışırOrta, disk imajları büyük ve platforma bağlı Tipik kullanımWeb uygulamaları, API'ler, mikroservisler, otomasyon araçlarıTam işletim sistemi gereken iş yükleri, güçlü izolasyon gerektiren ortamlar

Pratikte bu iki teknoloji rakip değil, tamamlayıcıdır. En yaygın kurulum şekli, bir sanal sunucu (yani bir sanal makine) kiralayıp Docker'ı onun içine kurmaktır. Böylece sanal makinenin sağladığı güçlü izolasyon ile konteynerlerin sağladığı hafiflik ve esneklik bir arada kullanılır.

Docker Ne İşe Yarar? Gerçek Kullanım Senaryoları

Docker; uygulamaları hızlı kurmak, farklı projeleri aynı sunucuda birbirinden ayırmak ve geliştirme ortamı ile canlı ortamı birebir aynı tutmak için kullanılır. Teoride kalmaması için en sık karşılaşılan senaryoları sıralayalım:

  • Otomasyon araçları: İş akışı otomasyonu yapan n8n gibi araçlar Docker ile tek komutla kurulur. Adım adım anlatım için n8n'i VDS sunucuya kurma rehberimize göz atabilirsiniz.
  • Kişisel bulut ve medya arşivi: Nextcloud ve Immich gibi kendi sunucunuzda barındırdığınız (self-hosted) uygulamalar neredeyse her zaman Docker ile dağıtılır. Bu kurulumu kendi bulut depolama alanınızı kurma yazımızda anlattık.
  • Web uygulamaları ve API'ler: Node.js, Python, Go veya PHP ile yazılmış uygulamalar; veritabanı, önbellek ve ters vekil sunucu (reverse proxy) ile birlikte tek bir Compose dosyasıyla yönetilir.
  • Botlar ve arka plan servisleri: Telegram ve Discord botları, zamanlanmış görevler ve kuyruk işleyicileri, çökerse otomatik yeniden başlayacak şekilde konteynerde çalıştırılır.
  • Test ve geliştirme ortamları: Bir yazılımın yeni sürümünü canlı sistemi bozmadan ayrı bir konteynerde deneyebilir, işiniz bitince tek komutla tamamen silebilirsiniz.
  • Yapay zekâ ve veri projeleri: Yerel dil modelleri, vektör veritabanları ve veri işleme araçları çoğunlukla hazır Docker imajlarıyla gelir.
  • Sürekli entegrasyon ve dağıtım (CI/CD): Kod her güncellendiğinde yeni imaj üretilir ve sunucuya otomatik olarak dağıtılır. Bu sayede güncelleme ve geri alma işlemleri dakikalar sürer.

Docker'ı Nerede Çalıştırmalısınız?

Docker'ı kalıcı bir hizmet olarak çalıştırmak istiyorsanız root erişimi olan, kaynakları size ayrılmış ve 7/24 açık bir Linux sunucuya ihtiyacınız vardır. Kişisel bilgisayar öğrenmek için iyidir ama kapandığında servisleriniz de durur. Paylaşımlı hosting ise root erişimi vermediği için Docker çalıştırmaya uygun değildir. Seçenekleri yan yana koyalım:

OrtamDocker çalışır mı?7/24 erişimKaynak garantisiKimler için uygun? Kişisel bilgisayarEvetHayır, bilgisayar kapanınca dururBilgisayarın kendisiÖğrenme ve yerel geliştirme Paylaşımlı hostingHayır, root erişimi yokEvetPaylaşımlıKlasik PHP siteleri ve WordPress VPS sunucuEvetEvetKısmi, kaynaklar paylaşılabilirKüçük projeler ve test ortamları VDS sunucuEvetEvetYüksek, kaynaklar size ayrılırCanlı projeler, çok konteynerli yapılar Bulut sunucuEvetEvetYüksek, kolay ölçeklenirBüyüyen ve trafiği değişken projeler Fiziksel sunucuEvetEvetTam, donanım tamamen sizinYoğun iş yükleri ve çok sayıda konteyner

Başlangıç ve test amaçlı projelerde bir VPS sunucu yeterli olabilir. Canlı ortamda birden fazla konteyner çalıştıracaksanız, işlemci ve belleği size ayrılmış bir VDS daha tutarlı performans verir. Trafiği ani artışlar gösteren, kaynakları hızla büyütülmesi gereken projelerde ise bulut sunucu kiralama seçeneği esneklik sağlar. Bir noktayı da unutmayın: Docker'ın sorunsuz çalışması için sunucunun KVM gibi tam sanallaştırma kullanması gerekir. Bazı eski kapsayıcı tabanlı sanallaştırma türlerinde Docker kısıtlı çalışır.

Docker için kaç GB RAM ve ne kadar disk gerekir?

Docker'ın kendisi çok az kaynak tüketir. Asıl ihtiyacı belirleyen, içinde çalıştıracağınız uygulamalardır. Aşağıdaki tablo yaygın senaryolar için başlangıç noktası verir:

SenaryoÖnerilen vCPUÖnerilen RAMÖnerilen disk Docker öğrenme, tek bir küçük uygulama veya bot1–2 çekirdek2 GB20–40 GB NVMe n8n, Uptime Kuma gibi birkaç araç2 çekirdek4 GB40–60 GB NVMe Web uygulaması, veritabanı ve önbellek yığını2–4 çekirdek4–8 GB60–100 GB NVMe Nextcloud veya Immich gibi medya ağırlıklı uygulamalar4 çekirdek8 GBMedya arşivine göre 100 GB ve üzeri Çok sayıda konteyner ve yoğun trafik4–8+ çekirdek16 GB ve üzeriİhtiyaca göre

Disk türü en az RAM kadar önemlidir. Docker imajları çekilirken, konteynerler başlatılırken ve veritabanları sorgu işlerken yoğun okuma ve yazma yapılır. NVMe SSD diskler bu işlemleri klasik SATA SSD'lere göre çok daha hızlı tamamlar, bu da konteyner açılış sürelerine ve uygulama yanıt hızına doğrudan yansır.

Docker Kurulumu Öncesi Kontrol Listesi

Kuruluma başlamadan önce aşağıdaki maddeleri kontrol etmek, sonradan karşılaşacağınız sorunların çoğunu baştan önler:

  • ☐ Sunucunuzda desteklenen güncel bir Linux dağıtımı kurulu mu? (Ubuntu LTS, Debian, AlmaLinux veya Rocky Linux önerilir.)
  • ☐ Sunucuya root ya da sudo yetkili bir kullanıcıyla bağlanabiliyor musunuz?
  • ☐ SSH bağlantınız çalışıyor mu? Emin değilseniz SSH ile sunucuya bağlanma rehberimize göz atın.
  • ☐ Sistem paketleri güncel mi?
  • ☐ En az 2 GB RAM ve 20 GB boş disk alanınız var mı?
  • ☐ Sunucu KVM gibi tam sanallaştırma kullanıyor mu?
  • ☐ Hangi portları dışarıya açacağınızı belirlediniz mi?
  • ☐ Varsa eski veya resmi olmayan Docker paketlerini kaldırdınız mı?

Linux sunucunuz henüz yoksa, Docker için en sorunsuz başlangıç Ubuntu LTS kurulu bir Linux sunucu ile yapılır. Bu rehberdeki komutlar da bu dağıtım üzerinde test edilebilir şekilde hazırlanmıştır.

Ubuntu Sunucuya Docker Nasıl Kurulur?

Ubuntu'ya Docker kurmanın önerilen yolu, Docker'ın resmi paket deposunu ekleyip docker-ce paketini bu depodan yüklemektir. Ubuntu'nun kendi deposundaki docker.io paketi çoğu zaman daha eski bir sürüm sunar. Aşağıdaki adımları sırasıyla uygulayın.

Adım 1: Eski paketleri kaldırın

Sunucuda daha önce farklı kaynaklardan kurulmuş Docker paketleri varsa çakışma yaşamamak için önce bunları kaldırın. Paketler yüklü değilse komut sadece bunu bildirir ve devam edebilirsiniz.

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y $pkg; done

Adım 2: Gerekli araçları kurun ve GPG anahtarını ekleyin

Docker deposunun güvenilir olduğunu doğrulamak için resmi GPG anahtarını sisteme ekliyoruz:

sudo apt-get update
sudo apt-get install -y 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

Adım 3: Docker deposunu ekleyin

Aşağıdaki komut, sunucunuzun mimarisini ve Ubuntu sürümünü otomatik algılayarak doğru depoyu ekler:

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-get update

Adım 4: Docker Engine ve Compose eklentisini kurun

Bu komut Docker motorunu, komut satırı aracını, containerd çalışma zamanını, imaj derleme eklentisi Buildx'i ve Docker Compose eklentisini birlikte kurar:

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Adım 5: Servisi başlatın ve açılışta çalışacak şekilde ayarlayın

Ubuntu'da Docker servisi kurulumdan sonra genellikle otomatik başlar. Sunucu yeniden başladığında da açılması için servisi etkinleştirdiğinizden emin olun:

sudo systemctl enable --now docker
sudo systemctl status docker

Çıktıda active (running) ifadesini görüyorsanız kurulum başarıyla tamamlanmıştır.

AlmaLinux ve Rocky Linux'a Docker Nasıl Kurulur?

AlmaLinux ve Rocky Linux gibi RHEL tabanlı dağıtımlarda Docker, resmi RHEL deposu eklenerek dnf paket yöneticisiyle kurulur. Bu dağıtımlarda Podman ve Buildah varsayılan olarak gelebileceği için önce olası çakışmaları gidermek iyi bir fikirdir.

sudo dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker

RHEL tabanlı sistemlerde Docker servisi kurulumdan sonra kendiliğinden başlamaz. Bu yüzden son satırdaki systemctl enable --now docker komutu zorunludur. Sunucunuzda firewalld etkinse, dışarıya açacağınız portları ayrıca tanımlamanız gerekebilir.

Docker Kurulumunu Doğrulama ve sudo'suz Kullanım

Kurulumun gerçekten çalıştığını anlamanın en kolay yolu, Docker'ın test imajı hello-world'ü çalıştırmaktır. Bu komut imajı Docker Hub'dan indirir, bir konteyner başlatır ve ekrana bir karşılama mesajı yazdırır:

sudo docker run hello-world
docker --version
docker compose version

Her Docker komutunun başına sudo yazmak istemiyorsanız, kullanıcınızı docker grubuna ekleyebilirsiniz:

sudo usermod -aG docker $USER
newgrp docker
docker run hello-world

Önemli güvenlik notu: docker grubundaki bir kullanıcı, pratikte sunucu üzerinde root yetkisine sahip olur. Çünkü bu kullanıcı, ana sistemin dosya sistemini bir konteynere bağlayıp istediği değişikliği yapabilir. Bu gruba yalnızca tamamen güvendiğiniz kullanıcıları ekleyin.

İlk Konteynerinizi Çalıştırın: Nginx Örneği

Docker'ın gücünü görmenin en hızlı yolu, tek komutla bir web sunucusu ayağa kaldırmaktır. Aşağıdaki komut resmi Nginx imajını indirir ve sunucunuzun 8080 portunda yayın yapan bir konteyner başlatır:

docker run -d --name ilk-web -p 8080:80 --restart unless-stopped nginx:stable

Bu komuttaki parametrelerin anlamı şöyledir:

  • -d: Konteyneri arka planda (detached) çalıştırır, terminali meşgul etmez.
  • --name ilk-web: Konteynere hatırlanabilir bir isim verir. Aksi halde Docker rastgele bir isim atar.
  • -p 8080:80: Sunucunun 8080 portunu konteynerin 80 portuna yönlendirir. Soldaki değer sunucu, sağdaki konteyner portudur.
  • --restart unless-stopped: Konteyner çökerse veya sunucu yeniden başlarsa otomatik olarak tekrar başlatır. Siz elle durdurmadıkça çalışmaya devam eder.
  • nginx:stable: Kullanılacak imaj ve etiketi (tag) belirtir. Canlı sistemlerde latest yerine belirli bir sürüm etiketi kullanmak daha güvenlidir.

Tarayıcınızda http://sunucu-ip-adresiniz:8080 adresini açtığınızda Nginx karşılama sayfasını görmelisiniz. Konteynerin durumunu ve kayıtlarını şu komutlarla inceleyebilirsiniz:

docker ps
docker logs ilk-web
docker stop ilk-web
docker rm ilk-web

En Çok Kullanılan Docker Komutları

Günlük Docker kullanımının büyük bölümü birkaç temel komutla yapılır. Aşağıdaki tabloyu kısa bir başvuru kartı olarak kaydedebilirsiniz:

KomutNe işe yarar? docker pull nginx:stableBir imajı Docker Hub'dan indirir. docker imagesSunucudaki tüm imajları listeler. docker run -d -p 80:80 imajİmajdan yeni bir konteyner oluşturup arka planda başlatır. docker psÇalışan konteynerleri listeler. docker ps -aDurmuş olanlar dahil tüm konteynerleri listeler. docker stop isimÇalışan bir konteyneri durdurur. docker start isimDurmuş bir konteyneri yeniden başlatır. docker restart isimKonteyneri kapatıp yeniden açar. docker rm isimDurmuş bir konteyneri siler. docker rmi imajKullanılmayan bir imajı siler. docker logs -f isimKonteynerin kayıtlarını canlı olarak izler. docker exec -it isim shÇalışan konteynerin içinde komut satırı açar. docker statsKonteynerlerin anlık CPU, RAM ve ağ kullanımını gösterir. docker volume lsKalıcı depolama birimlerini listeler. docker system dfDocker'ın kullandığı toplam disk alanını gösterir. docker system pruneKullanılmayan konteyner, ağ ve imajları temizler.

docker system prune komutunu çalıştırırken dikkatli olun. Komuta -a --volumes parametrelerini eklerseniz kullanılmayan tüm imajlar ve volume'lar da silinir. Bu da yedeği alınmamış verilerin kaybolması anlamına gelebilir.

Docker Compose ile Çok Konteynerli Uygulama Nasıl Kurulur?

Docker Compose, birden fazla konteynerden oluşan bir uygulamayı tek bir compose.yaml dosyasında tanımlayıp docker compose up -d komutuyla tek seferde başlatmanızı sağlar. Uzun docker run komutlarını ezberlemek yerine bütün yapılandırma okunabilir bir dosyada durur. Bu dosyayı sürüm kontrolüne ekleyebilir, başka bir sunucuya taşıyabilir ya da ekibinizle paylaşabilirsiniz.

Örnek olarak bir WordPress sitesini ve onun MariaDB veritabanını birlikte kuralım. Önce bir proje klasörü oluşturun:

mkdir -p ~/wordpress-docker && cd ~/wordpress-docker
nano compose.yaml

Açılan dosyaya aşağıdaki içeriği yapıştırın ve şifreleri kendi güçlü şifrelerinizle değiştirin:

services:
  db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wpuser
      MARIADB_PASSWORD: guclu-bir-sifre
      MARIADB_ROOT_PASSWORD: cok-guclu-bir-root-sifresi
    volumes:
      - db_data:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8081:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: guclu-bir-sifre
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

Dosyayı kaydettikten sonra uygulamayı başlatın:

docker compose up -d
docker compose ps
docker compose logs -f wordpress

Bu yapıda dikkat edilmesi gereken birkaç nokta var. WordPress konteyneri veritabanına db adıyla ulaşır, çünkü Compose aynı dosyadaki servisleri ortak bir ağa bağlar ve servis isimlerini adres olarak kullanmanıza izin verir. db_data ve wp_data volume'ları sayesinde konteynerleri silip yeniden oluştursanız bile veritabanınız ve yüklediğiniz dosyalar korunur. Uygulamayı durdurmak için docker compose down komutu yeterlidir. Bu komut volume'ları silmez, verileriniz yerinde kalır.

Canlı bir sitede şifreleri doğrudan YAML dosyasına yazmak yerine aynı klasörde bir .env dosyası kullanmanız ve önüne SSL sertifikası yöneten bir ters vekil sunucu koymanız önerilir. Docker kullanmadan, LiteSpeed altyapısı ve hazır optimizasyonlarla yalnızca WordPress çalıştırmak istiyorsanız WordPress hosting paketleri sunucu yönetimiyle uğraşmadan daha hızlı bir başlangıç sunar.

Kendi Docker İmajınızı Oluşturma: Dockerfile Örneği

Dockerfile, kendi uygulamanız için bir Docker imajının adım adım nasıl oluşturulacağını tarif eden düz metin dosyasıdır. Hazır imajlar çoğu ihtiyacı karşılasa da kendi yazdığınız bir uygulamayı konteynere koymak için Dockerfile yazmanız gerekir. Aşağıda basit bir Node.js uygulaması için örnek bir Dockerfile görüyorsunuz:

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
USER node
CMD ["node", "server.js"]

Her satırın görevi kısaca şöyledir. FROM temel imajı seçer; alpine etiketli imajlar küçük boyutlarıyla öne çıkar. WORKDIR çalışma klasörünü belirler. Önce yalnızca package.json dosyalarının kopyalanıp bağımlılıkların kurulması, Docker'ın katman önbelleğinden yararlanmasını sağlar. Böylece sadece kodunuz değiştiğinde bağımlılıklar yeniden indirilmez ve derleme çok daha hızlı biter. USER node satırı ise uygulamanın root yerine yetkisiz bir kullanıcıyla çalışmasını sağlayarak güvenliği artırır.

İmajı derlemek ve çalıştırmak için proje klasöründe şu komutları kullanın:

docker build -t benim-uygulamam:1.0 .
docker run -d --name uygulama -p 3000:3000 --restart unless-stopped benim-uygulamam:1.0

Proje klasörünüze bir .dockerignore dosyası ekleyip node_modules, .git ve .env gibi klasör ve dosyaları imaja dahil etmemeniz hem imaj boyutunu küçültür hem de gizli bilgilerin sızmasını önler.

Docker Sunucu Güvenliği: Mutlaka Yapmanız Gerekenler

Docker güvenliği, sunucu güvenliğinin bir parçasıdır. En kritik kural, yalnızca gerçekten dışarıya açılması gereken portları yayınlamak ve geri kalan her şeyi sunucunun içinde tutmaktır. Docker'ın varsayılan davranışının bazı yeni kullanıcıları şaşırttığını da bilmek gerekir. Docker, -p ile yayınladığınız portlar için iptables kurallarını kendisi yazar. Bu yüzden UFW gibi güvenlik duvarlarında kapattığınızı düşündüğünüz bir port, Docker üzerinden dışarıya açık kalabilir.

Aşağıdaki kontrol listesi, Docker çalıştıran bir sunucunun temel güvenlik ihtiyaçlarını karşılar:

  • ☐ Veritabanı, Redis ve yönetim panelleri gibi iç servisleri dışarıya açmayın. Port yayınlamanız gerekiyorsa yalnızca yerel adrese bağlayın: -p 127.0.0.1:5432:5432.
  • ☐ Web trafiğini 80 ve 443 portlarında çalışan tek bir ters vekil sunucu üzerinden yönetin ve SSL sertifikası kullanın.
  • ☐ İmajları yalnızca resmi veya güvendiğiniz kaynaklardan çekin.
  • ☐ Canlı sistemlerde latest yerine sabit sürüm etiketleri kullanın ve imajları düzenli aralıklarla güncelleyin.
  • ☐ Konteynerleri mümkün olduğunca root olmayan bir kullanıcıyla çalıştırın.
  • ☐ Şifre ve API anahtarlarını imajın içine gömmeyin; .env dosyası veya secret yönetimi kullanın.
  • ☐ Konteynerlere --memory ve --cpus ile kaynak sınırı koyun. Böylece tek bir uygulama tüm sunucuyu kilitleyemez.
  • ☐ docker grubuna yalnızca güvendiğiniz kullanıcıları ekleyin.
  • ☐ Volume'larınızın düzenli yedeğini alın ve yedeği sunucu dışında saklayın.
  • ☐ SSH için parola yerine anahtar kullanın ve root ile doğrudan girişi kapatın.

Sunucu genelinde alınması gereken diğer önlemler için sanal sunucu güvenliğini 10 adımda sağlama rehberimizi de mutlaka uygulayın.

Sık Karşılaşılan Docker Hataları ve Çözümleri

Docker'a yeni başlayanların karşılaştığı hataların büyük çoğunluğu birkaç tekrarlayan sebepten kaynaklanır. Aşağıdaki hatalar ve çözümleri, sorunların önemli bir kısmını dakikalar içinde gidermenizi sağlar.

"permission denied while trying to connect to the Docker daemon socket"

Bu hata, kullanıcınızın Docker servisine erişim yetkisi olmadığını gösterir. Komutun başına sudo ekleyin ya da kullanıcınızı sudo usermod -aG docker $USER komutuyla docker grubuna ekleyip oturumu kapatıp yeniden açın.

"port is already allocated" veya "address already in use"

Kullanmak istediğiniz port başka bir konteyner ya da sunucuda çalışan başka bir servis tarafından kullanılıyordur. sudo ss -tulpn | grep :8080 komutuyla portu kimin kullandığını bulun. Ardından o servisi durdurun ya da -p 8090:80 gibi farklı bir port seçin.

Konteyner açılır açılmaz kapanıyor

Konteyner, içindeki ana süreç sona erdiğinde kapanır. Çoğu zaman sebep, hatalı bir ortam değişkeni ya da eksik bir yapılandırma dosyasıdır. docker ps -a ile konteynerin çıkış kodunu, docker logs konteyner-adi ile de hata mesajını görebilirsiniz. Hatanın sebebi neredeyse her zaman kayıtların son satırlarında yazar.

"no space left on device"

Eski imajlar, durmuş konteynerler ve derleme önbelleği zamanla diskte ciddi yer kaplar. docker system df ile neyin ne kadar alan kullandığını görün. Ardından docker system prune ile kullanılmayan kaynakları temizleyin. Sorun sık tekrarlanıyorsa konteyner kayıtlarına boyut sınırı koymayı ya da disk kapasitesini artırmayı değerlendirin.

İmaj indirilirken "toomanyrequests" hatası

Docker Hub, oturum açmadan yapılan indirmelere belirli bir süre içinde sınır uygular. Sık imaj çeken sunucularda ücretsiz bir Docker Hub hesabı açıp docker login komutuyla oturum açmak bu sınırı genişletir.

Docker Projeleriniz İçin Neden Türkiye Lokasyonlu Sunucu?

Kullanıcılarınız Türkiye'deyse Docker uygulamalarınızı Türkiye'deki bir veri merkezinde çalıştırmak gecikmeyi (ping) düşürür ve sayfa yanıt sürelerini kısaltır. Bu fark özellikle API'ler, gerçek zamanlı uygulamalar, botlar ve yönetim panelleri gibi her etkileşimde sunucuya istek atan projelerde belirgin şekilde hissedilir. Kişisel verilerin yurt içinde tutulması ise KVKK uyumu açısından da işinizi kolaylaştırır. Yerel altyapının diğer avantajlarını Türkiye sunucu sayfamızda ayrıntılı olarak bulabilirsiniz.

TuemCloud, Türkiye lokasyonlu ve NVMe SSD diskli sanal sunucular sunan bir hosting ve sunucu sağlayıcısıdır. NVMe altyapısı, imaj indirme, konteyner başlatma ve veritabanı işlemleri gibi diske yoğun erişen Docker iş yüklerinde doğrudan hız kazancı sağlar. 7/24 teknik destek ekibi de kurulum veya ağ ayarlarında takıldığınızda sizi yalnız bırakmaz.

Docker Projelerinizi TuemCloud VDS Üzerinde Başlatın

Bu rehberdeki adımları uygulamak için ihtiyacınız olan tek şey, root erişimli ve kaynakları size ayrılmış bir Linux sunucu. Docker kullanmaya yeni başlıyorsanız 2–4 GB RAM'li bir paketle başlayıp projeniz büyüdükçe kaynakları artırabilirsiniz. Çok konteynerli yapılarda, veritabanı ağırlıklı uygulamalarda ve medya arşivlerinde ise disk hızı belirleyici hale gelir. Bu tür projeler için NVMe VDS sunucu paketlerimiz, Türkiye lokasyonu ve 7/24 destekle Docker iş yükleriniz için güçlü bir temel sunar. Hangi paketin projenize uygun olduğundan emin değilseniz destek ekibimize ihtiyaçlarınızı anlatmanız yeterli; doğru kaynak planlamasında size yardımcı oluruz.

Sıkça Sorulan Sorular

Docker ücretsiz mi?

Evet. Sunucularda kullanılan Docker Engine ve Docker Compose açık kaynaklıdır ve ücretsiz kullanılabilir. Masaüstü bilgisayarlar için sunulan Docker Desktop uygulaması ise büyük şirketlerde ticari kullanım için ücretli abonelik gerektirebilir. Bu rehberdeki sunucu kurulumu tamamen ücretsiz bileşenlerle yapılır.

Docker paylaşımlı hostingde çalışır mı?

Hayır. Docker'ın çalışması için root erişimi ve sistem servislerini yönetme yetkisi gerekir. Paylaşımlı hosting bu yetkileri vermez. Docker kullanmak için VPS, VDS, bulut veya fiziksel sunucu gibi root erişimli bir ortama ihtiyacınız vardır.

Docker mı yoksa sanal makine mi kullanmalıyım?

Uygulama çalıştırmak, servisleri birbirinden ayırmak ve hızlı dağıtım yapmak istiyorsanız Docker daha hafif ve pratiktir. Farklı bir işletim sistemine ya da çok güçlü bir izolasyona ihtiyacınız varsa sanal makine daha uygundur. En yaygın yöntem ise ikisini birlikte kullanmak, yani sanal sunucu içinde Docker çalıştırmaktır.

Docker Windows sunucuda çalışır mı?

Windows Server üzerinde Docker çalıştırmak mümkündür, ancak Docker ekosistemindeki imajların büyük çoğunluğu Linux için hazırlanmıştır. Bu nedenle Docker için en sorunsuz ve en verimli seçim Linux sunucudur. Ubuntu LTS, Debian veya AlmaLinux bu iş için en yaygın tercihlerdir.

Konteyner silinirse verilerim kaybolur mu?

Veriler konteynerin kendi dosya sisteminde tutuluyorsa evet, konteyner silindiğinde kaybolur. Bunu önlemek için veritabanı dosyaları ve yüklenen içerikler gibi kalıcı verileri volume'larda ya da sunucudaki bir klasöre bağlanmış (bind mount) alanlarda saklayın. Bu alanları ayrıca düzenli olarak yedekleyin.