Docker ve Docker Compose Başlangıç Rehberi
Uygulama geliştirme sürecinde sıklıkla karşılaştığımız uyumluluk sorunları, dağıtım zorlukları ve ortam farklılıkları nedeniyle projelerimiz beklenmedik hatalarla karşılaşabilir. Bu sorunları ortadan kaldırmak ve geliştirme, test ve üretim ortamlarında tutarlılık sağlamak için Docker ve Docker Compose hayat kurtarıcı çözümler sunuyor. Bu rehberde, Docker ve Docker Compose’un temellerini adım adım öğrenecek, gerçek dünya senaryolarıyla karşılaşacak ve uzman seviyesine kadar ilerleyeceksiniz.
Docker Nedir ve Neden Kullanmalıyım?
Docker, uygulamalarınızı ve bağımlılıklarını içeren kapsayıcılar (containers) oluşturmanıza olanak sağlayan bir platformdur. Bir kapsayıcı, uygulamanızın çalışması için gereken her şeyi – kod, kütüphaneler, sistem araçları – içeren izole edilmiş bir ortamdır. Bu sayede, uygulamanızın hangi sistemde çalıştığına bağlı olarak farklılıklar göstermesi riski ortadan kalkar. Örneğin, geliştirme ortamınızda Python 3.9 kullanırken, üretim ortamınızda Python 3.7 kullanıyor olabilirsiniz. Docker sayesinde, her iki ortamda da aynı kapsayıcıyı çalıştırarak uyumluluk sorunlarını önleyebilirsiniz. Ayrıca, Docker, kaynak kullanımını optimize eder ve uygulamalarınızı daha hızlı ve kolay bir şekilde dağıtmanıza olanak tanır. Daha basit bir anlatımla, Docker, uygulamalarınızı taşınabilir, tutarlı ve izole edilmiş bir ortamda çalıştırmanıza yardımcı olan bir “kutulama” sistemidir.
Docker’ın en büyük avantajlarından biri, tutarlılık sağlamasıdır. Geliştirme, test ve üretim ortamlarında aynı kapsayıcıyı kullanarak, ortam farklılıklarından kaynaklanan hataları önleyebilirsiniz. Bu da zaman ve kaynak tasarrufu sağlar. Ayrıca, Docker’ın kullanımı oldukça kolaydır ve zengin bir ekosistem sunar. Binlerce önceden hazırlanmış kapsayıcı imajı (image) sayesinde, uygulamalarınızı hızlı bir şekilde başlatabilir ve çalıştırabilirsiniz. Örneğin, bir web uygulaması geliştirmek istiyorsanız, önceden hazırlanmış bir Nginx veya Apache kapsayıcı imajını kullanabilir ve sadece uygulamanızı kapsayıcıya ekleyebilirsiniz. Sonuç olarak, Docker, geliştirme sürecini hızlandırır, hataları azaltır ve uygulamalarınızın dağıtımını kolaylaştırır.
Docker’da Temel Kavramlar: Image ve Container
Docker’ı anlamak için iki temel kavramı öğrenmemiz gerekir: Image ve Container. Bir Image, uygulamanızın çalışması için gereken her şeyi içeren bir şablondur. Bir Container ise, bir Image’ın çalıştırılmış halidir. Bir Image’ı çalıştırdığınızda, bir Container oluşturursunuz. Container’lar, Image’dan türetilen izole edilmiş ortamlardır ve kendi dosya sistemi, ağ yapılandırması ve diğer kaynaklara sahiptirler. Bir Image’dan birden fazla Container oluşturabilirsiniz, tıpkı bir kalıptan birden fazla ürün üretmek gibi. Bu nedenle, Image’lar, Container’ların planıdır, Container’lar ise Image’ların gerçekleştirilmiş halidir. Image’lar genellikle bir Docker Hub gibi bir depolama alanında saklanır ve gerektiğinde indirilebilir veya paylaşılabilirler.
Image’lar katmanlı bir yapıya sahiptir, bu da değişikliklerin sadece ilgili katmanı etkilemesi anlamına gelir. Bu katmanlı yapı, disk alanından tasarruf etmenizi ve imajların güncellenmesini hızlandırmanızı sağlar. Örneğin, bir uygulama imajını güncellediğinizde, sadece değişen katmanlar yeniden oluşturulur, bu da işlem süresini kısaltır. Container’lar ise, bir Image’dan türetildikleri için, Image’ın özelliklerini miras alırlar. Ancak, Container’ların kendi dosya sistemi ve diğer kaynakları vardır, bu da onları birbirinden bağımsız hale getirir. Bir Container’ı durdurup sildiğinizde, Image etkilenmez. Bu ayrım, uygulamalarınızın yönetimini kolaylaştırır ve kaynakların verimli kullanılmasını sağlar.
Docker’ı Kurma ve İlk Kapsayıcınızı Çalıştırma
Docker’ı kurmak, işletim sisteminize bağlı olarak değişir. Linux, macOS ve Windows için resmi Docker dokümantasyonundan (https://docs.docker.com/) kurulum talimatlarını takip etmeniz önerilir. Kurulumdan sonra, Docker’ın doğru bir şekilde çalıştığını doğrulamak için aşağıdaki komutu çalıştırabilirsiniz:
docker version
Bu komut, kurulu Docker sürümünü ve diğer bilgileri görüntüler. Şimdi, ilk kapsayıcımızı çalıştıralım. Basit bir Nginx web sunucusu kapsayıcısı çalıştırmak için aşağıdaki komutu kullanın:
docker run -d -p 8080:80 nginx
Bu komut, arka planda (-d) çalışan ve 8080 numaralı portu 80 numaralı porta eşleyen (-p 8080:80) bir Nginx kapsayıcısı oluşturur. nginx ise, Nginx imajının adını temsil eder. Bu komutu çalıştırdıktan sonra, tarayıcınızı açıp http://localhost:8080 adresine girerek Nginx'in varsayılan sayfasını görebilirsiniz. Bu, Docker'ın başarılı bir şekilde çalıştığını ve bir kapsayıcıyı çalıştırabildiğinizi gösterir. Daha detaylı bilgi için (https://fatihsoysal.com) inceleyebilirsiniz.
Docker Image Oluşturma ve Dockerfile
Docker kapsayıcılarını oluşturmak için hazır imajlar kullanmak yeterli olmayabilir. Kendi uygulamalarınız için özel imajlar oluşturmak isteyebilirsiniz. Bunu yapmak için Dockerfile kullanırsınız. Dockerfile, imajın nasıl oluşturulacağını adım adım tanımlayan bir metin dosyasıdır. Bir Dockerfile, FROM, RUN, COPY, CMD, EXPOSE gibi komutları içerir. FROM komutu, temel imajı belirtir. RUN komutu, imajın oluşturulması sırasında çalıştırılacak komutları tanımlar. COPY komutu, dosyaları imaja kopyalar. CMD komutu, kapsayıcının çalıştırılması sırasında çalıştırılacak komutu tanımlar. EXPOSE komutu ise, kapsayıcının hangi portları kullandığını belirtir.
Örneğin, basit bir Node.js uygulaması için bir Dockerfile aşağıdaki gibi olabilir:
FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD [ "node", "index.js" ]
Bu Dockerfile, Node.js sürüm 16'yı temel imaj olarak kullanır, uygulamanın dosyalarını kopyalar, bağımlılıkları yükler ve uygulamayı çalıştırır. Dockerfile'ı oluşturduktan sonra, aşağıdaki komutla bir imaj oluşturabilirsiniz:
docker build -t my-node-app .
Bu komut, my-node-app adında bir imaj oluşturur. . ise, Dockerfile'ın bulunduğu dizini belirtir. Oluşturulan imajı çalıştırmak için:
docker run -p 3000:3000 my-node-app
Bu komut, 3000 numaralı portu 3000 numaralı porta eşleyerek my-node-app imajından bir kapsayıcı çalıştırır. Bu şekilde, kendi uygulamalarınız için özel Docker imajları oluşturabilir ve dağıtabilirsiniz.
Docker Compose ile Çoklu Kapsayıcı Yönetimi
Docker Compose, birden fazla kapsayıcıyı yönetmek için kullanılan bir araçtır. Karmaşık uygulamalar genellikle birden fazla hizmeti içerir (örneğin, web sunucusu, veritabanı, mesaj kuyruğu). Docker Compose, bu hizmetleri tanımlayan bir docker-compose.yml dosyası kullanarak, bu hizmetleri kolayca oluşturmanıza, başlatmanıza ve yönetmenize olanak tanır. docker-compose.yml dosyası, her bir hizmetin imajını, port eşlemelerini, bağlama hacimlerini ve diğer ayarlarını tanımlar.
Örneğin, bir web uygulaması ve bir veritabanı içeren bir uygulama için docker-compose.yml dosyası şöyle olabilir:
version: "3.9"
services:
web:
image: my-node-app
ports:
- "3000:3000"
db:
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=password
ports:
- "3306:3306"
Bu dosya, my-node-app imajından bir web hizmeti ve mysql:8 imajından bir veritabanı hizmeti tanımlar. Her iki hizmetin de port eşlemeleri vardır. Docker Compose'u kullanarak, bu hizmetleri aşağıdaki komutlarla çalıştırabilirsiniz:
docker-compose up -d
Bu komut, arka planda (-d) tüm hizmetleri çalıştırır. Hizmetleri durdurmak için ise:
docker-compose down
komutunu kullanabilirsiniz. Docker Compose, çok kapsayıcılı uygulamaların yönetimini oldukça kolaylaştırır ve geliştirme sürecinde önemli bir zaman tasarrufu sağlar.
Docker ve Docker Compose ile Gerçek Dünya Senaryoları
Docker ve Docker Compose, birçok farklı senaryoda kullanılabilir. İşte birkaç örnek:
- Web Uygulamaları: Docker, web uygulamalarının dağıtımını ve yönetimini kolaylaştırır. Uygulamanızı ve bağımlılıklarını bir kapsayıcıya koyarak, farklı ortamlarda aynı şekilde çalışmasını sağlayabilirsiniz.
- Microservices: Docker, microservices mimarisine mükemmel şekilde uygundur. Her bir microservice'i ayrı bir kapsayıcıda çalıştırarak, uygulamanızın ölçeklenebilirliğini ve dayanıklılığını artırabilirsiniz.
- DevOps: Docker, DevOps süreçlerini otomatikleştirmek için kullanılır. Docker imajlarını kullanarak, uygulamalarınızı hızlı ve güvenilir bir şekilde dağıtabilirsiniz.
- Veritabanları: Docker, veritabanlarını izole edilmiş bir ortamda çalıştırmanıza olanak tanır. Bu, veritabanı yönetimini kolaylaştırır ve veritabanı güvenliğini artırır.
Örneğin, bir e-ticaret uygulaması düşünün. Bu uygulama, web sunucusu, uygulama sunucusu, veritabanı ve arama sunucusu gibi birden çok bileşenden oluşabilir. Her bir bileşen ayrı bir Docker kapsayıcısında çalıştırılabilir ve Docker Compose ile yönetilebilir. Bu, uygulamanın ölçeklendirilmesini ve bakımını kolaylaştırır. Bir bileşende sorun oluşursa, sadece o bileşenin kapsayıcısı yeniden başlatılır, diğer bileşenler etkilenmez. Bu, uygulamanın yüksek oranda kullanılabilirliğini sağlar.
Docker ve Docker Compose'da İleri Düzey Konular
Docker ve Docker Compose'un temellerini öğrendikten sonra, daha ileri düzey konulara geçebilirsiniz. Bunlar arasında, Docker ağları, Docker hacimleri, Docker orkestrasyonu (Kubernetes), Docker güvenliği, Docker Swarm ve Docker Compose'da daha gelişmiş özelliklerin kullanımı yer alır. Docker ağları, kapsayıcılar arasında iletişim kurmanın bir yoludur. Docker hacimleri, kapsayıcılar arasında veri paylaşmanın bir yoludur. Docker orkestrasyonu, çok sayıda kapsayıcıyı yönetmek için kullanılır. Docker güvenliği, kapsayıcılarınızı güvenli hale getirmenin yollarını içerir. Docker Swarm ise, birden fazla makinede kapsayıcıları yönetmek için bir araçtır.
Örneğin, Docker hacimleri (volumes) kullanarak, kapsayıcılarınızın verilerini kalıcı hale getirebilirsiniz. Bu, kapsayıcı silindiğinde bile verilerinizin kaybolmasını önler. Docker ağları (networks) kullanarak, kapsayıcılar arasında iletişim kurmayı kolaylaştırabilir ve güvenlik duvarı kurallarını uygulayabilirsiniz. Kubernetes gibi orkestrasyon araçları, büyük ölçekli kapsayıcı uygulamalarını yönetmek için idealdir. Bu ileri düzey konuları öğrenerek, Docker ve Docker Compose'u daha etkin bir şekilde kullanabilir ve karmaşık uygulamaları kolaylıkla yönetebilirsiniz. Daha fazla bilgi için (https://fatihsoysal.com) inceleyebilirsiniz.
Öğrenme Yol Haritası
Docker ve Docker Compose'u öğrenmek için aşağıdaki yol haritasını takip edebilirsiniz:
| Seviye | Konular |
|---|---|
| Yeni Başlayan | Docker kurulumu, temel kavramlar (Image ve Container), basit bir kapsayıcı çalıştırma, Dockerfile ile imaj oluşturma |
| Orta | Docker Compose kullanımı, çoklu kapsayıcı yönetimi, Docker ağları, Docker hacimleri, basit bir uygulamanın Docker ile dağıtımı |
| İleri Düzey | Docker orkestrasyonu (Kubernetes), Docker güvenliği, Docker Swarm, Docker Compose'da gelişmiş özellikler, performans optimizasyonu |
Sonuç
Docker ve Docker Compose, uygulama geliştirme ve dağıtım süreçlerinde devrim yaratan güçlü araçlardır. Bu rehberde, Docker ve Docker Compose'un temellerini öğrendiniz ve gerçek dünya senaryolarında nasıl kullanılacağını gördünüz. İleri düzey konuları inceleyerek, bu araçları daha etkin bir şekilde kullanabilir ve karmaşık uygulamaları kolaylıkla yönetebilirsiniz. Sürekli öğrenme ve uygulama ile Docker ve Docker Compose uzmanlığına ulaşabilirsiniz.
Sıkça Sorulan Sorular
- Docker ve sanal makineler arasındaki fark nedir? Docker kapsayıcıları, sanal makinelere göre daha hafif ve daha hızlıdır. Sanal makineler, işletim sisteminin tam bir kopyasını çalıştırırken, Docker kapsayıcıları, host işletim sisteminin çekirdeğini paylaşır.
- Docker Hub nedir? Docker Hub, Docker imajlarının depolandığı bir depolama alanıdır. Binlerce önceden hazırlanmış imajı buradan indirebilirsiniz.
- Docker Compose neden önemlidir? Docker Compose, birden fazla kapsayıcıyı yönetmeyi kolaylaştırır ve çok kapsayıcılı uygulamaların dağıtımını basitleştirir.
- Docker güvenliği nasıl sağlanır? Güvenli bir Docker ortamı oluşturmak için, imajları güvenilir kaynaklardan indirmeli, kapsayıcıları izole etmeli ve güvenlik duvarı kurallarını kullanmalısınız. Dikkat: Her zaman imajları güvenilir kaynaklardan indirin ve güvenlik açıklarına karşı düzenli olarak tarayın.
- Docker'ı öğrenmek için hangi kaynakları kullanmalıyım? Resmi Docker dokümantasyonu (https://docs.docker.com/), Docker Hub ve çevrimiçi kurslar iyi kaynaklardır.
Yazar: Fatih Soysal