Docker, uygulamaları container içinde paketlemenizi ve çalıştırmanızı sağlar. Container'lar sanal makinelerden daha hafif, daha hızlı ve daha taşınabilirdir. Bu rehberde Docker'ı sıfırdan ileri seviyeye öğreneceksiniz.
Container Nedir?
Container, uygulamayı tüm bağımlılıklarıyla birlikte paketleyen hafif bir izolasyon birimidir. İşletim sistemi çekirdeğini host ile paylaşır ama kendi dosya sistemi, ağı ve süreçleri vardır.
Sanal makine ile farkı: VM tam bir işletim sistemi çalıştırır, gigabyte'larca yer kaplar, dakikalarca açılır. Container saniyeler içinde başlar, megabyte'lar kullanır.
Docker Kurulumu
Ubuntu'da kurulum:
sudo apt update sudo apt install docker.io sudo systemctl enable --now docker
Kullanıcıyı docker grubuna ekleyin:
sudo usermod -aG docker $USER
Çıkış yapıp tekrar girin veya newgrp docker çalıştırın.
Kurulumu test edin:
docker run hello-world
Temel Kavramlar
Image: Container'ın şablonudur. Uygulama, kütüphaneler ve yapılandırma içerir. Salt okunurdur.
Container: Image'ın çalışan örneğidir. Image'dan istediğiniz kadar container oluşturabilirsiniz.
Registry: Image'ların depolandığı yer. Docker Hub en popüleridir.
Dockerfile: Image oluşturmak için talimatlar içeren dosya.
Temel Komutlar
Image İşlemleri
docker pull nginx # Image indir docker images # Yerel image'ları listele docker rmi nginx # Image sil docker image prune # Kullanılmayan image'ları temizle
Container İşlemleri
docker run nginx # Container başlat docker run -d nginx # Arka planda çalıştır docker run -p 8080:80 nginx # Port yönlendirme docker run --name webserver nginx # İsim ver
docker ps # Çalışan container'ları listele docker ps -a # Tüm container'ları listele docker stop container_id # Durdur docker start container_id # Başlat docker rm container_id # Sil docker rm -f container_id # Zorla sil
Container İçine Erişim
docker exec -it container_id bash # Bash shell aç docker logs container_id # Logları görüntüle docker logs -f container_id # Canlı log takibi
Port Yönlendirme
-p host_port:container_port formatı kullanılır:
docker run -d -p 8080:80 nginx
Host'un 8080 portu container'ın 80 portuna yönlendirilir.
Birden fazla port:
docker run -d -p 8080:80 -p 8443:443 nginx
Ortam Değişkenleri
docker run -e MYSQL_ROOT_PASSWORD=secret mysql
Birden fazla değişken:
docker run -e DB_HOST=localhost -e DB_PORT=5432 myapp
Dockerfile
Dockerfile, image oluşturmak için talimatlar içerir.
Basit Örnek
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"]
Dockerfile Komutları
FROM: Temel image WORKDIR: Çalışma dizini COPY: Dosya kopyala RUN: Komut çalıştır (build sırasında) ENV: Ortam değişkeni EXPOSE: Port belirt CMD: Başlangıç komutu ENTRYPOINT: Değiştirilmez başlangıç komutu
Image Oluşturma
docker build -t myapp:1.0 .
. bulunduğunuz dizini gösterir. -t ile tag verilir.
Multi-stage Build
Image boyutunu küçültmek için:
# Build aşaması FROM node:18 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build
# Production aşaması FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html
Volumes
Container'lar geçicidir. Silinince veriler kaybolur. Volume ile veri kalıcı hale gelir.
Volume Oluşturma
docker volume create mydata docker volume ls docker volume inspect mydata
Volume Bağlama
docker run -v mydata:/var/lib/mysql mysql
Host dizini bağlama:
docker run -v /host/path:/container/path nginx
Bind Mount (geliştirme için):
docker run -v $(pwd):/app myapp
Networking
Container'lar ağ üzerinden iletişim kurar.
Ağ Türleri
bridge: Varsayılan. Aynı host'taki container'lar iletişim kurabilir. host: Container host ağını kullanır. none: Ağ yok.
Özel Ağ Oluşturma
docker network create mynetwork docker run --network mynetwork --name db mysql docker run --network mynetwork --name app myapp
Aynı ağdaki container'lar birbirlerini isimle bulabilir.
Docker Compose
Birden fazla container'ı birlikte yönetmek için Docker Compose kullanılır.
docker-compose.yml Örneği
version: '3.8'
services: web: build: . ports: - "8080:80" depends_on: - db environment: - DB_HOST=db volumes: - ./app:/var/www/html
db: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: myapp volumes:
- db_data:/var/lib/mysql
volumes: db_data:
Compose Komutları
docker-compose up # Başlat docker-compose up -d # Arka planda başlat docker-compose down # Durdur ve kaldır docker-compose logs # Logları görüntüle docker-compose ps # Container'ları listele docker-compose build # Image'ları yeniden oluştur
En İyi Uygulamalar
Image Boyutunu Küçültün
alpine tabanlı image'lar kullanın. Multi-stage build yapın. .dockerignore dosyası oluşturun:
node_modules .git *.log Dockerfile
Güvenlik
Root olarak çalıştırmayın:
RUN useradd -m appuser USER appuser
Image'ları düzenli tarayın:
docker scout cves nginx
Etiketleme
latest yerine versiyon kullanın:
docker pull nginx:1.25
Tag Stratejisi
myapp:1.0.0 # Tam versiyon myapp:1.0 # Minor versiyon myapp:latest # Son versiyon
Temizlik
Kullanılmayan kaynakları temizleyin:
docker system prune -a docker volume prune docker network prune
Yaygın Senaryolar
Web Uygulaması
docker run -d -p 80:80 -v ./html:/usr/share/nginx/html nginx
Veritabanı
docker run -d \ --name mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -v mysql_data:/var/lib/mysql \ -p 3306:3306 \ mysql:8
Geliştirme Ortamı
docker run -it \ -v $(pwd):/app \ -w /app \ node:18 \ npm install
Sorun Giderme
Container başlamıyor:
docker logs container_id
Kaynak kullanımı:
docker stats
Container içini inceleyin:
docker exec -it container_id sh
Sonuç
Docker, modern yazılım geliştirme ve dağıtımının temel taşıdır. Container kavramını, Dockerfile yazımını ve Compose kullanımını öğrenin.
Basit projelerle başlayın. Var olan uygulamanızı containerize edin. Docker Hub'dan image'ları inceleyin.
Kubernetes'e geçmeden önce Docker'ı iyi öğrenin. Kubernetes, Docker container'larını orkestre eder.
Henüz yorum yok.
Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.