Ubuntu ve Debian’da Docker Kurulum Rehberi

Konteyner teknolojisine adım atmak istiyorsanız ilk durağınız neredeyse her zaman Docker oluyor. Ancak kurulum aşamasında bile birçok sysadmin gereksiz karmaşa yaşıyor: eski paket depolarından yanlış sürüm indirmek, permission hataları, ya da snap üzerinden gelen kısıtlı Docker sürümüyle uğraşmak. Bu rehberde Ubuntu ve Debian üzerinde Docker’ı doğru ve güvenilir şekilde nasıl kuracağınızı, üretim ortamı için nasıl yapılandıracağınızı ve yaygın sorunları nasıl aşacağınızı adım adım ele alacağız.

Neden Resmi Docker Deposu?

Ubuntu ve Debian’ın kendi paket depolarında da Docker bulunuyor ama bu sürümler genellikle oldukça geride kalıyor. Örneğin Ubuntu 22.04’ün varsayılan depolarındaki docker.io paketi, Docker Engine’in resmi sürümünün birkaç minör versiyon gerisinde olabiliyor. Üretim ortamında bu fark güvenlik yamaları ve özellikler açısından ciddi sonuçlar doğurabiliyor.

Bunun dışında Ubuntu’da snap üzerinden de Docker kurmak mümkün ama snap sandbox kısıtlamaları bazı volume mount senaryolarında beklenmedik sorunlara yol açabiliyor. Bu yüzden her zaman Docker’ın resmi APT deposunu kullanmanızı öneririm.

Ön Hazırlık

Kuruluma geçmeden önce sisteminizi temizlemeniz gerekiyor. Eğer daha önce farklı bir yöntemle Docker veya ilgili bileşenler kurulmuşsa bunları kaldırmak önemli.

sudo apt-get remove docker docker-engine docker.io containerd runc

Bu komut hata versee bile sorun değil, zaten kurulu değilse APT sadece “paket bulunamadı” mesajı verir. Eski config dosyaları /var/lib/docker altında kalır, onlara şimdilik dokunmuyoruz.

Sisteminizin güncel olduğundan emin olun:

sudo apt-get update
sudo apt-get upgrade -y

Gerekli bağımlılıkları yükleyin:

sudo apt-get install -y 
    ca-certificates 
    curl 
    gnupg 
    lsb-release 
    apt-transport-https

Docker GPG Anahtarını ve Deposunu Eklemek

Docker’ın APT deposunu güvenli şekilde eklemek için önce GPG anahtarını sisteme tanıtmamız gerekiyor. Bu adım Ubuntu ve Debian için benzer ama dizin yolları ve depo URL’leri farklı.

Ubuntu için

# GPG anahtarını ekle
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | 
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Depoyu sources listesine ekle
echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] 
  https://download.docker.com/linux/ubuntu 
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Debian için

# GPG anahtarını ekle
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | 
    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Depoyu sources listesine ekle
echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] 
  https://download.docker.com/linux/debian 
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | 
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Burada $(dpkg --print-architecture) komutu sistemin mimarisini otomatik algılar, amd64, arm64 veya armhf gibi. Raspberry Pi üzerinde çalışıyorsanız bu otomatik algılama hayat kurtarıcı.

Docker Engine Kurulumu

Depoyu ekledikten sonra paket listesini güncelleyip Docker’ı kurun:

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

Burada birden fazla paket kurduğumuza dikkat edin:

  • docker-ce: Docker Engine’in kendisi, Community Edition
  • docker-ce-cli: Komut satırı arayüzü
  • containerd.io: Düşük seviye konteyner runtime’ı
  • docker-buildx-plugin: Multi-platform image build için eklenti
  • docker-compose-plugin: docker compose komutunu etkinleştirir (eski standalone docker-compose‘dan farklı)

Kurulumun başarılı olduğunu doğrulayın:

sudo docker run hello-world

Bu komut Docker Hub’dan küçük bir test imajı indirir ve çalıştırır. Çıktıda “Hello from Docker!” göreceksiniz.

Sudo Olmadan Docker Kullanmak

Varsayılan kurulumda Docker daemon’una sadece root veya docker grubundaki kullanıcılar erişebilir. Her komutun önüne sudo yazmak hem zahmetli hem de güvenlik açısından en iyi pratik değil. Kendi kullanıcınızı docker grubuna ekleyin:

sudo usermod -aG docker $USER

Bu değişikliğin aktif olması için oturumu kapatıp tekrar açmanız gerekiyor. Ya da aynı terminal oturumunda hemen geçerli olması için:

newgrp docker

Ardından test edin:

docker run hello-world

