Docker ile Containerization Başlangıcı
"Bende çalışıyordu" cümlesi, yazılım dünyasının en eski şakası. Docker bu şakayı bitirmek için var. Uygulamanı, bağımlılıklarıyla birlikte tek bir pakete koyarsın. O paket senin makinende, arkadaşının makinesinde ve sunucuda aynı şekilde çalışır.
Bu rehberde iki şeye odaklanacağız: docker image ve container kavramını gerçekten anlamak, sonra kendi uygulamanı çalıştırıp yönetmek. Terminal komutlarına aşinaysan daha rahat ilerlersin; değilsen Linux terminali rehberini yanına açık tut.
Temel Kavramlar ve İlk Container
Docker'ı öğrenirken en çok karıştırılan şey isimlendirme. Önce onu netleştirelim.
Image ile container arasındaki fark
Basit bir benzetme:
- Image: Tarif. Salt okunur bir şablon. İçinde işletim sistemi katmanı, kütüphaneler ve senin kodun var.
- Container: Tariften yapılmış yemek. Çalışan bir süreç. Image'dan üretilir.
- Bir image'dan onlarca container çalıştırabilirsin. Hepsi izole olur.
- Container silinince içindeki değişiklikler gider. Image durur.
Bir de katman (layer) mantığı var. Image'lar üst üste binen katmanlardan oluşur. Aynı katmanı kullanan iki image, o katmanı diskte tek kez tutar. Bu yüzden Docker beklediğinden az yer kaplar.
Kurulum sonrası ilk komutlar
Docker Desktop veya Docker Engine kurulduktan sonra sırayla dene:
docker version— kurulum doğru mu?docker run hello-world— ilk container'ın. Mesajı basar ve kapanır.docker run -it ubuntu bash— Ubuntu içinde kabuk açar.exitile çıkarsın.docker ps— çalışan container'lar.docker ps -a— durmuş olanlar dahil hepsi.docker images— indirdiğin image'lar.
Sık kullanacağın bayraklar:
| Bayrak | Ne yapar |
|---|---|
-d | Arka planda çalıştırır |
-p 8080:80 | Host 8080'i container 80'e bağlar |
--name web | Container'a isim verir |
-e KEY=value | Ortam değişkeni geçer |
--rm | Durunca container'ı siler |
-v $(pwd):/app | Klasörü içeri bağlar |
Hazır image ile pratik yapmak
Kendi kodunu yazmadan önce hazır image'larla oyna. Öğrenme hızın artar.
docker run -d -p 8080:80 --name site nginxyaz, tarayıcıda localhost:8080'i aç.docker logs -f siteile isteklerin akışını izle.docker exec -it site shile içine gir, dosya yapısına bak.- PostgreSQL veya MySQL image'ı kaldır. Kendi makinene veritabanı kurmadan SQL denemeleri yapabilirsin.
- İşin bitince
docker stop sitevedocker rm site.
Alışkanlık edin: Deneme amaçlı her container'ı --rm ile başlat. Makinen çöplük olmaz.
Kendi Image'ını Üretmek ve Yönetmek
Hazır image kullanmak tüketicilik. İşin asıl faydası, kendi uygulamanı paketlemekte.
Dockerfile yazmak
Proje kökünde Dockerfile adında dosya aç. Node.js örneği:
FROM node:20-alpine— temel image. Alpine küçüktür, tercih et.WORKDIR /app— çalışma dizini.COPY package*.json ./— önce sadece bağımlılık dosyaları.RUN npm ci --omit=dev— bağımlılıkları kur.COPY . .— sonra kodun tamamı.EXPOSE 3000— hangi portta dinliyor.CMD ["node", "server.js"]— başlangıç komutu.
Sıra neden böyle? Docker her satırı katman olarak önbelleğe alır. Kod değiştiğinde COPY . . sonrası yeniden kurulur, ama npm ci katmanı önbellekten gelir. Build süresi saniyelere iner.
Yanına mutlaka .dockerignore koy. İçine node_modules, .git, .env, dist yaz. Hem image küçülür hem gizli bilgi içeri sızmaz. Şifre ve token'ları asla Dockerfile'a gömme; ortam değişkeni veya secret ile geçir.
Build, tag ve çalıştırma
docker build -t benim-app:1.0 .— sondaki nokta build context'idir.docker imagesile boyutu kontrol et. 1 GB üstü çıktıysa temel image'ı sorgula.docker run -d -p 3000:3000 --env-file .env benim-app:1.0- Hata alırsan
docker logsilk durağın. İkincisidocker exec -it ... sh. - Etiketlemede
latest'e güvenme. Sürüm numarası veya Git commit kısaltması kullan.
Çok aşamalı build ile boyut ciddi düşer: ilk aşamada derle, ikinci aşamada sadece çıktıyı kopyala. Derleyiciler final image'a girmez.
Veri, ağ ve Compose
- Volume: Kalıcı veri için.
docker volume create pgdatasonra-v pgdata:/var/lib/postgresql/data. Veritabanı container'ını silsen de veri kalır. - Bind mount: Geliştirme için. Yerel klasörü içeri bağla, kod değişikliği anında yansısın.
- Network:
docker network create appnetile ortak ağ kur. Container'lar birbirine isimle erişir.localhostdeğil,dbyazarsın. - Compose: Üç servisi elle başlatmak yor
© 2026 Yazılım Atölyesi