
Docker kurulumu, uygulamalarınızı bağımlılıklarıyla birlikte paketleyip her ortamda aynı şekilde çalıştırmanın en pratik yoludur. Bir VDS üzerinde Docker kullandığınızda veritabanı, web sunucusu ve uygulama katmanlarını birbirinden izole konteynerlerde çalıştırabilir, sunucuyu kirletmeden yeni servisler deneyebilirsiniz. Bu rehberde Docker'ı Ubuntu 22.04/24.04 ve AlmaLinux 9 üzerinde resmi Docker deposundan kuruyor, ilk konteynerinizi çalıştırıyor ve canlı ortamda atlanmaması gereken güvenlik ayrıntılarını anlatıyoruz.
Docker Nedir, Sanal Makineden Farkı Ne?
Docker, uygulamaları konteyner adı verilen izole ortamlarda çalıştıran bir platformdur. Sanal makineler her biri için ayrı bir işletim sistemi çekirdeği ve tam bir sistem çalıştırırken, konteynerler ana makinenin çekirdeğini paylaşır ve yalnızca uygulamanın ihtiyaç duyduğu dosyaları içerir. Bu yüzden saniyeler içinde başlar ve çok daha az bellek tüketir.
| Özellik | Konteyner (Docker) | Sanal makine |
|---|---|---|
| Çekirdek | Ana makineyle paylaşılır | Her VM'in kendi çekirdeği vardır |
| Başlama süresi | Saniyeler | Dakikalar |
| Kaynak kullanımı | Düşük | Daha yüksek |
| İzolasyon | Süreç düzeyinde | Donanım sanallaştırma düzeyinde |
| Tipik kullanım | Uygulama ve servis dağıtımı | Tam işletim sistemi gerektiren iş yükleri |
Docker'ın çalışabilmesi için çekirdek özelliklerine (cgroups, namespaces) tam erişim gerekir. KVM gibi tam sanallaştırma kullanan VDS'lerde Docker sorunsuz çalışır; çekirdeği ana makineyle paylaşan bazı konteyner tabanlı sanal sunucularda ise kurulum mümkün olmayabilir.
Kurulum Öncesi: Dağıtım Paketleri mi, Resmi Depo mu?
Ubuntu deposunda docker.io, AlmaLinux'ta ise Docker uyumlu podman paketleri bulunur. Ancak Docker Engine'in güncel sürümünü, Compose eklentisini ve Buildx'i birlikte almak için Docker'ın kendi resmi deposunu kullanmak önerilen yöntemdir. Aynı sistemde dağıtım paketleriyle resmi paketleri karıştırmak çakışmalara yol açar; bu yüzden önce eski paketleri kaldırıyoruz.
Ayrıca internetteki curl ... | sh biçimindeki kolaylık betikleri test ortamları için tasarlanmıştır. Canlı sunucuda aşağıdaki depo tabanlı yöntemi kullanın; böylece Docker, normal sistem güncellemelerinizle birlikte güncellenir.
Ubuntu 22.04 ve 24.04'te Docker Kurulumu
- Çakışabilecek paketleri kaldırın. Sistemde yoksa komut yalnızca bulunamadı der:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove -y $pkg; done - Docker'ın GPG anahtarını ekleyin:
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 - Depoyu ekleyin. Komut, Ubuntu sürümünüzün kod adını (22.04 için jammy, 24.04 için noble) otomatik bulur:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - Docker Engine, CLI, containerd, Buildx ve Compose eklentisini kurun:
sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ubuntu'da Docker servisi kurulumla birlikte başlar ve açılışta otomatik çalışacak şekilde etkinleştirilir.
AlmaLinux 9'da Docker Kurulumu
AlmaLinux 9, RHEL 9 ile uyumlu olduğu için Docker'ın RHEL deposu kullanılabilir. Önce dağıtımla gelen Podman ve Buildah paketlerini kaldırın, çünkü Docker paketleriyle çakışırlar:
sudo dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc buildah
Ardından depoyu ekleyip paketleri kurun:
sudo dnf install -y 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
Kurulum sırasında Docker'ın GPG anahtarını onaylamanız istenebilir; parmak izinin Docker belgelerindeki değerle eşleştiğini kontrol edin. AlmaLinux'ta servis kendiliğinden başlamaz, etkinleştirmeniz gerekir:
sudo systemctl enable --now docker
Kurulumu Doğrulama ve İlk Konteyner
Her iki dağıtımda da kurulumu test konteyneriyle doğrulayın:
sudo docker version
sudo docker compose version
sudo docker run hello-world
hello-world imajı indirilip çalıştırıldığında kurulumun başarılı olduğunu bildiren bir mesaj görürsünüz. Şimdi işe yarar bir konteyner çalıştıralım: Nginx web sunucusu.
sudo docker run -d --name web -p 127.0.0.1:8080:80 --restart unless-stopped nginx:stable
Bu komutta:
-dkonteyneri arka planda çalıştırır.--name webkonteynere akılda kalıcı bir ad verir.-p 127.0.0.1:8080:80sunucunun yalnızca yerel 8080 portunu konteynerin 80 portuna bağlar.--restart unless-stoppedsunucu yeniden başladığında konteynerin de otomatik açılmasını sağlar.
curl -I http://127.0.0.1:8080
sudo docker ps
sudo docker logs web
Docker Compose ile Çok Konteynerli Uygulama
Gerçek projelerde genellikle birden fazla konteyner birlikte çalışır. Compose, bunları tek bir YAML dosyasında tanımlamanızı sağlar. Docker'ın güncel sürümlerinde Compose bir eklentidir ve komut docker-compose değil docker compose şeklinde yazılır. Örnek bir proje dizini oluşturun:
mkdir -p ~/uygulama && cd ~/uygulama
nano compose.yaml
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: degistirin-guclu-parola
MARIADB_DATABASE: uygulama
volumes:
- db_data:/var/lib/mysql
web:
image: nginx:stable
restart: unless-stopped
ports:
- "127.0.0.1:8080:80"
depends_on:
- db
volumes:
db_data:
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs -f
Veritabanı verisi db_data adlı kalıcı birimde (volume) saklanır; konteyneri silip yeniden oluştursanız bile veri kaybolmaz. Parolaları gerçek projelerde dosyaya düz yazmak yerine aynı dizindeki bir .env dosyasında tutun ve bu dosyanın izinlerini kısıtlayın.
Güvenlik: Docker ve Güvenlik Duvarı İlişkisi
Docker ile ilgili en sık gözden kaçan konu budur: Docker, yayınlanan portlar için iptables kurallarını doğrudan kendisi yazar. Bu kurallar UFW'nin kurallarından önce işlendiği için -p 8080:80 şeklinde yayınladığınız bir port, UFW'de kapalı görünse bile internete açık olabilir. AlmaLinux'ta da Docker firewalld'ye kendi bölgesini ekler ve yayınlanan portlar benzer şekilde erişilebilir hale gelir.
Bu nedenle şu kurallara uyun:
- Doğrudan dışarıya açılması gerekmeyen portları
127.0.0.1:önekiyle yalnızca yerel arayüze bağlayın. - Veritabanı konteynerlerinin portunu hiç yayınlamayın; aynı Compose ağı içindeki konteynerler birbirine servis adıyla (
db) erişir. - Web uygulamalarını ana makinedeki Nginx üzerinden ters vekil ile yayınlayın ve SSL'i orada sonlandırın. Nginx tarafı için Nginx kurulum rehberimize bakabilirsiniz.
- Kurulumdan sonra portların dışarıdan nasıl göründüğünü port kontrol aracı ile test edin.
Docker Grubuna Kullanıcı Eklemek
Her komutta sudo yazmamak için kullanıcınızı docker grubuna ekleyebilirsiniz:
sudo usermod -aG docker $USER
Değişikliğin geçerli olması için oturumu kapatıp yeniden açın. Ancak şunu bilin: docker grubundaki bir kullanıcı, ana makinenin dosya sistemini konteynere bağlayarak fiilen root yetkisi elde edebilir. Bu grubu yalnızca root'a güvendiğiniz kadar güvendiğiniz kullanıcılara verin.
İmaj Seçimi ve Güncelleme Alışkanlıkları
Konteyner güvenliği büyük ölçüde hangi imajı çalıştırdığınıza bağlıdır. Birkaç basit kural riskleri ciddi biçimde azaltır:
- Resmi veya doğrulanmış imajları tercih edin. Docker Hub'da kimin yayımladığı belli olmayan imajlar zararlı yazılım içerebilir.
- latest etiketine güvenmeyin.
nginx:latesther çekişte farklı bir sürüm getirebilir.nginx:stableveya belirli bir sürüm numarası kullanmak, güncellemeleri kontrollü yapmanızı sağlar. - İmajları düzenli güncelleyin. Ana makineyi güncellemek konteyner içindeki paketleri güncellemez. Compose projelerinde
docker compose pullve ardındandocker compose up -dile imajları yenileyin. - Konteynerleri gereksiz yetkiyle çalıştırmayın.
--privilegedparametresi ve Docker soketinin (/var/run/docker.sock) konteynere bağlanması, konteynere ana makine üzerinde geniş yetki verir; yalnızca gerçekten gerekiyorsa kullanın.
Disk ve Günlük Yönetimi
Docker zamanla kullanılmayan imajlar, durmuş konteynerler ve büyüyen günlük dosyalarıyla diski doldurabilir. Konteyner günlüklerini sınırlamak için /etc/docker/daemon.json dosyasını oluşturun:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
sudo systemctl restart docker
Bu ayar yalnızca yeni oluşturulan konteynerlere uygulanır; mevcut konteynerleri yeniden oluşturmanız gerekir. Disk kullanımını görmek ve temizlik yapmak için:
sudo docker system df
sudo docker image prune
sudo docker system prune
docker system prune durmuş tüm konteynerleri ve kullanılmayan ağları siler. --volumes parametresini eklerseniz kullanılmayan birimler ve içindeki veriler de silinir; bu parametreyi yedek almadan kullanmayın.
Sık Kullanılan Docker Komutları
| Komut | Açıklama |
|---|---|
docker ps -a | Çalışan ve durmuş tüm konteynerleri listeler |
docker images | Yerel imajları listeler |
docker exec -it web sh | Çalışan konteynerin içinde kabuk açar |
docker stop web / docker start web | Konteyneri durdurur veya başlatır |
docker rm web | Durmuş konteyneri siler |
docker stats | Konteynerlerin anlık CPU ve bellek kullanımını gösterir |
docker compose pull && docker compose up -d | İmajları günceller ve konteynerleri yeniler |
Sık Sorulan Sorular
Docker için kaç GB RAM gerekir?
Docker Engine'in kendisi az kaynak kullanır; ihtiyacı konteynerlerde çalışan uygulamalar belirler. Birkaç hafif servis için 2 GB yeterli olabilir, veritabanı ve birden fazla uygulama çalıştıracaksanız 4 GB ve üzeri daha rahattır. Ayrıntılar için VDS RAM seçimi yazımıza bakabilirsiniz.
Docker ile Podman arasındaki fark nedir?
Podman, arka planda sürekli çalışan bir servise ihtiyaç duymayan ve varsayılan olarak rootless çalışabilen bir konteyner aracıdır. Komutları büyük ölçüde Docker ile uyumludur. Docker Compose ve Docker ekosistemine bağımlı projeler için Docker daha sorunsuzdur.
Konteyner silinince verilerim kaybolur mu?
Konteynerin kendi dosya sistemine yazılan veriler kaybolur. Kalıcı olması gereken veriyi mutlaka bir volume veya ana makinedeki bir dizine bağlayarak saklayın ve bu verileri düzenli olarak yedekleyin.
Docker'ı nasıl güncellerim?
Resmi depoyu kullandığınız için Ubuntu'da sudo apt-get upgrade, AlmaLinux'ta sudo dnf upgrade ile Docker diğer paketlerle birlikte güncellenir.
Sunucu yeniden başladığında konteynerler otomatik açılır mı?
Docker servisi açılışta etkinse ve konteyner --restart unless-stopped veya always politikasıyla oluşturulduysa evet. Compose dosyalarında aynı ayar her servis için restart: unless-stopped satırıyla verilir. Politikası olmayan konteynerler yeniden başlatmadan sonra durmuş halde kalır.
Docker kurulumu tamamlandıktan sonra bir VDS, onlarca farklı servisi düzenli ve izole şekilde çalıştırabilen esnek bir platforma dönüşür. Neler yapabileceğinize dair fikirler için VDS kullanım alanları yazımıza göz atın. Konteyner iş yükleri için NVMe diskli sanal sunucu kiralama seçeneklerimizi, yoğun derleme ve çok konteynerli projeler için ise Ryzen 9 9950X3D işlemcili VDS paketlerini inceleyebilirsiniz.
Hizmet Sözleşmemiz
Web Koruma
İade Politikamız