Sudo olmadan çalışıyorsa başarılıdır.

Önemli not: docker grubuna eklemek, o kullanıcıya pratikte root seviyesi yetki vermek demek. Bu yüzden sadece güvendiğiniz kullanıcıları bu gruba ekleyin. CI/CD pipeline’larında veya servis hesaplarında bu konuya dikkat edin.

Docker Servisini Yönetmek

Docker, systemd servisi olarak çalışır. Temel servis yönetim komutları:

# Servis durumunu kontrol et
sudo systemctl status docker

# Servisi durdur
sudo systemctl stop docker

# Servisi başlat
sudo systemctl start docker

# Sistem açılışında otomatik başlatmayı etkinleştir
sudo systemctl enable docker

# Otomatik başlatmayı devre dışı bırak
sudo systemctl disable docker

Üretim sunucularında enable ile otomatik başlatmayı açık tutmanızı öneririm. Sunucu reboot’tan sonra Docker başlamıyorsa konteynerlerin ayağa kalkmaması ciddi bir soruna dönüşebilir.

Belirli Bir Docker Sürümü Kurmak

Üretim ortamlarında tüm sunucularda aynı Docker sürümünü kullanmak önemli. Mevcut sürümleri listelemek için:

apt-cache madison docker-ce

Bu komut mevcut sürümlerin listesini verir. Belirli bir sürümü kurmak için:

# Örnek: 5:24.0.7-1~ubuntu.22.04~jammy sürümünü kur
sudo apt-get install docker-ce=5:24.0.7-1~ubuntu.22.04~jammy 
    docker-ce-cli=5:24.0.7-1~ubuntu.22.04~jammy 
    containerd.io

Kurulu sürümü “pin”leyerek istemeden yükseltilmesini engellemek için:

sudo apt-mark hold docker-ce docker-ce-cli containerd.io

Bu özellikle birden fazla sunucudan oluşan bir cluster’da sürüm tutarlılığını korumak için kritik.

Docker Daemon Yapılandırması

Docker’ın davranışını /etc/docker/daemon.json dosyasıyla özelleştirebilirsiniz. Varsayılan olarak bu dosya mevcut olmayabilir, kendiniz oluşturmanız gerekir.

sudo nano /etc/docker/daemon.json

Tipik bir üretim yapılandırması şu şekilde görünebilir:

# /etc/docker/daemon.json içeriği
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "live-restore": true,
  "userland-proxy": false,
  "default-address-pools": [
    {"base": "172.17.0.0/16", "size": 24}
  ]
}

Bu yapılandırmada:

  • log-driver ve log-opts: Her konteyner için log dosyasını maksimum 100MB ile sınırlar, 3 döngüsel dosya tutar. Log’ların diski doldurmasını engeller.
  • storage-driver overlay2: Modern Linux kernel’lerinde en performanslı storage driver.
  • live-restore: Docker daemon yeniden başlarken mevcut konteynerlerin çalışmaya devam etmesini sağlar. Üretimde çok değerli.
  • userland-proxy: Kapatmak network performansını artırır.
  • default-address-pools: Docker network’lerinin kullanacağı IP aralıklarını tanımlar. Mevcut ağ altyapınızla çakışma yaşamamak için önemli.

Değişiklikler sonrası Docker’ı yeniden başlatın:

sudo systemctl restart docker

Gerçek Dünya Senaryosu: Proxied Ortamda Kurulum

Kurumsal ağlarda çalışıyorsanız muhtemelen bir HTTP proxy arkasındasınız. Bu durumda Docker hem kurulum sırasında hem de runtime’da proxy ayarlarına ihtiyaç duyar.

Docker daemon’unu proxy üzerinden çalıştırmak için systemd override dosyası oluşturun:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

Dosya içeriği:

[Service]
Environment="HTTP_PROXY=http://proxy.sirket.local:3128"
Environment="HTTPS_PROXY=http://proxy.sirket.local:3128"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.sirket.local"

Ardından daemon’u yeniden yükleyin:

sudo systemctl daemon-reload
sudo systemctl restart docker

NO_PROXY listesine iç ağ aralıklarınızı ve domain’lerinizi eklemeyi unutmayın. Aksi takdirde iç registry’lerinize erişim kesilir.

Özel Registry Yapılandırması

Şirket içi bir Docker registry kullanıyorsanız (Nexus, Harbor veya başka bir çözüm) ve bu registry HTTPS sertifikası sorunları yaşıyorsa, daemon.json dosyasına insecure registry tanımlayabilirsiniz:

sudo nano /etc/docker/daemon.json
{
  "insecure-registries": ["registry.sirket.local:5000"],
  "registry-mirrors": ["https://mirror.sirket.local"]
}

