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 composekomutunu etkinleştirir (eski standalonedocker-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.