spinny:~/writing $ less docker-containers-complete-guide.md
12Docker, yazilim olusturma, dagitma ve calistirma yontemimizi degistirdi. "Benim makinemde calisiyor" yerine Docker, uygulamanizin her yerde ayni sekilde calismasini garanti eder - dizustu bilgisayarinizda, bir meslektasinizin makinesinde, CI/CD'de ve production'da. Bu rehberde, sifirdan gercek bir uygulamayi deploy etmeye kadar gidecegiz.34## Docker Nedir?56Docker, uygulamanizi ve tum bagimliklarini **container** adinda standart bir birime paketleyen bir platformdur. Container, ana bilgisayar isletim sistemi cekirdegini paylasan ancak kendi dosya sistemi, agi ve islem alanina sahip izole, hafif bir islemdir.78```mermaid9graph TD10 subgraph "Traditional Deployment"11 A1[App 1] --> OS1[Guest OS]12 A2[App 2] --> OS2[Guest OS]13 OS1 --> HV[Hypervisor]14 OS2 --> HV15 HV --> HW1[Hardware]16 end1718 subgraph "Docker Deployment"19 B1[App 1] --> D1[Container]20 B2[App 2] --> D2[Container]21 D1 --> DE[Docker Engine]22 D2 --> DE23 DE --> HW2[Hardware]24 end25```2627### Container-lar vs Sanal Makineler2829| Ozellik | Container-lar | Sanal Makineler |30|---------|-------------|-----------------|31| **Baslatma** | Saniyeler | Dakikalar |32| **Boyut** | MB | GB |33| **Isletim Sistemi** | Ana bilgisayar cekirdegini paylasiyor | Tam misafir IS |34| **Izolasyon** | Islem duzeyi | Donanim duzeyi |35| **Performans** | Neredeyse yerel | Hypervisor ek yuku |36| **Yogunluk** | Ana bilgisayar basina yuzlerce | Ana bilgisayar basina onlarca |3738## Docker'i Kurmak3940```bash41# macOS42brew install --cask docker4344# Ubuntu/Debian45curl -fsSL https://get.docker.com | sh46sudo usermod -aG docker $USER4748# Verify installation49docker --version50docker run hello-world51```5253## Temel Kavramlar5455### Image-lar5657Bir image, container olusturmak icin talimatlari iceren salt okunur bir sablondur. Uygulamanizin ve ortaminin bir anllik goruntusu olarak dusunun.5859```bash60# Pull an image from Docker Hub61docker pull node:20-alpine6263# List local images64docker images6566# Remove an image67docker rmi node:20-alpine68```6970### Container-lar7172Container, bir image'in calisan bir ornegi-dir. Container olusturabilir, baslatabilir, durdurabilir ve silebilirsiniz.7374```bash75# Run a container76docker run -d --name my-app -p 3000:3000 node:20-alpine7778# List running containers79docker ps8081# List all containers (including stopped)82docker ps -a8384# Stop a container85docker stop my-app8687# Remove a container88docker rm my-app8990# View logs91docker logs my-app9293# Execute a command inside a running container94docker exec -it my-app sh95```9697## Dockerfile Yazmak9899Dockerfile, bir image olusturmak icin talimatlar iceren bir metin dosyasidir. Her talimat bir katman olusturur.100101### Node.js Uygulamasi icin Temel Dockerfile102103```dockerfile104# Use an official Node.js runtime as base image105FROM node:20-alpine106107# Set working directory108WORKDIR /app109110# Copy package files first (better caching)111COPY package.json package-lock.json ./112113# Install dependencies114RUN npm ci --only=production115116# Copy application code117COPY . .118119# Expose the port the app runs on120EXPOSE 3000121122# Command to run the application123CMD ["node", "server.js"]124```125126### Olusturma ve Calistirma127128```bash129# Build the image130docker build -t my-node-app .131132# Run the container133docker run -d -p 3000:3000 my-node-app134135# Visit http://localhost:3000136```137138## Multi-Stage Build-ler139140Multi-stage build-ler, build ortamini runtime'dan ayirarak production image-larinizi kucuk tutar.141142```dockerfile143# Stage 1: Build144FROM node:20-alpine AS builder145WORKDIR /app146COPY package.json package-lock.json ./147RUN npm ci148COPY . .149RUN npm run build150151# Stage 2: Production152FROM node:20-alpine AS runner153WORKDIR /app154COPY --from=builder /app/dist ./dist155COPY --from=builder /app/node_modules ./node_modules156COPY --from=builder /app/package.json ./157EXPOSE 3000158CMD ["node", "dist/server.js"]159```160161Bu, yalnizca derlenenmis ciktiyi ve production bagimliklarini iceren bir image uretir - kaynak kodu yok, gelistirme bagimliliklari yok, build araclari yok.162163### Next.js Multi-Stage Ornegi164165```dockerfile166FROM node:20-alpine AS deps167WORKDIR /app168COPY package.json package-lock.json ./169RUN npm ci170171FROM node:20-alpine AS builder172WORKDIR /app173COPY --from=deps /app/node_modules ./node_modules174COPY . .175RUN npm run build176177FROM node:20-alpine AS runner178WORKDIR /app179ENV NODE_ENV=production180COPY --from=builder /app/public ./public181COPY --from=builder /app/.next/standalone ./182COPY --from=builder /app/.next/static ./.next/static183EXPOSE 3000184CMD ["node", "server.js"]185```186187## Volume-ler: Kalici Veri188189Varsayilan olarak, container icindeki veriler container kaldirildiginda kaybolur. Volume-ler bu sorunu cozer.190191```bash192# Create a named volume193docker volume create my-data194195# Run with a volume196docker run -d -v my-data:/app/data my-app197198# Bind mount (map host directory to container)199docker run -d -v $(pwd)/data:/app/data my-app200201# List volumes202docker volume ls203```204205## Ag Yapisi206207Docker, container-larin iletisim kurmasi icin izole aglar olusturur.208209```bash210# Create a custom network211docker network create my-network212213# Run containers on the same network214docker run -d --name api --network my-network my-api215docker run -d --name db --network my-network postgres:16216217# Containers can reach each other by name218# From "api" container: postgres://db:5432219```220221```mermaid222graph LR223 subgraph "my-network"224 API[api container\nport 3000] -- "db:5432" --> DB[db container\nport 5432]225 end226 User -- "localhost:3000" --> API227```228229## Docker Compose230231Docker Compose, tek bir YAML dosyasiyla coklu container uygulamalarini tanimlamanizi ve calistirmanizi saglar.232233### docker-compose.yml234235```yaml236services:237 api:238 build: ./api239 ports:240 - "3000:3000"241 environment:242 - DATABASE_URL=postgres://user:pass@db:5432/mydb243 depends_on:244 - db245246 db:247 image: postgres:16-alpine248 environment:249 - POSTGRES_USER=user250 - POSTGRES_PASSWORD=pass251 - POSTGRES_DB=mydb252 volumes:253 - pgdata:/var/lib/postgresql/data254 ports:255 - "5432:5432"256257 redis:258 image: redis:7-alpine259 ports:260 - "6379:6379"261262volumes:263 pgdata:264```265266### Komutlar267268```bash269# Start all services270docker compose up -d271272# View logs273docker compose logs -f274275# Stop all services276docker compose down277278# Rebuild and restart279docker compose up -d --build280281# Scale a service282docker compose up -d --scale api=3283```284285## .dockerignore286287`.gitignore` gibi, bu dosya gereksiz dosyalarin image'a kopyalanmasini onler.288289```plaintext290node_modules291.git292.env293*.md294.next295dist296coverage297```298299## Production En Iyi Uygulamalari300301### 1. Kucuk Temel Image-lar Kullanin302303```dockerfile304# Bad: 1GB+305FROM node:20306307# Good: ~180MB308FROM node:20-alpine309```310311### 2. Root Olarak Calistirmayin312313```dockerfile314FROM node:20-alpine315RUN addgroup -S app && adduser -S app -G app316USER app317WORKDIR /home/app318COPY --chown=app:app . .319```320321### 3. Belirli Image Tag-leri Kullanin322323```dockerfile324# Bad: can change unexpectedly325FROM node:latest326327# Good: pinned version328FROM node:20.11-alpine3.19329```330331### 4. Build Onbellegini Kullanin332333Dockerfile talimatlarinizi en az degisenden en cok degisene dogru sirayin:334335```dockerfile336FROM node:20-alpine337WORKDIR /app338339# These change rarely - cached340COPY package.json package-lock.json ./341RUN npm ci --only=production342343# This changes often - not cached344COPY . .345```346347### 5. Saglik Kontrolleri348349```dockerfile350HEALTHCHECK --interval=30s --timeout=3s --retries=3 \351 CMD wget -qO- http://localhost:3000/health || exit 1352```353354### 6. Ortam Degiskenleri Kullanin355356```dockerfile357ENV NODE_ENV=production358ENV PORT=3000359```360361## Yaygin Docker Komutlari Hizli Basvuru362363```bash364# Images365docker build -t name:tag . # Build image366docker images # List images367docker rmi image_name # Remove image368docker image prune # Remove unused images369370# Containers371docker run -d -p 3000:3000 image # Run detached372docker ps # List running373docker stop container_name # Stop374docker rm container_name # Remove375docker logs -f container_name # Follow logs376docker exec -it container sh # Shell into container377378# Compose379docker compose up -d # Start services380docker compose down # Stop services381docker compose logs -f # Follow all logs382docker compose ps # List services383384# Cleanup385docker system prune -a # Remove everything unused386```387388## Docker'dan Kubernetes'e389390Docker bireysel container-lari yonetir. Birden fazla sunucuda yuzlerce container-i orkestre etmeniz gerektiginde Kubernetes'e ihtiyaciniz vardir. Docker ve Kubernetes birbirini tamamlar:3913921. **Docker**: container-lari olusturur ve calistirir3932. **Kubernetes**: container-lari buyuk olcekte orkestre eder (zamanlama, olceklendirme, iyilestirme)394395Sonraki adimla ilgileniyorsaniz, Kubernetes'e Giris hakkindaki makaleme goz atin.396397## Sonuc398399Docker, modern gelisimciler icin temel bir beceridir. Ortam tutarsizliklarini ortadan kaldirir, deploy'u basitlestirir ve Kubernetes ile container orkestrasyonunun temelidir. Basit bir Dockerfile ile baslayin, coklu hizmet uygulamalari icin Docker Compose'a gecin ve buyudukce multi-stage build-leri ve guvenlik en iyi uygulamalarini benimseyin.400401Docker'i ogrenmenin en iyi yolu, halihazirda uzerinde calistiginiz bir projeyi containerize etmektir. Bugun baslayin.402
:Yeni Baslayanlar icin Docker: Ilk Image-dan Production Deploy-alines 1-402 (END) — press q to close