Ancak bu yöntemi sadece geliştirme ortamlarında veya güvenli iç ağlarda kullanın. Üretimde her zaman geçerli TLS sertifikası olan bir registry tercih edin.

Docker Compose ile İlk Adımlar

Modern Docker kurulumlarında docker-compose-plugin ile birlikte docker compose (tire olmadan, space ile) komutu geliyor. Eski standalone docker-compose Python tabanlıydı ve artık deprecated sayılıyor.

Compose kurulumunu doğrulamak için:

docker compose version

Basit bir test için bir docker-compose.yml dosyası oluşturalım:

mkdir ~/test-compose && cd ~/test-compose
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
  
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_PASSWORD: testpass123
      POSTGRES_DB: testdb
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
EOF

mkdir html
echo "<h1>Docker Compose Calisiyor!</h1>" > html/index.html
docker compose up -d

Servis durumunu kontrol edin:

docker compose ps
docker compose logs web

Temizlemek için:

docker compose down -v

Yaygın Sorunlar ve Çözümleri

Sorun: “Cannot connect to the Docker daemon”

Bu hata genellikle Docker servisinin çalışmadığı anlamına gelir.

sudo systemctl status docker
sudo systemctl start docker
journalctl -xu docker.service

journalctl çıktısı çoğu zaman gerçek hatayı gösterir. daemon.json dosyasında syntax hatası varsa Docker başlamaz ve bu log’da görünür.

Sorun: “Permission denied” while trying to connect

docker grubuna eklendiniz ama hala hata alıyorsunuz. Büyük ihtimalle newgrp docker yapmadınız veya oturumu yenilemek gerekiyor.

groups $USER
# Çıktıda docker görünmüyorsa
newgrp docker

Sorun: Disk alanı doldu

Docker kullanılmayan imajlar, durdurulmuş konteyneler ve volume’lerle zamanla disk doldurabiliyor:

# Ne kadar yer kapladığını gör
docker system df

# Tüm kullanılmayan kaynakları temizle
docker system prune -a --volumes

Üretim ortamında -a ve --volumes flag’lerini dikkatli kullanın, çalışmayan ama ihtiyaç duyduğunuz konteynerleri ve volume’leri silebilir.

Kurulum Sonrası Güvenlik Kontrolleri

Docker kurulumu tamamlandıktan sonra birkaç temel güvenlik adımı atmanızı öneririm.

İlk olarak Docker’ın root ile çalışıp çalışmadığını kontrol edin:

docker info | grep -i "security options"

apparmor veya seccomp görüyorsanız bu iyi haber. Bu güvenlik katmanları Ubuntu ve Debian’da varsayılan olarak etkin gelir.

Kullanıcı namespace’lerini etkinleştirmek isteyebilirsiniz. Bu özellik, konteyner içindeki root kullanıcısını host üzerinde unprivileged bir kullanıcıya eşler:

# /etc/docker/daemon.json içine ekle
{
  "userns-remap": "default"
}

Ancak bu yapılandırmanın bazı senaryolarda volume permission sorunlarına yol açabileceğini bilin.

Otomatik Güncelleme Stratejisi

Docker Engine’i güncellemenin en güvenli yolu mevcut konteynerleri durdurup güncelleme yapmak değil, live-restore özelliğini kullanmak. daemon.json içinde "live-restore": true ayarlıysa Docker daemon güncellenirken konteyneler çalışmaya devam eder.

Güncelleme için:

sudo apt-get update
sudo apt-get install --only-upgrade docker-ce docker-ce-cli containerd.io
sudo systemctl restart docker

Cluster ortamlarında (Swarm veya Kubernetes) rolling update stratejisi uygulamak ve önce eski sürümlerle kompatibiliteyi test etmek kritik.

Sonuç

Docker kurulumu göründüğü kadar basit ama doğru yapmak için birkaç kritik noktaya dikkat etmek gerekiyor: her zaman resmi Docker deposunu kullanın, daemon.json ile log ve storage yapılandırmasını özelleştirin, proxy veya özel registry gibi kurumsal gereksinimlerinizi önceden belirleyin. Kurulum sonrasında live-restore ve log rotation gibi üretim odaklı ayarları mutlaka yapılandırın.

Bu temel sağlam kurulumun üzerine artık Docker Swarm, Docker Compose ile çok konteynerli uygulamalar veya Kubernetes’e geçiş gibi daha ileri konuları rahatça inşa edebilirsiniz. Bir sonraki yazıda Docker ağ modlarını ve üretim ortamında konteyner networking’ini ele alacağız.

Yorum yapın