"Benim bilgisayarımda çalışıyordu" cümlesi yazılım dünyasının en bilinen şakası. Docker bu sorunu kökten çözdü. Uygulamayı tüm bağımlılıklarıyla birlikte paketleyip her yerde aynı şekilde çalıştırmayı mümkün kıldı.
Docker Nedir?
Docker, uygulamaları konteyner adı verilen izole ortamlarda çalıştıran açık kaynaklı bir platformdur. Konteynerler, uygulamanın çalışması için gereken her şeyi (kod, runtime, kütüphaneler, sistem araçları) içerir.
Sanal makinelerden farkı: VM'ler tam bir işletim sistemi çalıştırır ve gigabaytlarca kaynak tüketir. Konteynerler ise host sistemin çekirdeğini paylaşır, megabaytlar seviyesinde kalır ve saniyeler içinde başlar.
Docker 2013'te piyasaya çıktı ve kısa sürede yazılım geliştirme, dağıtım ve operasyonların standart aracı haline geldi.
Temel Kavramlar
Image (İmaj)
Uygulamanın çalıştırılabilir kalıbı. Bir şablon gibi düşünün. Image'dan istediğiniz kadar konteyner oluşturabilirsiniz.
Image'lar katmanlı yapıdadır. Her katman bir değişikliği temsil eder. Bu sayede depolama verimli kullanılır ve indirmeler hızlanır.
Container (Konteyner)
Image'dan oluşturulan çalışan örnek. İzole bir ortamda çalışır, kendi dosya sistemi, ağı ve process'leri vardır.
Konteynerler geçicidir. Silindiğinde içindeki değişiklikler kaybolur. Kalıcı veri için volume kullanılır.
Dockerfile
Image'ın nasıl oluşturulacağını tanımlayan metin dosyası. Her satır bir katman oluşturur.
Registry
Image'ların depolandığı merkezi konum. Docker Hub en popüler public registry. Kendi private registry'nizi de kurabilirsiniz.
Docker Kurulumu
Linux (Ubuntu/Debian)
Eski sürümleri kaldırın:
sudo apt remove docker docker-engine docker.io containerd runc
Gerekli paketleri kurun:
sudo apt update sudo apt install ca-certificates curl gnupg
Docker repository ekleyin ve kurun:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
Kullanıcıyı docker grubuna ekleyin:
sudo usermod -aG docker $USER
Oturumu kapatıp açın veya:
newgrp docker
Kurulumu test edin:
docker run hello-world
Temel Docker Komutları
Image İşlemleri
Image indirme:
docker pull nginx docker pull ubuntu:22.04
Image listeleme:
docker images
Image silme:
docker rmi nginx
Kullanılmayan image'ları temizleme:
docker image prune
Container İşlemleri
Container çalıştırma:
docker run nginx
Arka planda çalıştırma:
docker run -d nginx
İsim verme:
docker run -d --name web nginx
Port yönlendirme:
docker run -d -p 8080:80 nginx
Host'un 8080 portunu konteyner'ın 80 portuna yönlendirir.
Container listeleme:
docker ps # çalışanlar
docker ps -a # tümü
Container durdurma:
docker stop web
Container başlatma:
docker start web
Container silme:
docker rm web
Çalışan container'a bağlanma:
docker exec -it web bash
Container logları:
docker logs web docker logs -f web # canlı takip
Dockerfile Yazımı
Temel Yapı
FROM ubuntu:22.04
LABEL maintainer="[email protected]"
RUN apt-get update && apt-get install -y \ nginx \ && rm -rf /var/lib/apt/lists/*
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Dockerfile Komutları
FROM: Temel image. Her Dockerfile FROM ile başlar. LABEL: Metadata bilgisi. RUN: Build sırasında komut çalıştırır. COPY: Dosyaları image'a kopyalar. ADD: COPY gibi ama URL'den indirme ve arşiv açma destekler. WORKDIR: Çalışma dizinini ayarlar. ENV: Ortam değişkeni tanımlar. EXPOSE: Hangi portun kullanıldığını belirtir (dokümantasyon amaçlı). CMD: Container başladığında çalışacak komut. ENTRYPOINT: CMD gibi ama override edilmez.
Image Oluşturma
docker build -t myapp:1.0 .
Nokta (.) build context'i yani Dockerfile'ın bulunduğu dizini belirtir.
Node.js Uygulaması Örneği
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Volume ve Veri Yönetimi
Konteynerler geçici, volume'lar kalıcı veri sağlar.
Named Volume
docker volume create mydata docker run -d -v mydata:/var/lib/mysql mysql
Bind Mount
Host dizinini doğrudan bağlar:
docker run -d -v /home/user/site:/var/www/html nginx
Volume listeleme:
docker volume ls
Volume silme:
docker volume rm mydata
Docker Network
Konteynerler arası iletişim için network kullanılır.
Network oluşturma:
docker network create mynet
Container'ı network'e bağlama:
docker run -d --network mynet --name db mysql docker run -d --network mynet --name web nginx
Aynı network'teki konteynerler birbirlerine isimle ulaşabilir.
Network listeleme:
docker network ls
Docker Compose
Birden fazla container'ı tek dosyayla yönetmeyi sağlar.
docker-compose.yml Örneği
version: '3.8'
services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html depends_on: - app networks: - webnet
app: build: ./app environment: - NODE_ENV=production - DB_HOST=db networks: - webnet
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: myapp volumes: - dbdata:/var/lib/mysql networks: - webnet
volumes: dbdata:
networks: webnet:
Compose Komutları
Servisleri başlatma:
docker compose up -d
Servisleri durdurma:
docker compose down
Logları görüntüleme:
docker compose logs -f
Servisleri yeniden oluşturma:
docker compose up -d --build
WordPress + MySQL Örneği
version: '3.8'
services: wordpress: image: wordpress:latest ports: - "8080:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: secret WORDPRESS_DB_NAME: wordpress volumes: - wordpress_data:/var/www/html depends_on: - db
db: image: mysql:8.0 environment: MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: secret MYSQL_ROOT_PASSWORD: rootsecret volumes:
- db_data:/var/lib/mysql
volumes: wordpress_data: db_data:
docker compose up -d ile çalıştırın, localhost:8080'den WordPress'e erişin.
Environment Dosyası
Hassas bilgileri .env dosyasında saklayın:
DB_PASSWORD=guclu_sifre DB_USER=admin
docker-compose.yml'de:
environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
İyi Pratikler
Image boyutunu küçük tutun: Alpine tabanlı image'lar tercih edin. Multi-stage build kullanın: Sadece gerekli dosyaları final image'a alın. Root kullanmayın: Güvenlik için USER komutuyla farklı kullanıcı belirleyin. .dockerignore kullanın: Gereksiz dosyaları build context'ten hariç tutun. Tag'leri düzgün kullanın: latest yerine versiyon numarası tercih edin. Tek process prensibi: Her container tek bir iş yapsın.
Sorun Giderme
Container logları:
docker logs container_name
Container içine girme:
docker exec -it container_name sh
Sistem bilgisi:
docker system df docker system info
Temizlik:
docker system prune -a
Tüm kullanılmayan image, container ve volume'ları siler.
Sonuç
Docker, modern yazılım geliştirme ve dağıtımının vazgeçilmez aracı. Geliştirme ortamından production'a kadar tutarlı çalışma ortamı sağlar.
Temel komutları öğrenerek başlayın, Dockerfile yazımını pratik edin, Docker Compose ile çoklu servis yönetimini deneyin. Kubernetes öğrenmek için Docker bilgisi ön koşul.
0 Yorum
Yorum Yaz