Docker Best Practices: 15 Kapsamlı Mobil Geliştirme Rehberi [2026]
Yazar: Burak Balkı | Kategori: Mobile Development | Okuma Süresi: 36 dk
Bu 2026 rehberi, mobil geliştiriciler için Docker'ın en iyi uygulamalarını, kurulumdan ileri seviye tekniklere kadar detaylı örneklerle sunar. Ortam tutarlıl...
Mobil uygulama geliştirme süreçleri 2026 yılında her zamankinden daha karmaşık ve rekabetçi hale geldi. Bu karmaşıklıkla başa çıkmak, geliştirme ortamlarını standartlaştırmak ve dağıtım süreçlerini optimize etmek için **Docker**, mobil geliştiricilerin vazgeçilmez bir aracı olarak öne çıkıyor. Bu kapsamlı 2026 rehberinde, Docker'ın mobil geliştirme projelerinizde nasıl en verimli şekilde kullanılacağını, performans ve güvenlik odaklı en iyi uygulamaları ve pratik örneklerle adım adım öğreneceksiniz.
## Docker Nedir? (2026 Güncel Tanım)
Docker, uygulama ve bağımlılıklarını izole edilmiş ve taşınabilir birimler olan "container"lar içinde paketlemeye yarayan açık kaynaklı bir platformdur. Bu container'lar, uygulamaların farklı ortamlarda (geliştirme, test, üretim) tutarlı bir şekilde çalışmasını sağlar. Özellikle 2026 mobil geliştirme ekosisteminde, farklı işletim sistemleri ve SDK versiyonları arasında uyumluluk sorunlarını ortadan kaldırarak geliştirme hızını artırır.
Docker, hafif sanallaştırma teknolojisi kullanarak uygulamaları host sistemden izole eder. Bu sayede, "benim makinemde çalışıyordu" sorununu ortadan kaldırır ve geliştiricilere, test uzmanlarına ve operasyon ekiplerine standart bir çalışma ortamı sunar. Mobil backend servisleri, API'ler ve veritabanları gibi bileşenlerin yönetiminde 2026'da yaygın olarak kullanılmaktadır.
## Neden Mobil Geliştirmede Docker Kullanmalısınız? (2026 Perspektifi)
2026 yılında mobil uygulama geliştirme ekipleri, sürekli artan beklentiler ve hızlı değişimlerle karşı karşıya. Docker, bu zorlukların üstesinden gelmek için bir dizi somut fayda sunar:
* **Ortam Tutarlılığı**: Geliştirme, test ve üretim ortamları arasında "benim makinemde çalışıyor" sorununu ortadan kaldırır. Herkes aynı Docker imajını kullanarak aynı ortamda çalışır. Bu, özellikle 2026'da farklı cihaz ve OS versiyonlarını hedefleyen mobil uygulamalar için kritik öneme sahiptir.
* **Hızlı Dağıtım ve Ölçeklenebilirlik**: Container'lar saniyeler içinde başlatılabilir ve durdurulabilir. Bu, CI/CD süreçlerini hızlandırır ve mobil uygulamaların backend servislerinin yük altındayken kolayca ölçeklenmesini sağlar.
* **Kaynak Verimliliği**: Geleneksel sanal makinelere göre çok daha hafif oldukları için daha az CPU ve RAM tüketirler. Bu da sunucu maliyetlerinde 2026'da önemli tasarruflar anlamına gelir.
* **İzolasyon ve Güvenlik**: Her container kendi bağımsız ortamında çalışır. Bir container'daki sorun diğerlerini etkilemez ve güvenlik açıkları daha kolay izole edilebilir. Özellikle mobil uygulamaların hassas verilerle çalıştığı backend'ler için 2026'da bu izolasyon hayati öneme sahiptir.
* **Mikroservis Mimarisi Desteği**: Mobil uygulamaların karmaşık backend'leri genellikle mikroservisler şeklinde tasarlanır. Docker, her bir mikroservisi ayrı bir container'da çalıştırma ve yönetme kolaylığı sunar.
Docker, 2026 itibarıyla özellikle backend servisleri, API'ler, veritabanları ve test ortamları için mobil geliştirme ekosisteminde vazgeçilmez bir araç haline gelmiştir. Geniş bir topluluk desteğine ve zengin bir ekosisteme sahiptir.
## Docker ve Container Alternatifleri Karşılaştırması (2026)
Docker, containerizasyon dünyasında lider konumda olsa da, 2026 itibarıyla farklı ihtiyaçlara yönelik alternatifler de bulunmaktadır. İşte Docker'ı Podman ve containerd ile karşılaştıran bir tablo:
| Özellik | Docker (Engine + CLI) | Podman (Pod Manager) | Containerd (Container Runtime) |
| :---------------- | :--------------------------------------------------- | :-------------------------------------------------------- | :-------------------------------------------------------- |
| **Mimari** | Client-Server (Daemon gerektirir) | Daemon'sız (Daemonless), doğrudan OCI uyumlu | Yüksek seviyeli container runtime, Kubernetes çekirdeği |
| **Kullanım** | Geliştirme ve üretim için tam özellikli platform | Daemon'sız CLI, özellikle güvenlik odaklı ortamlar | Diğer container platformları için temel yapı taşı |
| **Daemon (Arka Plan Servisi)** | Var (dockerd) | Yok | Yok (ancak kendisi bir daemon olarak çalışabilir) |
| **Root Yetkisi** | Genellikle root yetkisi gerektirir (daemon için) | Root'suz container çalıştırma yeteneği | Root yetkisi gerektirebilir (kullanım şekline bağlı) |
| **CLI Uyumluluğu**| `docker` komutları | `docker` komutları ile uyumlu (alias ile) | `ctr` komutu (düşük seviye) |
| **Ekosistem** | Geniş, Docker Compose, Swarm, Desktop, Hub | Daha sade, Kubernetes ile entegrasyon | Kubernetes, Mirantis Container Runtime (MCR) gibi platformlar |
| **Kullanım Alanı**| Genel amaçlı geliştirme, CI/CD, mikroservisler | Güvenlik odaklı ortamlar, Red Hat ekosistemi | Kubernetes gibi orkestrasyon sistemleri için temel |
| **2026 Popülerliği** | Çok yüksek, endüstri standardı | Yükselişte, özellikle kurumsal Linux ortamlarında | Kubernetes'in temelini oluşturduğu için dolaylı popüler |
**Yorum**: 2026 yılında mobil geliştiriciler için Docker, geniş ekosistemi, kullanım kolaylığı ve zengin araç setleri sayesinde hala en popüler tercihtir. Ancak güvenlik ve daemon bağımsızlığı arayanlar Podman'ı, Kubernetes gibi orkestrasyon sistemleriyle derin entegrasyon arayanlar ise containerd'ı tercih edebilir.
## Docker Kurulumu ve İlk Container'ınızı Çalıştırma (2026)
Docker'ı mobil geliştirme ortamınıza kurmak oldukça basittir. 2026 itibarıyla en güncel ve önerilen yöntem, işletim sisteminize uygun Docker Desktop uygulamasını kurmaktır.
### Ön Gereksinimler:
* İşletim Sistemi: Windows 10/11 (WSL 2 ile), macOS (Intel veya Apple Silicon), Ubuntu, Debian, Fedora gibi Linux dağıtımları.
* En az 4 GB RAM (8 GB önerilir).
* İnternet bağlantısı.
### Adım Adım Kurulum:
1. **Docker Desktop İndirme**:
2026 yılı itibarıyla Docker Desktop'ın güncel sürümünü resmi Docker web sitesinden (https://www.docker.com/products/docker-desktop) işletim sisteminize uygun olanı indirin.
2. **Kurulumu Başlatma**:
İndirdiğiniz kurulum dosyasını çalıştırın ve ekrandaki talimatları izleyin. Windows'ta WSL 2'nin etkinleştirildiğinden emin olun. macOS'ta ise gerekli izinleri verin.
3. **Docker'ı Başlatma ve Doğrulama**:
Kurulum tamamlandıktan sonra Docker Desktop uygulamasını başlatın. Uygulama arka planda çalışmaya başlayacak ve sistem tepsisinde veya menü çubuğunda simgesi görünecektir. Terminalinizi açın ve aşağıdaki komutları çalıştırarak Docker'ın doğru şekilde kurulduğunu doğrulayın:
```bash
docker --version
docker compose version # Docker Compose CLI v2.x için
docker run hello-world
```
Eğer "Hello from Docker!" mesajını görüyorsanız, Docker başarıyla kurulmuş demektir.
### İlk Container'ınızı Çalıştırma: Bir Nginx Web Sunucusu
Basit bir web sunucusu container'ını çalıştırarak Docker'ın gücünü deneyimleyelim:
```bash
docker run -d -p 8080:80 --name my-nginx nginx:latest
```
* `-d`: Container'ı arka planda (detached mode) çalıştırır.
* `-p 8080:80`: Host makinenin 8080 portunu container'ın 80 portuna yönlendirir.
* `--name my-nginx`: Container'a `my-nginx` adını verir.
* `nginx:latest`: Çalıştırılacak imajın adıdır. `latest` etiketi, 2026 itibarıyla en güncel kararlı Nginx imajını ifade eder.
Tarayıcınızda `http://localhost:8080` adresine giderek Nginx'in varsayılan karşılama sayfasını görmelisiniz.
Container'ı durdurmak ve kaldırmak için:
```bash
docker stop my-nginx
docker rm my-nginx
```
## Docker Temel Kullanım Senaryoları ve Pratik Örnekler (2026)
Mobil uygulama geliştirirken karşılaşacağınız yaygın senaryolar için Docker'ı nasıl kullanabileceğinize dair örnekler.
### 1. Basit Bir Node.js API Backend'i Dockerize Etme
Mobil uygulamanız için bir backend API'si geliştirdiğinizi varsayalım.
**Problem**: API'nin bağımlılıklarını yönetmek ve farklı geliştirme ortamlarında tutarlı çalışmasını sağlamak.
**Çözüm**: API'yi bir Docker container'ı içinde çalıştırmak.
**`Dockerfile`:**
```dockerfile
# 2026 itibarıyla Node.js'in LTS sürümünü kullanın
FROM node:20-alpine
# Çalışma dizinini ayarla
WORKDIR /app
# Bağımlılıkları kopyala ve kur
COPY package*.json ./
RUN npm install
# Uygulama kodunu kopyala
COPY . .
# Uygulamanın dinleyeceği portu belirt
EXPOSE 3000
# Uygulamayı başlat
CMD [ "node", "server.js" ]
```
**`server.js` (Örnek Express uygulaması):**
```javascript
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello from Dockerized Node.js API! (2026)');
});
app.listen(port, () => {
console.log(`API listening at http://localhost:${port}`);
});
```
**`package.json`:**
```json
{
"name": "docker-node-api",
"version": "1.0.0",
"description": "A simple Node.js API for Docker example in 2026",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.18.2"
}
}
```
**Çalıştırma:**
```bash
docker build -t node-api-2026 .
docker run -p 3000:3000 node-api-2026
```
Şimdi `http://localhost:3000` adresinden API'nize erişebilirsiniz.
### 2. Veritabanı Container'ı ile Çalışma (PostgreSQL)
Mobil uygulamanız genellikle bir veritabanına ihtiyaç duyar.
**Problem**: Geliştirme ortamında veritabanı kurmak ve yönetmek.
**Çözüm**: Veritabanını Docker container'ı olarak çalıştırmak.
```bash
docker run --name mobile-db -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres:16-alpine
```
* `-e POSTGRES_PASSWORD=mysecretpassword`: Veritabanı için parola ayarlar. **Üretim ortamında bu şekilde sabit parola kullanmaktan kaçının!**
* `postgres:16-alpine`: 2026 itibarıyla güncel ve hafif bir PostgreSQL imajı.
Artık mobil backend'iniz `localhost:5432` üzerinden PostgreSQL veritabanına bağlanabilir.
### 3. Docker Volume Kullanımı (Veri Kalıcılığı)
Container'lar varsayılan olarak durumsuz (stateless) yapıdadır. Container silindiğinde içindeki veriler de kaybolur.
**Problem**: Veritabanı verilerinin container silinse bile kalıcı olmasını sağlamak.
**Çözüm**: Docker Volume'ları kullanmak.
```bash
docker volume create postgres_data_2026
docker run --name mobile-db-persistent -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -v postgres_data_2026:/var/lib/postgresql/data -d postgres:16-alpine
```
Bu komut, `postgres_data_2026` adında bir volume oluşturur ve veritabanı verilerini bu volume'a yazar. Container silinse bile volume kalır ve yeni bir container aynı volume ile başlatıldığında verilere erişilebilir.
### 4. Docker Network Kullanımı (Container'lar Arası İletişim)
Birden fazla container'ın birbiriyle güvenli ve kolayca iletişim kurmasını sağlamak.
**Problem**: Node.js API'sinin PostgreSQL veritabanına bağlanması.
**Çözüm**: Özel bir Docker ağı oluşturmak.
```bash
docker network create mobile-app-network-2026
# Veritabanı container'ını ağa bağla
docker run --name mobile-db-network -e POSTGRES_PASSWORD=mysecretpassword --network mobile-app-network-2026 -v postgres_data_2026:/var/lib/postgresql/data -d postgres:16-alpine
# API container'ını ağa bağla (DB host'u olarak container adını kullan)
docker run --name node-api-network --network mobile-app-network-2026 -p 3000:3000 -d node-api-2026
```
Şimdi `node-api-network` içindeki Node.js uygulaması, veritabanına `mobile-db-network` host adıyla erişebilir.
## Docker ile İleri Seviye Teknikler ve Mobil Geliştirme Optimizasyonları (2026)
Mobil geliştirme projelerinizde Docker'ı daha verimli kullanmak için ileri seviye teknikler.
### 1. Docker Compose ile Çoklu Container Yönetimi
Mobil uygulamaların backend'leri genellikle birden fazla servis (API, veritabanı, cache, mesaj kuyruğu) içerir. Docker Compose, bu servisleri tek bir YAML dosyasıyla tanımlamanıza ve yönetmenize olanak tanır.
**Problem**: Birden fazla container'ı manuel olarak başlatmak, ağları ve volume'ları yapılandırmak karmaşık ve hataya açık olabilir.
**Çözüm**: Docker Compose kullanarak tüm servisleri tek bir komutla ayağa kaldırmak.
**`docker-compose.yml` (Örnek Mobil Backend):**
```yaml
version: '3.9' # 2026 itibarıyla güncel Compose dosya formatı
services:
api:
build: . # Mevcut dizindeki Dockerfile'ı kullan
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://user:mysecretpassword@db:5432/mobil_db_2026
depends_on:
- db
networks:
- mobile-backend-network
db:
image: postgres:16-alpine # 2026 için önerilen sürüm
environment:
POSTGRES_DB: mobil_db_2026
POSTGRES_USER: user
POSTGRES_PASSWORD: mysecretpassword
volumes:
- db_data_2026:/var/lib/postgresql/data
networks:
- mobile-backend-network
volumes:
db_data_2026:
networks:
mobile-backend-network:
driver: bridge
```
**Çalıştırma:**
```bash
docker compose up -d
```
Bu komut, `api` ve `db` servislerini tanımlanan ağ üzerinde başlatır ve `db_data_2026` volume'unu oluşturur.
### 2. Multi-Stage Builds ile İmaj Boyutunu Küçültme
Mobil backend servislerinin Docker imaj boyutları, dağıtım sürelerini ve kaynak tüketimini doğrudan etkiler. Multi-stage builds, imaj boyutunu önemli ölçüde azaltmanın 2026'daki en etkili yollarından biridir.
**Problem**: Geliştirme bağımlılıkları (derleyiciler, test araçları) üretim imajına dahil edildiğinde imajlar çok büyük olur.
**Çözüm**: Birden fazla `FROM` ifadesi kullanarak sadece nihai uygulamanın ve çalışma zamanı bağımlılıklarının bulunduğu küçük bir imaj oluşturmak.
**`Dockerfile` (Multi-Stage Örnek):**
```dockerfile
# Birinci aşama: Build aşaması (daha büyük imaj kullanılabilir)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install --production=false # Tüm bağımlılıkları kur
COPY . .
RUN npm run build # React, Angular vb. frontend uygulamaları için bu adımda derleme yapılır
# İkinci aşama: Çalışma zamanı aşaması (daha küçük, üretim imajı)
FROM node:20-alpine # Sadece çalışma zamanı için gerekli olan imaj
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules # Sadece üretim bağımlılıklarını kopyala
COPY --from=builder /app/server.js ./server.js # Uygulama kodunu kopyala
EXPOSE 3000
CMD ["node", "server.js"]
```
Bu `Dockerfile`, `builder` aşamasında tüm bağımlılıkları kurar ve derleme yapar, ancak nihai imaja sadece üretim için gerekli olan `node_modules` ve uygulama kodunu kopyalar. Bu, 2026'da imaj boyutlarını %50-70 oranında azaltabilir.
### 3. Güvenli Container Konfigürasyonları
Mobil backend'ler genellikle hassas verilerle çalıştığından, container güvenliği 2026'da önceliklidir.
* **En Az Yetki Prensibi**: Container'ları `root` kullanıcısı yerine özel, yetkisiz bir kullanıcıyla çalıştırın.
```dockerfile
# Dockerfile içinde
FROM node:20-alpine
# ... diğer adımlar ...
RUN adduser --system --no-create-home appuser # appuser adında bir sistem kullanıcısı oluştur
USER appuser # Sonraki komutları bu kullanıcı ile çalıştır
CMD ["node", "server.js"]
```
* **Gizli Bilgileri Yönetimi (Secrets)**: API anahtarları, veritabanı şifreleri gibi hassas bilgileri `Dockerfile` içine veya doğrudan imaja gömmeyin. Bunun yerine Docker Secrets (Swarm için) veya Kubernetes Secrets gibi araçları kullanın. Geliştirme ortamında çevre değişkenleri (`.env` dosyaları) veya Docker Compose'un `env_file` özelliği kullanılabilir.
* **İmaj Tarama**: Güvenlik açıklarını tespit etmek için Docker imajlarını düzenli olarak tarayın. Docker Desktop, 2026'da yerleşik tarama özelliklerine sahiptir veya Trivy, Snyk gibi araçlar kullanılabilir.
## Docker Mobil Geliştirme İçin En İyi Uygulamalar ve Anti-Pattern'lar (2026)
Mobil geliştirme projelerinizde Docker'dan maksimum verim almak için 2026 yılında geçerli olan en iyi uygulamalar ve kaçınılması gereken anti-pattern'lar.
### ✅ En İyi Uygulamalar:
* ✅ **Küçük ve Tek Amaca Odaklı İmajlar Oluşturun**: Her container tek bir işlemi (mikroservis, veritabanı) yapmalı. Bu, ölçeklenebilirliği ve bakımı kolaylaştırır.
* ✅ **Multi-Stage Builds Kullanın**: İmaj boyutunu küçültmek ve gereksiz bağımlılıkları üretim imajından çıkarmak için multi-stage builds vazgeçilmezdir. 2026'da bu, CI/CD hızınızı doğrudan etkiler.
* ✅ **`.dockerignore` Dosyasını Kullanın**: `node_modules`, `.git`, `.env` gibi gereksiz dosyaları imaja kopyalamayı engelleyerek build süresini kısaltın ve imaj boyutunu küçültün.
```dockerignore
node_modules
.git
.env
Dockerfile
.dockerignore
```
* ✅ **Sabit İmaj Etiketleri Kullanın (Pinning)**: `nginx:latest` yerine `nginx:1.25.3-alpine` gibi belirli versiyon etiketleri kullanın. Bu, beklenmedik kırılmaları önler ve build'lerinizin tekrarlanabilirliğini sağlar.
* ✅ **Root Olmayan Kullanıcı Kullanın**: Container'ları `root` kullanıcısı yerine özel, yetkisiz bir kullanıcıyla çalıştırarak güvenlik risklerini azaltın. Bu, 2026'da container güvenliğinin temel prensiplerinden biridir.
* ✅ **Volume'ları Veri Kalıcılığı İçin Kullanın**: Veritabanları ve kalıcı depolama gerektiren diğer servisler için Docker Volume'ları kullanın. Container'ın yaşam döngüsünden bağımsız veri yönetimi sağlar.
* ✅ **Sağlık Kontrolleri (Health Checks) Tanımlayın**: Container'larınızın gerçekten çalışır durumda olup olmadığını kontrol etmek için `HEALTHCHECK` talimatını kullanın. Bu, özellikle orkestrasyon sistemlerinde (Kubernetes) kritik öneme sahiptir.
```dockerfile
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD curl -f http://localhost:3000/health || exit 1
```
* ✅ **Çevre Değişkenleri ile Konfigürasyon Yönetimi**: Hassas olmayan konfigürasyonları çevre değişkenleri (`ENV`) ile yönetin. Hassas olanlar için Docker Secrets veya Kubernetes Secrets kullanın.
* ✅ **Docker Compose ile Yerel Geliştirme Ortamı Yönetimi**: Mobil backend'inizin tüm servislerini (API, DB, Redis) tek bir `docker-compose.yml` dosyasıyla tanımlayarak yerel geliştirme ortamınızı standartlaştırın ve basitleştirin.
* ✅ **Güncel Temel İmajlar Kullanın**: 2026 itibarıyla en güncel ve güvenli temel imajları (örneğin, `node:20-alpine`, `python:3.11-slim`) kullanarak güvenlik açıklarını minimize edin ve performans iyileştirmelerinden faydalanın.
### ❌ Anti-Pattern'lar:
* ❌ **Tek Dev Bir İmaj (Monolithic Image)**: Tüm uygulamayı ve bağımlılıklarını tek bir dev imaja sıkıştırmak. Bu, imaj boyutunu artırır, bakımı zorlaştırır ve ölçeklenebilirliği engeller.
* ❌ **Gizli Bilgileri İmaja Gömme**: API anahtarları, parolalar gibi hassas bilgileri `Dockerfile` içinde veya doğrudan imaja yazmak. Bu ciddi güvenlik zafiyetlerine yol açar.
* ❌ **`latest` Etiketini Sürekli Kullanmak**: Geliştirme ve üretimde sürekli `latest` etiketini kullanmak, beklenmedik versiyon güncellemeleri nedeniyle uygulamanızın kırılmasına neden olabilir.
* ❌ **Container İçinde Veri Saklama (Kalıcı Olmayan)**: Veritabanı veya log dosyaları gibi kalıcı olması gereken verileri volume kullanmadan container içinde saklamak. Container silindiğinde tüm veriler kaybolur.
* ❌ **`apt-get update && apt-get install ...` Tek Satırda Olmaması**: Bağımlılıkları tek bir `RUN` komutunda kurmamak, ara katmanlar (layers) oluşturur ve imaj boyutunu artırır.
* ❌ **Gereksiz Bağımlılıkları İmaja Dahil Etme**: Üretim ortamında kullanılmayacak derleyiciler, test araçları veya SDK'ları üretim imajına dahil etmek.
* ❌ **Tüm Dosyaları Gelişigüzel Kopyalama (`COPY . .`)**: `.dockerignore` kullanmadan tüm proje dizinini kopyalamak, gereksiz dosyaların imaja dahil olmasına neden olur.
## Docker Mobil Geliştirme: Yaygın Hatalar ve Çözümleri (2026)
Mobil geliştiricilerin 2026 yılında Docker kullanırken sıkça karşılaştığı sorunlar ve pratik çözümleri.
### 1. Hata: "port is already allocated" (Bağlantı Noktası Zaten Kullanımda)
**Problem**: Docker, belirtilen host portunu açmaya çalışırken bu portun başka bir uygulama tarafından zaten kullanıldığını tespit eder.
**Sebep**: Önceki bir container veya başka bir uygulama aynı portu kullanıyor.
**Çözüm**:
* Kullanımda olan container'ı durdurun: `docker stop `
* Veya farklı bir host portu kullanın: `docker run -p 8081:80 ...`
* Linux'ta hangi uygulamanın portu kullandığını bulmak için: `sudo lsof -i :8080`
### 2. Hata: "Image not found" veya "Cannot connect to the Docker daemon"
**Problem**: Docker imajını bulamıyor veya Docker servisine bağlanamıyor.
**Sebep**:
* İmaj adı veya etiketi yanlış yazılmış.
* Docker servisi çalışmıyor.
* Docker Desktop başlatılmamış veya takılmış.
**Çözüm**:
* İmaj adını ve etiketini kontrol edin. `docker images` komutuyla mevcut imajları listeleyin.
* Docker Desktop uygulamasının çalıştığından emin olun. Gerekirse yeniden başlatın.
* Linux'ta Docker daemon'ın durumunu kontrol edin: `sudo systemctl status docker`. Gerekirse başlatın: `sudo systemctl start docker`.
### 3. Hata: "permissions denied" (Erişim Reddedildi)
**Problem**: Docker komutlarını çalıştırırken yetki hatası alınıyor.
**Sebep**: Linux'ta Docker komutlarını root yetkisi olmadan çalıştırmaya çalışmak.
**Çözüm**:
* Komutun başına `sudo` ekleyin: `sudo docker run ...`
* Kullanıcınızı `docker` grubuna ekleyin (yeniden başlatma gerekebilir): `sudo usermod -aG docker $USER`
### 4. Hata: Container'a bağlanamıyorum (Network sorunları)
**Problem**: Çalışan bir container'ın içindeki servise host makineden veya başka bir container'dan erişilemiyor.
**Sebep**:
* Port eşleştirmesi (`-p`) yapılmamış.
* Yanlış port kullanılıyor.
* Container'lar farklı ağlarda.
* Firewall engelliyor.
**Çözüm**:
* `docker ps` ile container'ın port eşleştirmesini kontrol edin.
* Container'ların aynı Docker ağında olduğundan emin olun (`docker network ls`, `docker inspect `).
* Host makinenizin güvenlik duvarını kontrol edin.
* Container'ın içindeki uygulamanın doğru IP adresini (0.0.0.0) dinlediğinden emin olun, `127.0.0.1` dinlerse dışarıdan erişilemez.
### 5. Hata: Container anında kapanıyor (Exit code non-zero)
**Problem**: Container başlatılıyor ancak hemen sonra kapanıyor ve hata koduyla çıkıyor.
**Sebep**:
* Container içindeki uygulama düzgün başlamıyor veya bir hata ile çöküyor.
* `CMD` veya `ENTRYPOINT` komutu yanlış.
* Gerekli bağımlılıklar eksik.
**Çözüm**:
* Container'ın loglarını kontrol edin: `docker logs `. Bu, hatanın nedenini anlamak için en önemli adımdır.
* İmajı interaktif modda çalıştırarak (`docker run -it bash` veya `sh`) container içine girip manuel olarak uygulamayı başlatmaya çalışın ve hataları gözlemleyin.
* `Dockerfile`'daki `CMD` veya `ENTRYPOINT` komutunu gözden geçirin.
## Docker Mobil Backend Performans Optimizasyonu (2026)
Mobil uygulamaların backend servisleri için Docker container'larının performansını artırmak, kullanıcı deneyimi ve maliyetler açısından 2026'da büyük önem taşır.
### 1. İmaj Boyutunu Küçültme
* **Etki**: Daha hızlı indirme, daha az depolama alanı, daha hızlı container başlatma.
* **Nasıl Yapılır**:
* **Multi-Stage Builds**: Bölüm 7'de açıklandığı gibi, sadece üretim için gerekli olanları içeren nihai bir imaj oluşturun. Bu 2026'da imaj boyutunu %50-70 oranında azaltabilir.
* **Alpine Tabanlı İmajlar**: `alpine` etiketli temel imajları kullanın (örneğin `node:20-alpine`, `python:3.11-alpine`). Bu imajlar çok daha küçüktür.
* **Gereksiz Bağımlılıkları Kaldırın**: İmajda bulunması gerekmeyen paketleri (derleyiciler, test araçları, dokümantasyon) `RUN` komutundan sonra temizleyin.
```dockerfile
# Örnek: Apt paketlerini temizleme
RUN apt-get update && apt-get install -y --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
```
### 2. Katman Önbellekleme (Layer Caching) Optimizasyonu
* **Etki**: İmaj oluşturma sürelerini kısaltır.
* **Nasıl Yapılır**: `Dockerfile` komutlarını en az değişenlerden en çok değişenlere doğru sıralayın. Docker, bir katman değiştiğinde sonraki tüm katmanları yeniden oluşturur.
* Önce statik bağımlılıkları (örneğin `package.json`, `requirements.txt`) kopyalayın ve kurun.
* Sonra sık değişen uygulama kodunu kopyalayın.
```dockerfile
# Önce bağımlılıkları kopyala ve kur (sık değişmez)
COPY package*.json ./
RUN npm install
# Sonra uygulama kodunu kopyala (sık değişir)
COPY . .
```
### 3. Kaynak Limitleri ve Rezervasyonları
* **Etki**: Container'ların host kaynaklarını (CPU, RAM) kontrol altına alır, diğer servislerin etkilenmesini engeller.
* **Nasıl Yapılır**: Docker Compose veya `docker run` komutunda `resources` veya `--cpus`, `--memory` seçeneklerini kullanın.
```yaml
# docker-compose.yml içinde
services:
api:
# ...
deploy:
resources:
limits:
cpus: '0.5' # 0.5 CPU çekirdeği
memory: 512M # 512 MB RAM
reservations:
cpus: '0.25'
memory: 256M
```
Bu, mobil backend servislerinizin 2026'da beklenmedik yük artışlarında bile stabil kalmasını sağlar.
### 4. Container Loglama ve İzleme (Monitoring)
* **Etki**: Performans darboğazlarını tespit etme, hata ayıklama ve proaktif müdahale.
* **Nasıl Yapılır**:
* **Log Sürücüleri**: Docker'ın varsayılan `json-file` log sürücüsü yerine `syslog`, `fluentd`, `awslogs` gibi harici log sürücülerini kullanın.
* **İzleme Araçları**: Prometheus, Grafana, Datadog gibi araçlarla container metriklerini (CPU, RAM, ağ kullanımı) izleyin. 2026'da bu araçlar, mobil backend'inizin sağlığını ve performansını sürekli takip etmek için standarttır.
### 5. Ağ Optimizasyonu
* **Etki**: Container'lar arası ve host-container arası iletişimi hızlandırır.
* **Nasıl Yapılır**:
* **Özel Ağlar**: Container'lar arası iletişim için özel Docker ağları oluşturun (Bölüm 6'da gösterildiği gibi). Bu, varsayılan `bridge` ağının performans yükünü azaltır.
* **Minimum Port Açma**: Sadece gerçekten gerekli olan portları açın ve eşleştirin. Gereksiz portlar güvenlik riski oluşturur ve ağ kaynaklarını tüketebilir.
## Docker ile Mobil Backend Projesi: Node.js API ve Redis Cache (2026)
Bu bölümde, mobil uygulamanız için küçük bir backend projesini Docker Compose ile nasıl yapılandıracağınızı göstereceğiz. Projemiz bir Node.js API'si ve Redis cache'inden oluşacak.
### Proje Yapısı:
```
.
├── docker-compose.yml
├── api/
│ ├── Dockerfile
│ ├── package.json
│ ├── server.js
└── .dockerignore
```
### `docker-compose.yml`
```yaml
version: '3.9' # 2026 için güncel Compose formatı
services:
api:
build: ./api
ports:
- "3000:3000"
environment:
REDIS_HOST: redis
REDIS_PORT: 6379
depends_on:
- redis
networks:
- mobile-backend-network
redis:
image: redis:7-alpine # 2026 itibarıyla güncel ve hafif Redis imajı
ports:
- "6379:6379" # Sadece yerel test için dışarıya açıldı, üretimde gerekmez
volumes:
- redis_data_2026:/data # Redis verileri için kalıcı depolama
networks:
- mobile-backend-network
volumes:
redis_data_2026:
networks:
mobile-backend-network:
driver: bridge
```
### `api/Dockerfile`
```dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY api/package*.json ./
RUN npm install --production=false
COPY api/. . # Sadece api dizinindeki dosyaları kopyala
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/server.js ./server.js
EXPOSE 3000
CMD ["node", "server.js"]
```
### `api/package.json`
```json
{
"name": "mobile-api-2026",
"version": "1.0.0",
"description": "Mobile API with Redis cache for 2026 Docker example",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.18.2",
"redis": "^4.6.13" # 2026 itibarıyla güncel redis istemcisi
}
}
```
### `api/server.js`
```javascript
const express = require('express');
const redis = require('redis');
const app = express();
const port = 3000;
const redisHost = process.env.REDIS_HOST || 'localhost';
const redisPort = parseInt(process.env.REDIS_PORT || '6379', 10);
const client = redis.createClient({
socket: {
host: redisHost,
port: redisPort,
}
});
client.on('error', (err) => console.error('Redis Client Error:', err));
app.get('/', async (req, res) => {
try {
if (!client.isOpen) {
await client.connect();
}
const cachedData = await client.get('my_data');
if (cachedData) {
console.log('Serving from cache (2026)');
return res.send(`Data from cache: ${cachedData}`);
}
const newData = `Hello from 2026 Docker API! Random: ${Math.random()}`;
await client.setEx('my_data', 10, newData); // Cache for 10 seconds
console.log('Serving from API, caching data (2026)');
res.send(`Data from API: ${newData}`);
} catch (error) {
console.error('API Error:', error);
res.status(500).send('Internal Server Error (2026)');
}
});
app.listen(port, () => {
console.log(`Mobile API listening at http://localhost:${port} (2026)`);
});
```
### `.dockerignore`
```
node_modules
.git
.env
Dockerfile
.dockerignore
```
### Çalıştırma:
Proje ana dizininde ( `docker-compose.yml` dosyasının olduğu yerde) aşağıdaki komutu çalıştırın:
```bash
docker compose up -d --build
```
Tarayıcınızda `http://localhost:3000` adresine giderek API'nizin çalıştığını ve Redis cache mekanizmasının devreye girdiğini gözlemleyebilirsiniz. İlk istekte "Serving from API", sonraki 10 saniye içindeki isteklerde "Serving from cache" çıktısını görmelisiniz.
## Docker Mobil Geliştirme İçin Önemli Noktalar (2026 Özeti)
İşte 2026 yılında mobil geliştirme projelerinizde Docker kullanırken aklınızda bulundurmanız gereken kritik noktalar:
* Docker, mobil backend servisleriniz için geliştirme ortamı tutarlılığı ve