Docker ile Konteyner Mimarisine Giriş: Temel Kavramlar ve Komutlar
Merhaba değerli okuyucular, ben Gökhan Güngör. Günümüzün hızla gelişen yazılım dünyasında, uygulamaları daha verimli, tutarlı ve taşınabilir bir şekilde çalıştırmak, her IT uzmanının ve geliştiricinin önceliklerinden biri haline gelmiştir. İşte tam bu noktada, konteyner teknolojisi ve onun en popüler temsilcisi Docker devreye giriyor. Bu yazımızda, Docker ile konteyner mimarisine derinlemesine bir giriş yapacak, temel kavramları açıklayacak ve en sık kullanılan Docker komutlarını adım adım inceleyeceğiz.
Konteyner Mimarisi Nedir? Neden İhtiyaç Duyarız?
Geleneksel sanallaştırma yöntemlerinde (VM'ler), her uygulama kendi işletim sistemine sahip ayrı bir sanal makine üzerinde çalışır. Bu durum, kaynak tüketimini artırır ve başlangıç sürelerini uzatır. Konteynerler ise, uygulamayı ve tüm bağımlılıklarını (kütüphaneler, ayarlar vb.) izole edilmiş bir paket içinde çalıştıran hafif, taşınabilir ve kendi işletim sistemine ihtiyaç duymayan yapılardır. Konteynerler, ana işletim sisteminin kernel'ini paylaşır.
Konteynerlerin Sağladığı Avantajlar:
- Taşınabilirlik: Konteynerler, her ortamda (geliştirme, test, üretim) aynı şekilde çalışmayı garanti eder. "Benim makinemde çalışıyordu!" sorunu ortadan kalkar.
- İzolasyon: Uygulamalar birbirini etkilemeden izole ortamlarda çalışır. Bir konteynerdeki sorun, diğerlerini etkilemez.
- Verimlilik: Sanal makinelere göre çok daha az kaynak (CPU, RAM) tüketirler. Daha hızlı başlarlar.
- Tutarlılık: Geliştirme ortamından üretime kadar her aşamada aynı ortamı sağlar.
- Hızlı Dağıtım ve Ölçeklenebilirlik: Yeni konteynerler saniyeler içinde başlatılabilir, bu da uygulamaların hızlı bir şekilde ölçeklenmesine olanak tanır.
Docker Nedir ve Konteyner Dünyasındaki Yeri
Docker, konteyner teknolojisini herkes için erişilebilir ve kolay kullanılır hale getiren açık kaynaklı bir platformdur. Uygulamaları konteynerler içinde derlemek, dağıtmak ve çalıştırmak için bir dizi araç ve hizmet sunar. Docker, Linux kernel'inin sağladığı izolasyon özelliklerini (cgroups ve namespaces) kullanarak konteynerleri yönetir.
Docker'ın Temel Bileşenleri:
- Docker Engine: Docker Daemon (dockerd), REST API ve Docker CLI'dan oluşur. Konteynerleri oluşturan, çalıştıran ve yöneten arka plan servisidir.
- Docker Images (İmajlar): Uygulamanızı ve tüm bağımlılıklarını içeren, çalıştırılabilir, salt okunur şablonlardır. Bir Docker imajından birden fazla konteyner oluşturulabilir.
- Docker Containers (Konteynerler): Docker imajlarının çalıştırılabilir örnekleridir. Uygulamanızın izole edilmiş ve çalışan halidir.
- Docker Hub (Registries): Docker imajlarını depolamak ve paylaşmak için kullanılan merkezi bir depodur. Docker Hub en bilinenidir ancak özel kayıt defterleri de kullanılabilir.
- Dockerfile: Bir Docker imajının nasıl oluşturulacağını adım adım tanımlayan metin tabanlı bir betiktir.
Docker Kurulumu (Genel Bakış)
Docker'ı kurmak oldukça basittir ve birçok işletim sistemi için (Linux, Windows, macOS) resmi kurulum rehberleri bulunmaktadır. Genellikle, işletim sisteminize özel bir paket yöneticisi veya Docker Desktop uygulaması aracılığıyla kolayca kurulabilir. Kurulum detaylarına bu yazıda değinmeyeceğiz, ancak resmi Docker belgelerine başvurmanız önerilir.
Temel Docker Komutları
Docker ile çalışmaya başlamak için bilmeniz gereken temel komutlar şunlardır:
1. Docker Sürümünü Kontrol Etme:
Docker'ın sisteminizde yüklü olup olmadığını ve hangi sürümün çalıştığını kontrol eder.
docker --version
2. Bir İmaj Çekme (Pull):
Docker Hub gibi bir kayıt defterinden bir Docker imajını yerel sisteminize indirir.
docker pull ubuntu:latest
3. İmajları Listeleme:
Yerel sisteminizdeki tüm Docker imajlarını listeler.
docker images
4. Konteyner Çalıştırma (Run):
Bir Docker imajından yeni bir konteyner oluşturur ve çalıştırır. -d konteyneri arka planda çalıştırmak için, -p port eşlemesi yapmak için kullanılır.
docker run -d -p 80:80 nginx:latest
Bu komut, Nginx imajından bir konteyner başlatır, arka planda çalıştırır ve host makinenin 80. portunu konteynerin 80. portuna yönlendirir.
5. Çalışan Konteynerleri Listeleme:
Şu anda çalışan tüm konteynerleri listeler. -a veya --all parametresi durdurulmuş olanlar dahil tüm konteynerleri gösterir.
docker ps docker ps -a
6. Konteyneri Durdurma:
Belirtilen konteyneri durdurur.
docker stop [konteyner_adı_veya_id]
7. Konteyneri Başlatma:
Durdurulmuş bir konteyneri tekrar başlatır.
docker start [konteyner_adı_veya_id]
8. Konteyneri Yeniden Başlatma:
Çalışan bir konteyneri durdurup tekrar başlatır.
docker restart [konteyner_adı_veya_id]
9. Konteyneri Silme:
Durdurulmuş bir konteyneri sistemden siler. Çalışan bir konteyneri silmek için önce durdurmanız gerekir.
docker rm [konteyner_adı_veya_id]
10. İmajı Silme:
Yerel sistemden bir Docker imajını siler. İmaja bağlı çalışan veya durdurulmuş bir konteyner varsa, önce o konteynerleri silmeniz gerekir.
docker rmi [imaj_adı_veya_id]
11. Konteyner İçine Girme (Exec):
Çalışan bir konteyner içinde komut çalıştırmanıza olanak tanır. -it interaktif bir terminal açar.
docker exec -it [konteyner_adı_veya_id] bash
12. Konteyner Loglarını Görüntüleme:
Bir konteynerin standart çıktı ve hata akışlarını (loglarını) görüntüler. -f parametresi logları gerçek zamanlı olarak takip etmenizi sağlar.
docker logs [konteyner_adı_veya_id] docker logs -f [konteyner_adı_veya_id]
Dockerfile ile Kendi İmajımızı Oluşturma (Basit Örnek)
Kendi uygulamanız için bir Docker imajı oluşturmak, bir Dockerfile yazmayı gerektirir. İşte basit bir Node.js uygulamasını konteynerleştiren bir Dockerfile örneği:
Öncelikle, uygulamanızın olduğu dizinde Dockerfile adında bir dosya oluşturun:
# Temel imajı belirle FROM node:14-alpine # Çalışma dizinini ayarla WORKDIR /app # Uygulama bağımlılıklarını kopyala COPY package*.json ./ # Bağımlılıkları yükle RUN npm install # Uygulama kaynak kodunu kopyala COPY . . # Uygulamanın dinleyeceği portu belirt EXPOSE 3000 # Uygulamayı başlat CMD ["npm", "start"]
Bu Dockerfile'ı kullanarak imaj oluşturmak için:
docker build -t my-nodejs-app:1.0 .
Oluşturulan imajı çalıştırmak için:
docker run -d -p 3000:3000 my-nodejs-app:1.0
Sonuç
Docker ve konteyner mimarisi, modern yazılım geliştirme ve dağıtım süreçlerinin vazgeçilmez bir parçası haline gelmiştir. Sağladığı taşınabilirlik, izolasyon ve verimlilik avantajları sayesinde, geliştiricilerin ve operasyon ekiplerinin iş akışlarını önemli ölçüde hızlandırmaktadır. Bu yazıda ele aldığımız temel kavramlar ve komutlar, Docker dünyasına sağlam bir başlangıç yapmanız için yeterlidir. Konteynerizasyon yolculuğunuzda başarılar dilerim!
Bir sonraki yazımda görüşmek üzere!