Docker
Genel Kavramlar
- Container: Uygulamanın kodunu, bağımlılıklarını ve çalışması için gereken her şeyi bir araya getiren, işletim sistemi seviyesinde izole edilmiş taşınabilir çalışma ortamıdır.
- Docker: Konteynerleri kolayca oluşturup yönetmenizi sağlayan platformdur. Linux çekirdeğinin isim alanları (namespaces) ve cgroups özelliklerini kullanarak hafif sanallaştırma sağlar.
- Docker Hub: Hazır container image’larının paylaşıldığı merkezi kayıt defteridir.
- Volume: Konteyner yaşam döngüsünden bağımsız veri saklamak için kullanılır. Konteyner silinse bile volume içindeki veriler korunur.
Image Yönetimi
| Listeleme | |
|---|---|
Konteyner Yönetimi
| run | |
|---|---|
-dArka planda (detached) çalıştırır.-itİnteraktif terminal açar (-istdin açık,-ttty tahsis eder).--name <name>Konteynere kolay hatırlanır bir isim verir.-p <hostPort>:<containerPort>Port eşlemesi yapar.-v <hostPath>:<containerPath>Host–konteyner arasında volume mount eder.-e KEY=VALUEOrtam değişkeni ayarlar.--network <net>Belirli Docker ağına bağlar.--link <other>:<alias>Eski stil bağlantı, yerine kullanıcı tanımlı ağ ve DNS önerilir.
| Ağ Yönetimi | |
|---|---|
| Volume Yönetimi | |
|---|---|
Dockerfile & Build
İpuçları
- Veri kalıcılığı için her zaman -v veya named volume kullanın.
- Ağ izolasyonu ve container DNS’yi kullanmak için custom network tercih edin,
--linkartık eskidi. - Geliştirme aşamasında
--rmbayrağıyla otomatik silinmeyi sağlayın:
- Image katmanlarını küçültmek, multi-stage build ile gereksiz dosyaları final image’dan çıkarmak performans ve güvenlik için kritiktir
Docker Network Türleri
Docker, konteynerler arası ve host ile container arasındaki iletişimi farklı ağ sürücüleri (drivers) ile yönetir:
| Ağ Türü | Açıklama |
|---|---|
bridge |
Varsayılan ağ. İzole bir köprü ağıdır; her container bu ağda kendi IP’sini alır. |
none |
Hiçbir ağa bağlı olmaz; dış erişime kapalı, tamamen izole konteyner. |
host |
Container, host’un network yığınıyla paylaşılır; port eşlemesine gerek kalmaz. |
custom |
Kullanıcı tanımlı ağ: kendi subnet, gateway vb. ayarlarınızı yapabilirsiniz. |
# none ağına bağlanarak mongo konteyneri çalıştırma
docker run --network none mongo
# host ağına bağlanma (Linux'ta geçerli)
docker run --network host nginx
# Örnek kullanıcı tanımlı ağ oluşturma
docker network create --driver bridge --subnet 182.18.0.0/16 --gateway 182.18.0.1 my_bridge_net
Kendi Dockerfile’ınızı Yazmak
Bir uygulamayı konteynerleştirmek için projenizin kök dizininde Dockerfile oluşturun. Aşağıdaki örneklerde adım adım açıklamalar göreceksiniz.
Ubuntu Tabanlı Örnek
# 1. Base image
FROM ubuntu:18.04
# 2. Paket listelerini güncelle ve curl yükle
RUN apt-get update && apt-get install -y curl
# 3. Uygulama kodlarını kopyala
COPY . /opt/my-app/
# 4. Çalışma dizinini ayarla
WORKDIR /opt/my-app/
# 5. Ortam değişkeni tanımla
ENV APP_ENV=production
# 6. Uygulamayı başlat
CMD ["./start.sh"]
- Her
RUN/COPYkomutu bir layer (katman) oluşturur. CMDile konteyner çalıştığında hangi komutun çalışacağı belirtilir.
Node.js Tabanlı Örnek
# 1. Node.js resmi image’ı (slim versiyonu daha küçük)
FROM node:14-slim
# 2. Çalışma dizinini ayarla
WORKDIR /usr/src/app
# 3. Bağımlılıkları kopyala ve yükle
COPY package*.json ./
RUN npm install
# 4. Uygulama kodunu kopyala
COPY . .
# 5. Uygulamanın dinleyeceği portu bildir
EXPOSE 3000
# 6. Varsayılan komut
ENTRYPOINT ["node", "index.js"]
ENTRYPOINTile konteyner argument’ları değişse bile sürekli çalışacak komut belirlenir.CMDoverride etmek mümkün;ENTRYPOINTise kalıcıdır.
Docker Compose ile Çoklu Servis Yönetimi
Birden fazla konteyneri birlikte tanımlayıp çalıştırmak için docker-compose.yml kullanın. İndent (girinti) YAML’de kritiktir.
version: "3.8"
services:
webapp:
build: .
container_name: my_webapp
ports:
- "8080:80"
volumes:
- ./static:/usr/src/app/static
environment:
- NODE_ENV=production
db:
image: postgres:14
container_name: my_db
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: appdb
networks:
default:
driver: bridge
volumes:
db_data:
servicesÇalıştırılacak konteyner tanımları.buildDockerfile’ın bulunduğu dizin (veya context).imageHazır image kullanımı.ports<hostPort>:<containerPort>eşlemesi.volumesKalıcı veri saklama veya kod mount etme.environmentOrtam değişkenleri.networks/volumesKullanıcı tanımlı ağ ve kalıcı volume tanımları.