Ubuntu’da Docker Compose kurulumu mu arıyorsunuz? Bu rehberle çoklu konteyner uygulamalarınızı kolayca yönetin, geliştirme süreçlerinizi hızlandırın ve verimli bir ortam kurun.
Docker Compose Nedir ve Neden Kullanmalıyız?
Modern yazılım geliştirme dünyasında, uygulamaların farklı servislerden oluşması ve bu servislerin birbirinden bağımsız olarak çalıştırılması yaygın bir pratik haline gelmiştir. Bu durum, özellikle mikroservis mimarileri ve dağıtık sistemler söz konusu olduğunda daha da önem kazanır. Tek bir uygulamanın veritabanı, ön yüz (frontend), arka yüz (backend) API’leri, mesaj kuyrukları gibi birçok bileşeni olabilir. Bu bileşenlerin her birini ayrı ayrı yönetmek, başlatmak, durdurmak ve birbirleriyle iletişim kurmalarını sağlamak zaman alıcı ve hataya açık bir süreçtir. İşte tam bu noktada Docker Compose devreye girer.
Docker Compose, Docker ile birlikte gelen, çoklu konteyner Docker uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir araçtır. Tek bir YAML dosyası (genellikle docker-compose.yml olarak adlandırılır) kullanarak uygulamanızın tüm servislerini, ağlarını ve birimlerini (volumes) yapılandırabilirsiniz. Bu sayede, karmaşık bir uygulamanın tüm bileşenlerini tek bir komutla başlatabilir, durdurabilir veya yeniden oluşturabilirsiniz. Bu, geliştiriciler için büyük bir kolaylık sağlar ve geliştirme ortamlarının standartlaştırılmasına yardımcı olur.
Peki, Docker Compose kullanmak bize ne gibi avantajlar sunar? Öncelikle, geliştirme süreçlerini hızlandırır. Bir projenin yeni bir geliştiriciye devredildiğini düşünün. Geliştiricinin tüm bağımlılıkları (veritabanı, cache sunucusu vb.) manuel olarak kurması yerine, sadece Docker ve Docker Compose’u kurup ardından tek bir docker compose up komutuyla tüm uygulamayı çalışır hale getirmesi yeterlidir. Bu, “benim makinemde çalışıyor” sorununu ortadan kaldırır ve ekip içinde tutarlı bir geliştirme ortamı sağlar.
Dahası, Docker Compose bağımlılık yönetimini basitleştirir. Uygulamanızın ihtiyaç duyduğu tüm servisler (örneğin, PostgreSQL, Redis, Nginx) docker-compose.yml dosyasında açıkça tanımlanır. Bu, hangi servisin hangi sürümünü kullandığınızı net bir şekilde görmenizi ve yönetmenizi sağlar. Ayrıca, servisler arası iletişim de Docker Compose tarafından kolayca yapılandırılır; servisler birbirlerini isimleriyle tanıyabilirler.
Ölçeklenebilirlik ve tekrarlanabilirlik de Docker Compose’un önemli faydalarındandır. Aynı docker-compose.yml dosyası hem geliştirme hem de test ortamlarında kullanılabilir, hatta küçük ölçekli üretim ortamlarında bile tercih edilebilir. Bu, uygulamanızın farklı ortamlarda tutarlı bir şekilde çalışmasını garanti eder. Tek bir komutla servislerinizi ölçeklendirebilir, örneğin bir web sunucusu servisini birden fazla konteynerde çalıştırabilirsiniz. Bu esneklik, uygulama yaşam döngüsü boyunca büyük kolaylıklar sunar.
Sonuç olarak, Docker Compose, modern uygulama geliştirmenin ayrılmaz bir parçasıdır. Çoklu konteyner uygulamalarını tanımlama, yönetme ve dağıtma sürecini basitleştirerek geliştirici verimliliğini artırır ve tutarlı ortamlar sağlar. Bu makalede, Ubuntu sunucunuzda Docker Compose’u nasıl kuracağınızı ve ilk adımlarınızı nasıl atacağınızı detaylı bir şekilde öğreneceksiniz.
Ubuntu’da Docker Compose Kurulumu: Ön Hazırlıklar Nelerdir?
Docker Compose’u Ubuntu sisteminize kurmadan önce, bazı temel ön hazırlıkları tamamlamanız gerekmektedir. Bu adımlar, sorunsuz bir kurulum süreci ve Docker ekosisteminin verimli çalışması için kritik öneme sahiptir. Öncelikle, sisteminizin güncel olduğundan ve Docker’ın kurulu olduğundan emin olmalısınız. Docker Compose, Docker Engine üzerinde çalıştığı için, Docker’ın varlığı bir ön koşuldur.
Sistem Güncellemesi ve Temel Bağımlılıklar
Herhangi bir yazılım kurulumuna başlamadan önce, Ubuntu sisteminizi güncel tutmak iyi bir alışkanlıktır. Bu, mevcut paketlerin en son sürümlerine sahip olmanızı ve olası güvenlik açıklarının kapatılmasını sağlar. Terminalinizi açın ve aşağıdaki komutları çalıştırın:
sudo apt update
sudo apt upgrade -y
sudo apt update komutu, paket listelerinizi güncellerken, sudo apt upgrade -y komutu ise mevcut tüm paketleri yükseltir. -y bayrağı, tüm sorulara otomatik olarak “evet” yanıtı vermenizi sağlar, bu da süreci hızlandırır.
Ayrıca, Docker Compose’un ihtiyaç duyabileceği bazı temel bağımlılıkları da kurmak faydalı olabilir. Çoğu modern Ubuntu sürümünde bunlar zaten kurulu olsa da, kontrol etmek veya eksikleri tamamlamak için aşağıdaki komutu kullanabilirsiniz:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
Bu paketler, HTTPS üzerinden paket indirme yeteneği, sertifika doğrulama ve yazılım depolarını yönetme gibi işlevler sağlar. Özellikle curl, Docker Compose’u indirmek için sıkça kullanılan bir araçtır.
Docker Engine Kurulumu
Docker Compose’un çalışabilmesi için sisteminizde Docker Engine’in kurulu ve çalışır durumda olması şarttır. Eğer Docker henüz kurulu değilse, aşağıdaki adımları izleyerek kurabilirsiniz. Bu adımlar, Docker’ın resmi deposunu ekleyerek en güncel ve kararlı sürümünü yüklemenizi sağlar.
- Docker GPG anahtarını ekleyin: Bu adım, Docker paketlerinin güvenilirliğini doğrulamak için gereklidir.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg - Docker deposunu ekleyin: Bu komut, Docker paketlerinin bulunduğu depoyu sisteminizin
aptkaynaklarına ekler. Ubuntu sürümünüze uygun depo URL’sini kullanır.echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - Paket listesini güncelleyin: Yeni eklenen depoyu sisteminize tanıtmak için paket listesini tekrar güncellemeniz gerekir.
sudo apt update - Docker Engine’i kurun: Artık Docker Engine ve ilgili araçları yükleyebilirsiniz.
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginBu komut, Docker Engine’in kendisini (
docker-ce), komut satırı arayüzünü (docker-ce-cli), konteyner çalışma zamanını (containerd.io) ve Docker Compose’un yeni eklenti sürümünü (docker-compose-plugin) kurar. Önemli not:docker-compose-plugin, Docker Compose’un eski bağımsız ikili sürümünün yerini alan, Docker CLI’a entegre edilmiş yeni versiyonudur. Bu makalede, bu modern kurulum yöntemine odaklanacağız.
Kurulum tamamlandıktan sonra, Docker servisinin otomatik olarak başlatıldığından emin olun ve durumunu kontrol edin:
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
systemctl status docker komutu, Docker servisinin “active (running)” durumda olduğunu göstermelidir. Ayrıca, Docker’ı sudo kullanmadan çalıştırmak için kullanıcı hesabınızı docker grubuna ekleyebilirsiniz:
sudo usermod -aG docker $USER
newgrp docker
Bu adımları tamamladıktan sonra, oturumu kapatıp tekrar açmanız veya sisteminizi yeniden başlatmanız gerekebilir ki değişiklikler tam olarak uygulansın. Bu ön hazırlıklar, Docker Compose’u sorunsuz bir şekilde kurmanız ve kullanmaya başlamanız için sağlam bir temel oluşturacaktır. Artık Docker ekosistemi için hazırız.
Docker Compose Ubuntu Üzerine Nasıl Yüklenir?
Docker Compose’u Ubuntu sisteminize yüklemenin iki ana yolu vardır: bağımsız ikili dosya olarak veya Docker CLI eklentisi olarak. Docker’ın son sürümleriyle birlikte, Docker Compose artık genellikle bir Docker CLI eklentisi olarak gelir ve bu, önerilen modern yaklaşımdır. Daha önceki bölümde Docker Engine’i kurarken docker-compose-plugin paketini zaten yüklemiştik. Bu, Docker Compose’un en güncel ve entegre edilmiş sürümünü elde ettiğiniz anlamına gelir. Ancak, bazı eski sistemler veya özel gereksinimler için bağımsız ikili dosya kurulumu da hala geçerli olabilir. Bu bölümde her iki yöntemi de detaylıca ele alacağız.
Yöntem 1: Docker CLI Eklentisi Olarak Kurulum (Önerilen)
Docker’ın 1.27.0 sürümünden itibaren Docker Compose, Docker CLI’ın bir parçası haline gelmiştir ve docker compose (boşluklu) şeklinde kullanılır. Eğer Docker Engine kurulumu sırasında docker-compose-plugin paketini yukarıdaki adımları takip ederek kurduysanız, Docker Compose zaten sisteminizde yüklüdür. Bu, kurulumun en basit ve en güncel yoludur.
Bu yöntemin avantajları şunlardır:
- Entegrasyon: Docker CLI ile sorunsuz bir şekilde entegre olur. Komutlar
docker compose ...şeklinde çalışır. - Güncellik: Docker Engine ile birlikte güncellenir, bu da uyumluluk sorunlarını azaltır.
- Basitlik: Tek bir komutla Docker Engine ve Compose eklentisini birlikte kurabilirsiniz.
Kurulumun başarılı olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın:
docker compose version
Bu komut, yüklü Docker Compose eklentisinin sürümünü göstermelidir. Örneğin, Docker Compose version v2.x.x gibi bir çıktı almalısınız. Eğer bu komut çalışıyorsa, Docker Compose’u başarıyla kurdunuz demektir ve bağımsız ikili dosya kurulumuna ihtiyacınız yoktur. Bu modern yaklaşım, gelecekteki Docker geliştirmeleriyle de daha uyumlu olacaktır.
Yöntem 2: Bağımsız İkili Dosya Olarak Kurulum (Eski Yöntem / Alternatif)
Eğer herhangi bir nedenle Docker CLI eklentisini kullanmak istemiyorsanız veya Docker’ın daha eski bir sürümünü kullanıyorsanız, Docker Compose’u bağımsız bir ikili dosya olarak da kurabilirsiniz. Bu yöntem, genellikle docker-compose (tireli) şeklinde komutları çalıştırmanızı sağlar. Bu kurulum, Docker Compose’un belirli bir sürümünü hedeflemeniz gerektiğinde veya Docker Engine’den bağımsız olarak güncellemek istediğinizde faydalı olabilir.
1. Docker Compose’un Son Kararlı Sürümünü İndirme
Docker Compose’un en son kararlı sürümünü GitHub deposundan doğrudan indirebilirsiniz. Sürüm numarasını kontrol etmek için Docker Compose GitHub Releases sayfasını ziyaret edebilirsiniz. Aşağıdaki örnekte, varsayılan olarak en güncel sürümü indirmek için bir değişken kullanacağız, ancak dilerseniz belirli bir sürüm numarasını (örneğin, v1.29.2) doğrudan belirtebilirsiniz.
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
sudo curl -L "https://github.com/docker/compose/releases/download/$COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Bu komutlar:
- İlk satır, GitHub API’sini kullanarak Docker Compose’un en son sürüm numarasını alır ve
COMPOSE_VERSIONdeğişkenine atar. - İkinci satır,
curlkullanarak belirtilen URL’den Docker Compose ikili dosyasını indirir.$(uname -s)işletim sistemi adını (Linux),$(uname -m)ise makine mimarisini (x86_64 gibi) otomatik olarak algılar. İndirilen dosya/usr/local/bin/docker-composekonumuna kaydedilir. Bu konum, sistemin PATH değişkeninde olduğu için komutun her yerden çalıştırılmasını sağlar.
2. Çalıştırma İzni Verme
İndirdiğiniz ikili dosyanın çalıştırılabilir olması için izinleri ayarlamanız gerekir:
sudo chmod +x /usr/local/bin/docker-compose
Bu komut, /usr/local/bin/docker-compose dosyasına çalıştırma izni verir.
3. Kurulumu Doğrulama
Kurulumun başarılı olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın:
docker-compose --version
Bu komut, yüklü Docker Compose sürümünü göstermelidir. Örneğin, docker-compose version 1.29.2, build 5becea4c gibi bir çıktı almalısınız. Eğer bu komut çalışıyorsa, Docker Compose’u bağımsız ikili dosya olarak başarıyla kurdunuz demektir.
Her iki yöntem de Docker Compose’u sisteminize getirecektir. Hangi yöntemi seçerseniz seçin, ana hedefimiz çoklu konteyner uygulamalarını kolayca yönetebilmek ve geliştirme ortamlarımızı standardize etmektir. Bir sonraki adımda, kurulumun doğru yapıldığını nasıl doğrulayacağımızı ve ilk Docker Compose uygulamanızı nasıl çalıştıracağınızı göreceğiz.
Docker Compose Kurulumunu Doğrulama ve İlk Uygulamanızı Çalıştırma
Docker Compose’u Ubuntu sisteminize başarıyla kurduktan sonra, kurulumun doğru bir şekilde yapıldığından emin olmak ve aracın temel işlevselliğini test etmek için birkaç doğrulama adımı atmak önemlidir. Ardından, basit bir örnek uygulama ile Docker Compose’un gücünü ilk elden deneyimleyebiliriz. Bu bölüm, hem kurulumu teyit etmenize hem de Docker Compose ile çalışma mantığını anlamanıza yardımcı olacaktır.
Kurulumun Doğrulanması
Daha önceki bölümde de bahsettiğimiz gibi, Docker Compose’un doğru bir şekilde kurulup kurulmadığını kontrol etmek için sürüm komutunu kullanabilirsiniz. Eğer Docker CLI eklentisi olarak kurduysanız:
docker compose version
Çıktı olarak, örneğin Docker Compose version v2.23.3 gibi bir şey görmelisiniz. Bu, Docker CLI ile entegre olan yeni versiyonun çalıştığını gösterir.
Eğer bağımsız ikili dosya olarak kurduysanız:
docker-compose --version
Bu komut ise docker-compose version 1.29.2, build 5becea4c gibi bir çıktı vermelidir. Bu çıktılar, komutun sisteminizde tanındığını ve bir sürüm bilgisi döndürdüğünü gösterir. Eğer “command not found” (komut bulunamadı) hatası alırsanız, kurulum adımlarını tekrar gözden geçirmeniz veya PATH değişkeninizi kontrol etmeniz gerekebilir.
Ayrıca, Docker’ın kendisinin de düzgün çalıştığından emin olmak için basit bir Docker komutu çalıştırabilirsiniz:
docker run hello-world
Bu komut, Docker’ın temel işlevselliğini test eden küçük bir “hello-world” konteynerini indirip çalıştıracaktır. Eğer her şey yolundaysa, terminalinizde “Hello from Docker!” mesajını içeren bir çıktı görmelisiniz. Bu, Docker Engine’in sorunsuz çalıştığını ve Docker Compose için zemin hazırladığını teyit eder.
Docker Compose ile İlk Uygulamanızı Çalıştırma
Şimdi sıra geldi Docker Compose’un pratikte nasıl kullanıldığına. Basit bir “Web sunucusu ve Redis cache” uygulaması oluşturarak Docker Compose’un çoklu servisleri nasıl yönettiğini görelim. Bu örnek, bir Nginx web sunucusu ve bir Redis in-memory veri yapısı sunucusunu aynı anda çalıştıracak.
1. Proje Dizini Oluşturma
Öncelikle, projeniz için yeni bir dizin oluşturun ve bu dizine geçin:
mkdir my-compose-app
cd my-compose-app
2. docker-compose.yml Dosyası Oluşturma
Bu dizin içinde docker-compose.yml adında bir dosya oluşturun ve aşağıdaki içeriği yapıştırın:
# my-compose-app/docker-compose.yml
version: '3.8' # Docker Compose dosyasının versiyonu
services:
web:
image: nginx:latest # Nginx web sunucusu imajını kullan
ports:
- "80:80" # Host'un 80. portunu konteynerin 80. portuna yönlendir
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro # Kendi nginx.conf dosyamızı bağla
depends_on:
- redis # Web servisi Redis'e bağlıdır, Redis başlamadan web başlamaz
redis:
image: redis:latest # Redis sunucusu imajını kullan
ports:
- "6379:6379" # Host'un 6379. portunu konteynerin 6379. portuna yönlendir
volumes:
- redis_data:/data # Redis verilerini kalıcı depolamak için bir birim (volume) kullan
volumes:
redis_data: # Redis verileri için bir birim tanımla
Bu YAML dosyası iki ana servis tanımlar: web (Nginx) ve redis (Redis). Her servisin hangi Docker imajını kullanacağı, hangi portları dışarıya açacağı ve hangi birimleri (volumes) kullanacağı belirtilmiştir. depends_on anahtarı, web servisinin redis servisi başlatılmadan önce başlamamasını sağlar. volumes bölümü ise Redis verilerinin kalıcı olarak saklanması için bir named volume tanımlar.
3. Nginx Yapılandırma Dosyası Oluşturma
web servisi için özel bir Nginx yapılandırma dosyası (nginx.conf) bağladık. Bu dosyayı da my-compose-app dizini içinde oluşturun:
# my-compose-app/nginx.conf
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
location /redis-status {
# Redis durumunu göstermek için basit bir proxy örneği
# Bu örnekte Redis'in bir HTTP arayüzü olmadığı için doğrudan çalışmaz,
# ancak bir uygulama aracılığıyla Redis'e bağlanılabilir.
# Sadece bir konsepti göstermektedir.
return 200 "Redis is running (simulated)";
add_header Content-Type text/plain;
}
}
}
Bu basit Nginx yapılandırması, gelen istekleri varsayılan HTML dizinine yönlendirir ve /redis-status URL’sine yapılan istekler için basit bir metin yanıtı döner. Bu, Nginx’in çalıştığını ve yapılandırma dosyamızın yüklendiğini test etmek için yeterlidir.
4. Uygulamayı Başlatma
Tüm dosyalar hazır olduğunda, proje dizininizdeyken aşağıdaki komutu çalıştırarak uygulamayı başlatabilirsiniz:
docker compose up -d
Veya eski bağımsız ikili dosya kullanıyorsanız:
docker-compose up -d
up komutu, docker-compose.yml dosyasını okur, gerekli Docker imajlarını (Nginx ve Redis) indirir (eğer yerel olarak mevcut değillerse), servisleri oluşturur ve başlatır. -d bayrağı, konteynerleri arka planda (detached mode) çalıştırmanızı sağlar, böylece terminaliniz serbest kalır.
Konteynerlerin durumunu kontrol etmek için:
docker compose ps
Bu komut, çalışan servisleri ve durumlarını listeler. Her iki servisin de “Up” (çalışıyor) durumda olduğunu görmelisiniz.
5. Uygulamayı Test Etme
Web tarayıcınızı açın ve http://localhost adresine gidin. Nginx’in varsayılan “Welcome to Nginx!” sayfasını görmelisiniz. Bu, Nginx servisinin düzgün çalıştığını ve host makinenizin 80. portuna yönlendirildiğini gösterir.
Uygulamayı durdurmak ve oluşturulan tüm kaynakları (ağlar, birimler hariç konteynerler) kaldırmak için:
docker compose down
Veya bağımsız ikili dosya kullanıyorsanız:
docker-compose down
Eğer birimleri de kaldırmak isterseniz (bu örnekte Redis verileri):
docker compose down --volumes
Bu adımlar, Docker Compose kurulumunuzu doğrulamanın ve çoklu konteyner uygulamalarını yönetmenin temelini oluşturur. Artık Docker Compose’un sisteminizde çalıştığından ve temel bir uygulamayı başarıyla başlatıp durdurabildiğinizden eminsiniz.
Vaka Analizi: Mikroservis Tabanlı Bir Uygulamanın Docker Compose ile Yönetimi
Docker Compose’un gerçek dünya senaryolarında nasıl kullanıldığına dair somut bir örnek, mikroservis tabanlı bir uygulamanın geliştirme ortamını yönetmek olabilir. Bu vaka analizi, Docker Compose’un karmaşık bağımlılıkları ve çoklu servisleri tek bir yapılandırma dosyasıyla nasıl düzenlediğini gösterecektir. Senaryomuz, bir e-ticaret uygulamasının temel bileşenlerinden oluşan bir mikroservis mimarisi olsun: bir ürün kataloğu servisi, bir sipariş yönetimi servisi, bir kullanıcı doğrulama servisi ve bir PostgreSQL veritabanı.
Senaryo: E-ticaret Mikroservisleri Geliştirme Ortamı
Uygulamamızın bileşenleri şunlardır:
- Product Service (Ürün Servisi): Ürün bilgilerini yönetir, kendi veritabanına bağlanır. (Python/Flask)
- Order Service (Sipariş Servisi): Siparişleri işler, ürün servisi ile iletişim kurar ve kendi veritabanına bağlanır. (Node.js/Express)
- Auth Service (Kimlik Doğrulama Servisi): Kullanıcı kimlik bilgilerini yönetir, token üretir. (Go)
- PostgreSQL Database: Hem ürün hem de sipariş servisleri için merkezi bir veritabanı.
- Nginx Gateway: Tüm servisler için ters proxy ve yük dengeleyici görevi görür.
Bu mimaride her servis kendi Docker imajına sahiptir ve kendi bağımlılıkları vardır. Geliştiricilerin bu beş bileşeni manuel olarak kurup yapılandırması, her yeni geliştirici için ciddi bir zaman kaybı ve hata potansiyeli yaratır. Docker Compose bu süreci nasıl basitleştirir?
Docker Compose Yapılandırması (docker-compose.yml)
Aşağıda, bu mikroservis mimarisi için basitleştirilmiş bir docker-compose.yml dosyası örneği bulunmaktadır:
version: '3.8'
services:
# PostgreSQL Veritabanı Servisi
db:
image: postgres:13
restart: always
environment:
POSTGRES_DB: ecommerce_db
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432" # Sadece geliştirme için dışarıya açıldı
# Ürün Servisi (Python/Flask)
product-service:
build: ./product-service # product-service dizinindeki Dockerfile'dan imaj oluştur
ports:
- "5000:5000"
environment:
DATABASE_URL: postgresql://user:password@db:5432/ecommerce_db
depends_on:
- db # Veritabanına bağımlı
# Sipariş Servisi (Node.js/Express)
order-service:
build: ./order-service # order-service dizinindeki Dockerfile'dan imaj oluştur
ports:
- "5001:5001"
environment:
DATABASE_URL: postgresql://user:password@db:5432/ecommerce_db
PRODUCT_SERVICE_URL: http://product-service:5000
depends_on:
- db
- product-service # Ürün servisine bağımlı
# Kimlik Doğrulama Servisi (Go)
auth-service:
build: ./auth-service # auth-service dizinindeki Dockerfile'dan imaj oluştur
ports:
- "5002:5002"
environment:
AUTH_SECRET_KEY: supersecretkey
depends_on:
- db # Veritabanına bağlanabilir (isteğe bağlı)
# Nginx Gateway
nginx:
image: nginx:latest
ports:
- "80:80" # Tüm dış trafik 80. porttan gelir
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro # Özel Nginx yapılandırması
depends_on:
- product-service
- order-service
- auth-service # Tüm servislere bağımlı
volumes:
db_data: # PostgreSQL verileri için kalıcı birim
Vaka Analizinin Faydaları ve Çözümleri
Bu docker-compose.yml dosyası, yukarıdaki karmaşık mikroservis mimarisini tek bir dosya içinde tanımlayarak geliştirme ortamı kurulumunu inanılmaz derecede basitleştirir. İşte sağladığı faydalar:
- Tek Komutla Ortam Kurulumu: Yeni bir geliştirici, repoyu klonladıktan sonra sadece
docker compose up -dkomutunu çalıştırarak tüm mikroservisleri ve veritabanını içeren eksiksiz bir geliştirme ortamını saniyeler içinde ayağa kaldırabilir. Bu, “benim makinemde çalışıyor” sorununu ortadan kaldırır ve onboarding sürecini hızlandırır. - Servisler Arası İletişim: Docker Compose, aynı ağ üzerinde çalışan servislerin birbirleriyle isimleriyle iletişim kurmasını sağlar. Örneğin,
order-service,http://product-service:5000adresindenproduct-service‘e erişebilir. Bu, ağ yapılandırmasıyla uğraşma ihtiyacını ortadan kaldırır. - Bağımlılık Yönetimi:
depends_onanahtarı, servisler arasındaki başlatma sırasını belirler. Örneğin,product-service‘indbservisi başlamadan önce başlamamasını garanti eder. Bu, servislerin doğru sırada başlatılmasını ve hata olasılığının azalmasını sağlar. - Kalıcı Veri Depolama:
volumeskullanımı (db_dataörneğinde olduğu gibi), konteynerler silinse bile veritabanı verilerinin kalıcı olmasını sağlar. Bu, geliştiricilerin veri kaybetme endişesi olmadan konteynerleri yeniden oluşturmasına olanak tanır. - Özelleştirilmiş Yapılandırmalar: Nginx için özel bir
nginx.confdosyası bağlamak gibi, servislerin özel yapılandırma dosyalarını da kolayca entegre edebilirsiniz. Bu, esneklik ve özelleştirme imkanı sunar. - Versiyon Kontrolü:
docker-compose.ymldosyası, projenin kaynak koduyla birlikte versiyon kontrol sisteminde (Git gibi) saklanabilir. Bu, ortam yapılandırmasının takip edilebilir, geri alınabilir ve ekip üyeleri arasında tutarlı olmasını sağlar.
Bu vaka analizi, Docker Compose’un sadece basit uygulamalar için değil, aynı zamanda birden fazla servisi ve bağımlılığı olan karmaşık mikroservis mimarilerinin geliştirme ortamlarını yönetmek için de ne kadar güçlü ve vazgeçilmez bir araç olduğunu göstermektedir. Geliştirici verimliliğini artırırken, tutarlılığı ve tekrarlanabilirliği garantiler.
İleri Düzey İpuçları ve Optimizasyonlar: Docker Compose’dan Daha Fazlasını Almak
Docker Compose’u temel seviyede kurup kullanmayı öğrendikten sonra, geliştirme ve hatta küçük ölçekli üretim ortamlarınızda daha verimli ve güçlü hale getirmek için bazı ileri düzey ipuçları ve optimizasyonlardan faydalanabilirsiniz. Bu bölüm, Docker Compose deneyiminizi bir üst seviyeye taşıyacak pratik bilgiler sunacaktır.
1. Ortam Değişkenleri ile Dinamik Yapılandırma
docker-compose.yml dosyanızda hassas bilgiler (veritabanı şifreleri, API anahtarları) veya ortama özgü değerler (port numaraları) bulundurmak yerine, ortam değişkenlerini kullanmak daha güvenli ve esnektir. Docker Compose, .env dosyasından veya shell ortamından değişkenleri otomatik olarak yükleyebilir.
# .env dosyası
DB_PASSWORD=mysecretpassword
APP_PORT=8080
# docker-compose.yml içinde kullanım
version: '3.8'
services:
app:
image: myapp:latest
ports:
- "${APP_PORT}:80" # APP_PORT değeri .env dosyasından alınır
environment:
DATABASE_URL: postgresql://user:${DB_PASSWORD}@db:5432/myapp_db
Bu yöntem, aynı docker-compose.yml dosyasını farklı ortamlar (geliştirme, test, üretim) için farklı yapılandırmalarla kullanmanıza olanak tanır. Hassas verileri versiyon kontrolüne eklememek için .env dosyasını .gitignore‘a eklemeyi unutmayın.
2. Çoklu Docker Compose Dosyaları ile Ortam Ayrımı
Farklı ortamlar için (geliştirme, test, üretim) veya farklı özellik setleri için (örneğin, test için ek bir test veritabanı) birden fazla docker-compose.yml dosyası kullanabilirsiniz. Bu, ana yapılandırma dosyasını temiz tutarken, ortama özgü değişiklikleri ayrı dosyalarda yönetmenizi sağlar.
# docker-compose.yml (Temel yapılandırma)
version: '3.8'
services:
web:
image: myapp:latest
ports:
- "80:80"
db:
image: postgres:13
# docker-compose.dev.yml (Geliştirme için ek ayarlar)
version: '3.8'
services:
web:
build: . # Geliştirmede yerel kodu build et
volumes:
- .:/app # Kod değişikliklerinin anında yansıması için
environment:
DEBUG: 'true'
db:
ports:
- "5432:5432" # Geliştirmede DB'ye dışarıdan erişim
Bu dosyaları birlikte kullanmak için -f bayrağını kullanın:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
Docker Compose, dosyaları soldan sağa doğru birleştirir, yani sağdaki dosyadaki ayarlar soldakileri geçersiz kılar. Bu, çok esnek bir yapılandırma stratejisi sunar.
3. Sağlık Kontrolleri (Healthchecks)
depends_on anahtarı sadece bir servisin başlamasını bekler, ancak o servisin tamamen “hazır” olmasını garanti etmez (örneğin, bir veritabanı konteyneri başlamış olabilir ama bağlantıları kabul etmeye henüz hazır olmayabilir). Daha sağlam bir uygulama başlatma sırası için sağlık kontrollerini kullanın.
services:
db:
image: postgres:13
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d ecommerce_db"] # DB hazır mı kontrol et
interval: 5s
timeout: 5s
retries: 5
# ... diğer ayarlar ...
app:
image: myapp:latest
depends_on:
db:
condition: service_healthy # db servisi sağlıklı olana kadar bekle
# ... diğer ayarlar ...
Bu sayede app servisi, db servisi sadece başlatılmakla kalmayıp, aynı zamanda bağlantıları kabul etmeye hazır olduğunda başlayacaktır. Bu, üretim ortamına yakın bir davranış sağlar.
4. Kaynak Sınırlamaları ve Yeniden Başlatma Politikaları
Konteynerlerinizin sistem kaynaklarını (CPU, bellek) aşırı kullanmasını önlemek ve kararlılıklarını artırmak için kaynak sınırlamaları ve yeniden başlatma politikaları belirleyebilirsiniz.
services:
web:
image: myapp:latest
deploy:
resources:
limits:
cpus: '0.5' # Yarım CPU çekirdeği
memory: 512M # 512 MB bellek
restart_policy:
condition: on-failure # Hata durumunda yeniden başlat
deploy anahtarı, Docker Swarm modunda dağıtım için daha fazla seçenek sunsa da, resources ve restart_policy gibi bazı ayarlar Docker Compose ile de kullanılabilir ve konteynerlerinizi daha yönetilebilir hale getirir.
5. Performans İpuçları
- Named Volumes Kullanın: Kalıcı veri depolama için bind mount yerine named volumes kullanmak genellikle daha performanslıdır ve Docker tarafından daha iyi yönetilir.
- Gereksiz İmaj Katmanlarından Kaçının:
Dockerfile‘larınızı optimize ederek gereksiz katmanları azaltın. HerRUNkomutu yeni bir katman oluşturur. Çoklu komutları tek birRUNiçinde birleştirmek imaj boyutunu ve build süresini azaltabilir. .dockerignoreKullanın:.dockerignoredosyası, Docker imajı oluşturulurken gereksiz dosyaların (node_modules,.git,.envvb.) bağlam (context) dizinine kopyalanmasını engeller. Bu, build hızını artırır ve imaj boyutunu küçültür.
Bu ileri düzey ipuçları ve optimizasyonlar, Docker Compose’u sadece bir başlatma aracı olmaktan çıkarıp, karmaşık uygulama mimarilerini yönetmek için güçlü bir platforma dönüştürmenize yardımcı olacaktır. Dinamik yapılandırmadan sağlık kontrollerine, her bir adım uygulamanızın daha sağlam, güvenli ve performanslı olmasını sağlayacaktır.
Sonuç ve Sıkça Sorulan Sorular
Bu kapsamlı rehber boyunca, Ubuntu işletim sistemi üzerinde Docker Compose’u kurmanın ve yönetmenin tüm adımlarını detaylı bir şekilde inceledik. Modern yazılım geliştirmenin temel taşlarından biri haline gelen konteynerizasyon ve orkestrasyonun ne denli önemli olduğunu, Docker Compose’un ise çoklu konteyner uygulamalarını geliştirme ve dağıtma süreçlerini nasıl basitleştirdiğini gördük. İlk olarak Docker Compose’un temel kavramlarını ve neden bu araca ihtiyaç duyduğumuzu anladık. Ardından, Ubuntu sistemimizi güncelleyerek ve Docker Engine’i kurarak gerekli ön hazırlıkları tamamladık. Docker Compose’un hem Docker CLI eklentisi olarak hem de bağımsız bir ikili dosya olarak nasıl kurulacağını adım adım öğrendik ve kurulumu doğrulamak için pratik testler yaptık. Bir Nginx ve Redis örneği ile ilk çoklu konteyner uygulamamızı çalıştırdık. Mikroservis tabanlı bir e-ticaret uygulamasının geliştirme ortamının Docker Compose ile nasıl yönetilebileceğine dair bir vaka analizi yaparak gerçek dünya senaryolarında sağladığı faydaları somutlaştırdık. Son olarak, ortam değişkenleri, çoklu yapılandırma dosyaları, sağlık kontrolleri ve performans optimizasyonları gibi ileri düzey ipuçlarıyla Docker Compose deneyiminizi zenginleştirmenin yollarını keşfettik.
Docker Compose, geliştirici verimliliğini artırmanın, tutarlı geliştirme ortamları sağlamanın ve karmaşık uygulamaların yönetimini basitleştirmenin anahtarıdır. Bu rehberdeki bilgileri kullanarak, Ubuntu sunucunuzda güçlü ve esnek bir konteyner ortamı kurabilir ve projelerinizi bir sonraki seviyeye taşıyabilirsiniz. Unutmayın, pratik yapmak ve farklı senaryoları denemek, bu araçta ustalaşmanın en iyi yoludur.
Sıkça Sorulan Sorular (SSS)
-
Docker Compose ve Docker Swarm arasındaki fark nedir?
Docker Compose, tek bir ana bilgisayarda (host) birden fazla Docker konteynerini tanımlamak ve çalıştırmak için kullanılır. Genellikle geliştirme ve test ortamları için idealdir. Docker Swarm ise, birden fazla Docker ana bilgisayarını (düğümleri) bir araya getirerek bir küme (cluster) oluşturur ve konteynerleri bu küme üzerinde dağıtılmış bir şekilde yönetir. Swarm, üretim ortamlarında yüksek erişilebilirlik ve ölçeklenebilirlik sağlamak için kullanılır. Docker Compose dosyaları genellikle Docker Swarm’da da kullanılabilir.
-
docker composevedocker-composearasındaki fark nedir?docker-compose(tireli), Docker Compose’un bağımsız ikili dosya olarak kurulan eski sürümüdür.docker compose(boşluklu) ise Docker’ın 1.27.0 sürümünden itibaren Docker CLI’ın bir parçası olarak entegre edilen yeni eklenti sürümüdür. Yeni projeler ve kurulumlar içindocker composekullanılması önerilir çünkü Docker CLI ile daha iyi entegrasyon ve güncel özellikler sunar. -
Docker Compose ile üretimde uygulama dağıtımı yapılabilir mi?
Evet, küçük ve orta ölçekli uygulamalar veya mikroservislerin geliştirme ortamları için Docker Compose mükemmeldir. Hatta daha küçük ölçekli, tek sunuculu üretim ortamlarında da kullanılabilir. Ancak, yüksek erişilebilirlik, otomatik ölçeklendirme, yük dengeleme ve sıfır kesintiyle güncelleme gibi özellikler gerektiren büyük ölçekli ve kritik üretim ortamları için Kubernetes, Docker Swarm veya Amazon ECS gibi daha gelişmiş konteyner orkestrasyon araçları tercih edilmelidir.
-
docker-compose.ymldosyasında hangi versiyonu kullanmalıyım?Genellikle en son kararlı versiyonu kullanmanız önerilir. Bu makalede
version: '3.8'kullandık, bu en yaygın ve güncel versiyonlardan biridir ve birçok yeni özelliği destekler. Docker Compose versiyonları ve destekledikleri özellikler hakkında daha fazla bilgi için Docker’ın resmi belgelerine bakabilirsiniz. -
Docker Compose servisleri arasında nasıl iletişim kurabilirim?
Docker Compose, varsayılan olarak tüm servislerinizi aynı özel bir ağ üzerinde başlatır. Bu ağ sayesinde servisler birbirleriyle isimleri üzerinden iletişim kurabilirler. Örneğin,
webservisi,dbservisine bağlanmak içindb:5432gibi bir adres kullanabilir. Harici IP adresleri veya karmaşık ağ yapılandırmalarıyla uğraşmanıza gerek kalmaz.
