Celil Uyanikoglu

Docker Nedir? Konteyner Teknolojisi Rehberi

Celil Uyanikoglu Celil Uyanikoglu · 18 Nis 2026 · 6 dk okuma

"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