Docker Compose Kurulumu ve Kullanımı: CentOS 7 Üzerinde Adım Adım Rehber
Modern uygulama geliştirme süreçlerinde, çok sayıda servisi bir arada yönetmek karmaşık bir hal alabilir. Bu rehberde, CentOS 7 işletim sistemi üzerinde Docker Compose’u nasıl kuracağınızı ve kullanarak çok kapsayıcılı uygulamalarınızı kolayca nasıl yöneteceğinizi adım adım öğreneceksiniz. Docker Compose, uygulama geliştiricilerin ve DevOps mühendislerinin hayatını kolaylaştıran güçlü bir araçtır; gelin, bu aracı yakından tanıyalım ve pratik uygulamalarla yeteneklerini keşfedelim.
Docker Compose Neden Bu Kadar Önemli?
Günümüzün bulut tabanlı ve mikroservis mimarili uygulamaları, genellikle birden fazla bağımsız servisten oluşur. Bir web uygulaması düşünün: muhtemelen bir veritabanına (PostgreSQL, MySQL), bir önbellek katmanına (Redis), bir arka uç API servisine (Node.js, Python, Java) ve bir web sunucusuna (Nginx, Apache) ihtiyaç duyar. Bu servislerin her birini ayrı ayrı kurmak, yapılandırmak ve yönetmek, özellikle geliştirme ve test süreçlerinde ciddi bir zaman ve emek kaybına yol açabilir. Her geliştiricinin kendi makinesinde aynı ortamı kurmaya çalışması, “benim makinemde çalışıyor” sorunlarının temelini oluşturur ve dağıtım süreçlerini yavaşlatır.
İşte tam bu noktada Docker ve onun tamamlayıcısı Docker Compose devreye giriyor. Docker, uygulamaları ve bağımlılıklarını izole edilmiş, hafif “kapsayıcılar” (containers) içinde paketleyerek her ortamda tutarlı bir şekilde çalışmalarını sağlar. Ancak tek başına Docker, birden fazla kapsayıcıyı bir arada, uyumlu bir şekilde yönetmek için yeterli değildir. Her bir kapsayıcıyı tek tek başlatmak, ağlarını yapılandırmak ve aralarındaki bağlantıları kurmak manuel olarak yapıldığında yine zahmetli bir süreçtir.
Docker Compose, bu karmaşıklığı ortadan kaldıran bir orkestrasyon aracıdır. Tek bir YAML dosyası kullanarak uygulamanızın tüm servislerini, ağlarını ve depolama birimlerini tanımlamanıza olanak tanır. Bu sayede, tüm uygulama yığınını tek bir komutla ayağa kaldırabilir, durdurabilir veya yeniden başlatabilirsiniz. Bu yaklaşım, özellikle geliştirme ortamlarında tutarlılık sağlamak, yeni ekip üyelerinin projeye hızlıca adapte olmasını kolaylaştırmak ve test süreçlerini standartlaştırmak açısından hayati öneme sahiptir. Ayrıca, üretim ortamlarında da küçük ölçekli dağıtımlar için oldukça pratik bir çözüm sunar.
Docker Compose’un sağladığı en büyük avantajlardan biri, “yapılandırma olarak kod” (configuration as code) prensibini benimsemesidir. Uygulamanızın altyapı tanımı versiyon kontrol sistemlerinde (Git gibi) saklanabilir, böylece değişiklikler takip edilebilir ve geri alınabilir. Bu, ekipler arasında işbirliğini güçlendirir ve dağıtım süreçlerini otomatize eder. Özetle, Docker Compose modern yazılım geliştirme pratiklerinin vazgeçilmez bir parçasıdır ve çok kapsayıcılı uygulamaların yönetimini basitleştirerek geliştirme hızını ve verimliliği artırır.
Docker ve Docker Compose: Temel Kavramlara Hızlı Bir Bakış
Docker Compose’a derinlemesine dalmadan önce, temel aldığı Docker teknolojisini ve Docker Compose’un tam olarak ne anlama geldiğini anlamak büyük önem taşımaktadır. Bu bölümde, her iki kavramı da açıklayarak zihinsel bir temel oluşturacağız.
Docker Nedir?
Docker, uygulamaları ve bağımlılıklarını izole edilmiş, taşınabilir ve hafif sanal ortamlar olan “kapsayıcılar” içinde paketlemeye yarayan açık kaynaklı bir platformdur. Geleneksel sanal makinelerin (VM) aksine, kapsayıcılar kendi işletim sistemlerini içermezler; bunun yerine ana makinenin çekirdeğini (kernel) paylaşırlar. Bu durum, kapsayıcıları çok daha hafif, hızlı başlatılabilir ve kaynak açısından verimli kılar.
Docker ekosistemi temel olarak üç ana bileşenden oluşur:
- Docker Engine: Docker kapsayıcılarını oluşturan ve çalıştıran ana yazılımdır. Sunucu üzerinde çalışan bir daemon (dockerd) ve kullanıcıların daemon ile etkileşim kurmasını sağlayan bir CLI (docker) içerir.
- Docker Image (Kapsayıcı Kalıbı): Bir uygulamanın çalışması için gerekli tüm kodları, çalışma zamanını, sistem araçlarını, sistem kütüphanelerini ve ayarları içeren salt okunur bir şablondur. Bir imaj, bir veya daha fazla katmandan oluşur ve bu katmanlar, imajın verimliliğini ve yeniden kullanılabilirliğini artırır. Örneğin, bir Ubuntu imajının üzerine Python ve ardından uygulamanızın kodunu içeren katmanlar eklenebilir.
- Docker Container (Kapsayıcı): Bir Docker imajının çalıştırılabilir bir örneğidir. Kapsayıcılar, imajdan türetilir ve çalıştırıldıklarında izole edilmiş bir ortamda bağımsız bir süreç olarak çalışırlar. Her kapsayıcının kendine ait bir dosya sistemi, ağ arayüzü ve işlem alanı vardır. Bu izolasyon sayesinde, farklı uygulamalar aynı sunucu üzerinde çakışmadan çalışabilir.
Docker’ın temel amacı, “bir kez inşa et, her yerde çalıştır” felsefesini hayata geçirmektir. Geliştirme ortamında oluşturulan bir Docker imajı, test, hazırlık ve üretim ortamlarında aynı şekilde çalışacak ve böylece tutarlılık sorunlarını ortadan kaldıracaktır.
Docker Compose Nedir ve Ne İşe Yarar?
Docker Compose, birden fazla Docker kapsayıcısını içeren uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. Docker Engine’in üzerine inşa edilmiştir ve tek bir YAML dosyası kullanarak uygulamanızın tüm servislerini (veritabanı, ön uç, arka uç vb.), ağlarını ve depolama birimlerini (volumes) yapılandırmanıza olanak tanır.
Docker Compose’un temel işlevleri şunlardır:
- Servis Tanımlama: Uygulamanızdaki her bir servisi (örneğin, web sunucusu, veritabanı, cache) hangi Docker imajını kullanacağı, hangi portları açacağı, hangi çevresel değişkenleri alacağı gibi detaylarla birlikte tanımlamanızı sağlar.
- Ağ Yönetimi: Servisler arası iletişimi sağlamak için özel ağlar oluşturabilir ve kapsayıcıları bu ağlara bağlayabilirsiniz. Bu sayede servisler birbirleriyle isimleri üzerinden kolayca iletişim kurabilirler.
- Depolama Yönetimi: Kapsayıcılar silindiğinde verilerin kaybolmaması için kalıcı depolama birimleri (volumes) tanımlamanıza olanak tanır. Bu, özellikle veritabanları gibi durum bilgisi olan servisler için hayati öneme sahiptir.
- Tek Komutla Yönetim: Tüm tanımlamalar
docker-compose.ymldosyasında yapıldıktan sonra, tek birdocker-compose upkomutuyla tüm servisleri başlatabilir,docker-compose downile durdurabilir ve silebilirsiniz. Bu, karmaşık çok kapsayıcılı uygulamaların yönetimini son derece basitleştirir.
Özetle, Docker Compose, Docker’ın tek kapsayıcı yönetim yeteneğini alıp, onu çok kapsayıcılı, karmaşık uygulamaların yönetimi için güçlü ve kullanıcı dostu bir çözüme dönüştürür. Bu sayede geliştiriciler, altyapı karmaşıklığı yerine uygulama mantığına odaklanabilirler.
CentOS 7 Üzerine Docker Kurulumu: Ön Hazırlıklar
Docker Compose’u kullanabilmek için öncelikle sisteminizde Docker Engine’in kurulu olması gerekmektedir. Bu bölümde, CentOS 7 işletim sistemi üzerinde Docker’ı nasıl kuracağınızı adım adım açıklayacağız. Bu adımlar, Docker’ın resmi belgelerine uygun olarak en güncel ve güvenli kurulum yöntemini izleyecektir. Başlamadan önce, bir CentOS 7 sunucusuna root veya sudo ayrıcalıklarına sahip bir kullanıcı ile erişiminizin olduğundan emin olun.
Gerekli Paketlerin Yüklenmesi
Docker kurulumuna başlamadan önce, bazı yardımcı paketlerin ve Docker’ın resmi deposunu sisteme eklememiz gerekmektedir. Bu, Docker paketlerinin doğru bir şekilde indirilip kurulmasını sağlayacaktır.
İlk olarak, yum-utils paketini kurarak yum-config-manager yardımcı programını edinmeliyiz. Bu araç, YUM depolarını kolayca yönetmemizi sağlar. Ayrıca, device-mapper-persistent-data ve lvm2 paketleri de Docker için gerekli olan depolama sürücülerini desteklemek amacıyla kurulmalıdır.
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
Bu komut, gerekli paketleri indirip kuracaktır. Kurulum tamamlandıktan sonra, Docker’ın resmi deposunu sisteminize eklememiz gerekiyor. Bu depo, en güncel Docker sürümlerini barındırır.
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Depo başarıyla eklendikten sonra, Docker Engine’i ve ilgili bileşenlerini (Docker CLI, containerd ve Docker Compose plugin – eski versiyonlar için değil) kurabiliriz. Ancak bu makalede Docker Compose’u ayrı olarak kuracağımız için sadece Docker Engine’i kuracağız.
sudo yum install -y docker-ce docker-ce-cli containerd.io
Bu komut, Docker Engine, CLI aracı ve containerd çalışma zamanını kuracaktır. Kurulum işlemi biraz zaman alabilir, sisteminizin internet hızına bağlı olarak değişebilir.
Docker Daemon’ın Başlatılması ve Etkinleştirilmesi
Docker paketleri kurulduktan sonra, Docker servisinin (daemon) başlatılması ve sistem her açıldığında otomatik olarak çalışacak şekilde etkinleştirilmesi gerekmektedir. Bu adımlar, Docker’ın sürekli olarak arka planda çalışmasını ve kapsayıcıları yönetmeye hazır olmasını sağlar.
Docker servisini başlatmak için aşağıdaki komutu kullanın:
sudo systemctl start docker
Servisin başarıyla başlatıldığını doğrulamak için durumunu kontrol edebilirsiniz:
sudo systemctl status docker
Çıktıda “active (running)” ifadesini görmeniz, Docker servisinin düzgün çalıştığını gösterir.
Şimdi, Docker’ın sistem yeniden başlatıldığında otomatik olarak başlamasını sağlamak için etkinleştirelim:
sudo systemctl enable docker
Bu komut, Docker servisi için uygun symlink’leri oluşturarak sistem başlangıcında otomatik olarak yüklenmesini garantiler.
Kullanıcı İzinlerinin Yapılandırılması
Varsayılan olarak, Docker komutlarını çalıştırmak için root ayrıcalıklarına (sudo) ihtiyacınız vardır. Ancak, her seferinde sudo yazmak hem pratik değildir hem de güvenlik açısından bazı riskler taşıyabilir. Bu durumu aşmak için, mevcut kullanıcınızı docker grubuna ekleyebilirsiniz. Bu sayede, kullanıcınız sudo kullanmadan Docker komutlarını çalıştırabilir.
Kullanıcınızı docker grubuna eklemek için aşağıdaki komutu kullanın (<kullanici_adiniz> yerine kendi kullanıcı adınızı yazın):
sudo usermod -aG docker <kullanici_adiniz>
Bu değişikliğin etkili olması için oturumu kapatıp tekrar açmanız veya aşağıdaki komutu kullanarak mevcut oturumunuzu yeniden yüklemeniz gerekebilir:
newgrp docker
Artık Docker kurulumunuz tamamlanmıştır. Kurulumun doğru yapıldığından emin olmak için basit bir test kapsayıcısı çalıştırabilirsiniz:
docker run hello-world
Bu komut, bir “hello-world” imajını indirip bir kapsayıcıda çalıştıracak ve başarılı bir mesaj döndürecektir. Bu mesajı gördüğünüzde, Docker Engine’in CentOS 7 sisteminizde başarıyla çalıştığını anlayabilirsiniz. Bir sonraki adımda, Docker Compose’u kurmaya hazırız.
CentOS 7 Üzerine Docker Compose Kurulumu: Adım Adım Kılavuz
Docker Engine kurulumunu başarıyla tamamladıktan sonra, çok kapsayıcılı uygulamalarınızı yönetmek için vazgeçilmez bir araç olan Docker Compose’u CentOS 7 sisteminize kurmaya geçebiliriz. Docker Compose, Docker Engine’in bir parçası değildir ve ayrı olarak kurulması gerekir. Genellikle bir Python paketi olarak veya doğrudan bir binary dosya olarak dağıtılır. CentOS 7 üzerinde en yaygın ve önerilen yöntem, Docker Compose binary dosyasını GitHub üzerinden indirmek ve çalıştırılabilir hale getirmektir.
Docker Compose Binary İndirme
Docker Compose’un en güncel ve kararlı sürümünü indirmek için GitHub depolarını kullanacağız. İndirme işlemi için curl komutunu ve ardından indirilen dosyayı doğru konuma yerleştirmek için sudo mv komutunu kullanacağız. Bu işlem, Docker Compose’u sisteminizin PATH’inde erişilebilir bir yere yerleştirmenizi sağlar.
İlk olarak, Docker Compose’un hangi sürümünü kurmak istediğinize karar vermelisiniz. Genellikle en son kararlı sürümü kullanmak en iyisidir. Docker Compose’un GitHub yayınlar sayfasını (https://github.com/docker/compose/releases) ziyaret ederek en güncel sürüm numarasını kontrol edebilirsiniz. Bu rehber yazıldığı sırada, örneğin 1.29.2 veya daha yeni bir sürüm kararlı olarak kabul edilebilir. Aşağıdaki örnekte 1.29.2 sürümünü kullanacağız, ancak siz kendi tercihinize göre güncelleyebilirsiniz:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Bu komutun açıklaması:
sudo curl -L:curlkomutunu kullanarak dosyayı indirir.-Lbayrağı, yönlendirmeleri (redirects) takip etmesini sağlar."https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)": İndirilecek Docker Compose binary dosyasının URL’sidir.$(uname -s)sistem çekirdeği adını (örneğin Linux),$(uname -m)ise makine donanım adını (örneğin x86_64) otomatik olarak algılar ve doğru binary dosyasını indirmeyi sağlar.-o /usr/local/bin/docker-compose: İndirilen dosyayı/usr/local/bin/docker-composeyoluna kaydeder. Bu dizin, sistem PATH’inde yer aldığından,docker-composekomutunu herhangi bir yerden çalıştırabilmenizi sağlar.
İndirme işlemi tamamlandıktan sonra, dosyanın doğru bir şekilde indirildiğinden emin olmak için dosya boyutunu kontrol edebilirsiniz. Herhangi bir hata oluşursa veya dosya boyutu beklenenden küçükse, indirme işlemi başarısız olmuş olabilir.
Yürütülebilir İzinlerin Verilmesi
İndirdiğiniz Docker Compose binary dosyası, varsayılan olarak yürütülebilir (executable) izne sahip değildir. Bu nedenle, onu bir program olarak çalıştırabilmek için bu izni manuel olarak vermemiz gerekmektedir. Bu adım, Linux sistemlerinde güvenlik ve dosya yönetimi açısından kritik öneme sahiptir.
Aşağıdaki komutu kullanarak /usr/local/bin/docker-compose dosyasına yürütülebilir izinleri verin:
sudo chmod +x /usr/local/bin/docker-compose
chmod +x komutu, belirtilen dosyaya yürütme izni ekler. Bu işlemden sonra, sisteminiz artık docker-compose komutunu tanıyacak ve çalıştırabilecektir.
Kurulumun Doğrulanması
Docker Compose kurulumunun başarılı olup olmadığını kontrol etmek için basit bir komut çalıştırabiliriz. Bu komut, yüklü Docker Compose sürümünü gösterecektir.
docker-compose --version
Eğer kurulum başarılıysa, çıktı olarak şuna benzer bir sonuç görmelisiniz:
docker-compose version 1.29.2, build 5bd4ae9b
Gördüğünüz sürüm numarası, indirdiğiniz sürüme göre değişiklik gösterebilir. Eğer bu komut bir hata döndürürse (örneğin, “command not found”), yukarıdaki adımları dikkatlice tekrar kontrol etmeniz gerekebilir. Özellikle indirme URL’sinin doğru olduğundan ve yürütülebilir izinlerin verildiğinden emin olun.
Bu adımlarla birlikte, CentOS 7 sisteminizde Docker Compose başarıyla kurulmuş ve kullanıma hazır hale gelmiştir. Artık çok kapsayıcılı uygulamalarınızı tanımlamak ve yönetmek için bu güçlü aracı kullanmaya başlayabilirsiniz.
Docker Compose ile İlk Uygulamanızı Çalıştırma: Gerçek Dünya Senaryosu
Docker Compose’u kurduğunuza göre, şimdi sıra geldi onu gerçek bir senaryoda kullanarak çok kapsayıcılı bir uygulamayı nasıl yöneteceğinizi öğrenmeye. Bu bölümde, popüler bir web sunucusu olan Nginx ile bir PostgreSQL veritabanını bir araya getiren basit bir uygulama yığını oluşturacağız. Bu örnek, modern web uygulamalarının temel bir yapısını temsil eder ve Docker Compose’un gücünü anlamanıza yardımcı olacaktır.
Basit Bir Nginx ve PostgreSQL Uygulaması
Senaryomuz şöyle: Bir web uygulaması geliştiriyorsunuz ve bu uygulama hem bir web sunucusuna (Nginx) hem de kalıcı veri depolaması için bir veritabanına (PostgreSQL) ihtiyaç duyuyor. Geliştirme ortamınızda bu iki servisi kolayca ayağa kaldırmak ve aralarında iletişimi sağlamak istiyorsunuz. Docker Compose, tam da bu ihtiyaca yönelik ideal bir çözümdür.
Nginx, gelen HTTP isteklerini karşılayacak ve belki de statik dosyaları sunacak veya arka uç uygulamasına yönlendirme yapacaktır. PostgreSQL ise uygulamanızın tüm verilerini güvenli bir şekilde depolayacaktır. Bu iki servisin bağımsız kapsayıcılarda çalışmasını sağlayacak ve Docker Compose ile bunları tek bir uygulama olarak yöneteceğiz.
docker-compose.yml Dosyasının Oluşturulması
Docker Compose’un kalbi, uygulamanızın servislerini tanımladığınız docker-compose.yml dosyasıdır. Bu YAML dosyası, uygulamanızın mimarisini deklaratif bir şekilde belirtir. Yeni bir dizin oluşturarak başlayın ve bu dizinin içine docker-compose.yml adında bir dosya oluşturun:
mkdir my-nginx-pg-app
cd my-nginx-pg-app
nano docker-compose.yml
Aşağıdaki içeriği docker-compose.yml dosyasına yapıştırın:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
depends_on:
- db
networks:
- app_network
db:
image: postgres:13
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- app_network
volumes:
db_data:
networks:
app_network:
driver: bridge
Bu dosyanın detaylı açıklaması:
version: '3.8': Docker Compose dosya formatının versiyonunu belirtir. En son stabil versiyonu kullanmak iyi bir uygulamadır.services:: Uygulamanızdaki tüm servisleri tanımladığınız ana bölümdür.web:: Nginx web sunucusunu temsil eden servisimizdir.image: nginx:latest: Nginx’in en son stabil imajını kullanmasını söyler.ports: - "80:80": Host makinenin 80. portunu kapsayıcının 80. portuna yönlendirir. Böylece web tarayıcınızdan Nginx’e erişebilirsiniz.volumes:: Kalıcı depolama ve yapılandırma dosyalarını yönetir../nginx.conf:/etc/nginx/nginx.conf: Yerel dizininizdekinginx.confdosyasını Nginx kapsayıcısının yapılandırma dosyası olarak bağlar../html:/usr/share/nginx/html: Yerel dizininizdekihtmlklasörünü Nginx’in statik dosyaları sunacağı dizine bağlar.
depends_on: - db:webservisinindbservisi başlamadan önce başlamamasını sağlar. Bu, servisler arası bağımlılıkları yönetmek için kullanışlıdır.networks: - app_network:webservisiniapp_networkadlı özel ağa bağlar.
db:: PostgreSQL veritabanını temsil eden servisimizdir.image: postgres:13: PostgreSQL’in 13. versiyon imajını kullanır.environment:: Kapsayıcıya çevresel değişkenler aktarır. PostgreSQL için veritabanı adı, kullanıcı adı ve şifre gibi kritik bilgileri bu şekilde ayarlıyoruz.volumes: - db_data:/var/lib/postgresql/data: PostgreSQL verilerinin kalıcı olması içindb_dataadında bir isimlendirilmiş volume (named volume) bağlar. Kapsayıcı silinse bile verileriniz bu volume’de kalır.networks: - app_network:dbservisiniapp_networkadlı özel ağa bağlar.
volumes: db_data::db_dataadında bir isimlendirilmiş volume tanımlar. Docker, bu volume’ü otomatik olarak yönetir.networks: app_network: driver: bridge:app_networkadında özel bir bridge ağı tanımlar. Bu ağ,webvedbservislerinin birbirleriyle isimleri üzerinden iletişim kurmasını sağlar.
Bu dosya ile birlikte, Nginx için basit bir varsayılan sayfa ve yapılandırma dosyasına da ihtiyacımız var. my-nginx-pg-app dizini içinde aşağıdaki dosyaları oluşturun:
nginx.conf:
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
# PostgreSQL'e doğrudan erişim sağlamıyoruz, bu sadece bir örnek.
# Genellikle uygulama sunucusu veritabanı ile konuşur.
# location /api {
# proxy_pass http://db:5432; # Bu doğrudan çalışmaz, sadece bir fikir.
# }
}
}
html/index.html:
mkdir html
nano html/index.html
Merhaba! Nginx ve PostgreSQL Çalışıyor!
Bu sayfa Docker Compose ile ayağa kaldırılan Nginx tarafından sunulmaktadır.
Veritabanı bağlantısı arka planda aktif.
Uygulamayı Başlatma ve Yönetme
Tüm dosyalarımızı oluşturduktan sonra, uygulamayı başlatmak inanılmaz derecede kolaydır. my-nginx-pg-app dizininde olduğunuzdan emin olun ve aşağıdaki komutu çalıştırın:
docker-compose up -d
Bu komutun açıklaması:
docker-compose up:docker-compose.ymldosyasında tanımlanan tüm servisleri oluşturur ve başlatır.-d: “detached” mod anlamına gelir. Kapsayıcıları arka planda çalıştırır ve terminalinizi serbest bırakır. Aksi takdirde, kapsayıcıların logları terminalde gösterilir ve terminaliniz meşgul kalır.
Komutu çalıştırdıktan sonra Docker, Nginx ve PostgreSQL imajlarını indirecek (eğer daha önce indirilmemişse), servisleri oluşturacak ve başlatacaktır. İşlem tamamlandığında, web tarayıcınızı açıp sunucunuzun IP adresine veya localhost adresine giderseniz (eğer yerel makinede çalıştırıyorsanız), “Merhaba! Nginx ve PostgreSQL Çalışıyor!” mesajını içeren index.html sayfasını görmelisiniz.
Çalışan servisleri kontrol etmek için:
docker-compose ps
Bu komut, Docker Compose tarafından yönetilen tüm servislerin durumunu gösterecektir.
Servislerin loglarını görmek için:
docker-compose logs web
docker-compose logs db
Uygulamayı durdurmak ve kapsayıcıları kaldırmak için:
docker-compose down
Bu komut, docker-compose.yml dosyasında tanımlanan tüm servisleri durdurur, kapsayıcıları kaldırır ve varsayılan olarak oluşturulan ağları da siler. Ancak db_data gibi isimlendirilmiş volume’ler varsayılan olarak kalıcıdır ve docker-compose down --volumes komutu ile silinmeleri gerekir.
Vaka Analizi: Geliştirme Ortamı Otomasyonu
Bir yazılım geliştirme ekibinin, yeni bir projeye başlarken veya yeni bir ekip üyesi katıldığında yaşadığı en büyük zorluklardan biri, tüm geliştirme ortamını tutarlı bir şekilde kurmaktır. Her geliştiricinin kendi makinesinde farklı işletim sistemleri, farklı bağımlılık versiyonları olabilir. Bu durum, “benim makinemde çalışıyor” gibi sorunlara yol açar ve verimliliği düşürür.
Docker Compose, bu sorunu kökten çözer. Ekip, uygulamanın tüm bağımlılıklarını (veritabanı, önbellek, mesaj kuyruğu, arka uç servisi vb.) içeren tek bir docker-compose.yml dosyası oluşturur. Yeni bir geliştirici projeye katıldığında, sadece Docker ve Docker Compose kurar, projenin kaynak kodunu çeker ve tek bir docker-compose up -d komutuyla tüm geliştirme ortamını dakikalar içinde hazır hale getirir. Bu, geliştiricilerin altyapı kurulumuyla uğraşmak yerine doğrudan kod yazmaya odaklanmasını sağlar. Ayrıca, farklı dallarda (branch) çalışırken farklı veritabanı yapılandırmaları veya servis versiyonları gerekiyorsa, Compose dosyaları kolayca değiştirilerek veya override dosyaları kullanılarak farklı ortamlar hızla ayağa kaldırılabilir. Bu otomasyon, proje başlangıç sürelerini kısaltır, hata oranlarını azaltır ve ekip içindeki işbirliğini önemli ölçüde artırır.
İleri Düzey Docker Compose Kullanımı ve İpuçları
Docker Compose’un temel kurulumunu ve basit bir uygulamanın nasıl çalıştırılacağını öğrendikten sonra, şimdi daha karmaşık senaryolar ve ileri düzey kullanım teknikleri hakkında bilgi edinelim. Bu bölümde, birden fazla ortam için yapılandırma, ağ ve depolama yönetimi gibi konulara odaklanacak ve Docker Compose kullanımınızı optimize edecek ipuçları sunacağız.
Birden Fazla Ortam İçin Yapılandırma (docker-compose.override.yml)
Gerçek dünya projelerinde, geliştirme, test ve üretim ortamları için farklı Docker Compose yapılandırmalarına ihtiyaç duyulur. Örneğin, geliştirme ortamında kodunuzu anında yansıtabilmek için bind mount’lar kullanmak isterken, üretimde daha performanslı ve güvenli named volume’ler tercih edebilirsiniz. Ya da geliştirme ortamında hata ayıklama portlarını açarken, üretimde bu portları kapalı tutmak istersiniz.
Docker Compose, bu tür senaryolar için docker-compose.override.yml dosyasını destekler. Docker Compose varsayılan olarak docker-compose.yml dosyasını arar. Eğer aynı dizinde docker-compose.override.yml dosyası da varsa, bu iki dosyayı otomatik olarak birleştirir. override dosyası, ana dosyada tanımlanan ayarları geçersiz kılabilir veya yeni ayarlar ekleyebilir.
Örnek olarak, önceki Nginx ve PostgreSQL örneğimizde, geliştirme ortamında Nginx’in loglarını direkt olarak host makinede görmek isteyebiliriz. Bunun için docker-compose.override.yml dosyası oluşturabiliriz:
docker-compose.yml (ana dosya – üretim için varsayılan):
# ... (önceki docker-compose.yml içeriği) ...
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
# ...
docker-compose.override.yml (geliştirme için özel ayarlar):
version: '3.8'
services:
web:
volumes:
- ./logs/nginx:/var/log/nginx # Nginx loglarını host'a bağla
environment:
DEBUG_MODE: "true" # Geliştirme modu değişkeni
db:
ports:
- "5432:5432" # Geliştirmede veritabanına dışarıdan erişim
Bu durumda, docker-compose up komutunu çalıştırdığınızda, Docker Compose önce docker-compose.yml dosyasını okuyacak, ardından docker-compose.override.yml dosyasındaki ayarları uygulayacaktır. web servisinin volumes ayarı, override dosyasındaki tanımla genişletilecek (veya mevcut olanı değiştirecek) ve DEBUG_MODE çevresel değişkeni eklenecektir. db servisine de ek bir port yönlendirmesi yapılacaktır.
Farklı ortamlar için birden fazla override dosyası da kullanabilirsiniz (örn. docker-compose.dev.yml, docker-compose.prod.yml) ve bunları docker-compose -f docker-compose.yml -f docker-compose.dev.yml up gibi komutlarla manuel olarak belirtebilirsiniz.
Volume ve Network Yönetimi
Docker Compose, depolama ve ağ yönetimi konusunda size büyük esneklik sunar. Uygulamanızın performansını ve veri güvenliğini artırmak için bu özellikleri doğru kullanmak önemlidir.
- Named Volumes (İsimlendirilmiş Depolama Birimleri): Verilerinizi kapsayıcı yaşam döngüsünden bağımsız olarak kalıcı hale getirmek için named volume’ler kullanın. Önceki örneğimizdeki
db_datavolume’ü buna iyi bir örnektir. Named volume’ler, Docker tarafından yönetilir ve kapsayıcılar silinse bile verileri korur.volumes: my_app_data: driver: local # Varsayılan sürücü, açıkça belirtilebilir - Custom Networks (Özel Ağlar): Varsayılan bridge ağını kullanmak yerine, servisleriniz için özel ağlar tanımlamak daha iyi bir izolasyon ve yönetim sağlar. Servisler, aynı ağda olduklarında birbirleriyle servis isimleri üzerinden iletişim kurabilirler (DNS çözümü sayesinde).
networks: backend_network: driver: bridge frontend_network: driver: bridge services: backend: networks: - backend_network frontend: networks: - backend_network - frontend_networkBu örnekte,
frontendservisi hembackend_networkhem defrontend_networküzerinde yer alırken,backendservisi sadecebackend_networküzerindedir. Bu, güvenlik ve ağ trafiği izolasyonu için kullanışlıdır.
Performans İpuçları ve En İyi Uygulamalar
Docker Compose ile çalışırken performansı artırmak ve en iyi uygulamaları takip etmek, daha verimli ve sorunsuz bir deneyim sağlar.
- Minimal İmajlar Kullanın: Uygulamanız için mümkün olduğunca küçük ve optimize edilmiş Docker imajları kullanın (örneğin,
alpinetabanlı imajlar). Bu, indirme sürelerini kısaltır ve kaynak tüketimini azaltır. - Kaynak Sınırları Belirleyin: Özellikle üretim ortamında, her bir servisin CPU ve bellek kullanımına sınırlar koymak, bir servisin diğerlerini veya ana makineyi aşırı yüklemesini engeller.
services: my_service: deploy: resources: limits: cpus: '0.5' # 0.5 CPU çekirdeği memory: 512M # 512 MB bellek - Restart Politikalarını Kullanın: Kapsayıcıların beklenmedik bir şekilde durması durumunda otomatik olarak yeniden başlatılmasını sağlamak için
restartpolitikaları belirleyin (örn.always,on-failure).services: my_service: restart: always - Verimli
DockerfileYazımı: Docker Compose,Dockerfileile birlikte çalıştığı için, imajlarınızı optimize etmek önemlidir. Katmanları önbelleğe almak, gereksiz dosyaları.dockerignoreile dışlamak gibi teknikler kullanın. - Sıcak Yeniden Yükleme (Hot Reloading): Geliştirme ortamında, kod değişikliklerinin anında yansıması için bind mount’lar ve uygulamanızın sıcak yeniden yükleme özelliklerini kullanın.
Bu ileri düzey teknikler ve ipuçları, Docker Compose ile daha karmaşık ve sağlam uygulamalar geliştirmenize yardımcı olacaktır. Her bir özelliği kendi projenizin ihtiyaçlarına göre uyarlayarak, geliştirme ve dağıtım süreçlerinizi daha da optimize edebilirsiniz.
Sonuç ve Sıkça Sorulan Sorular
Bu kapsamlı rehber boyunca, CentOS 7 işletim sistemi üzerinde Docker ve Docker Compose’un kurulumundan, temel kavramlarına ve pratik bir Nginx-PostgreSQL uygulamasıyla gerçek dünya senaryolarına kadar birçok konuyu ele aldık. Docker Compose’un, çok kapsayıcılı uygulamaların yönetimini nasıl basitleştirdiğini, geliştirme ortamlarında tutarlılık sağladığını ve ekipler arası işbirliğini nasıl güçlendirdiğini detaylıca inceledik. Artık, karmaşık uygulama yığınlarını tek bir YAML dosyasıyla tanımlayabilir, tek bir komutla ayağa kaldırabilir ve yönetebilirsiniz.
Docker Compose, modern yazılım geliştirme süreçlerinin ayrılmaz bir parçasıdır. Geliştiricilerin altyapı karmaşıklığıyla boğuşmak yerine, uygulama mantığına odaklanmalarını sağlayarak verimliliği artırır. İster küçük bir proje üzerinde çalışıyor olun ister büyük bir ekibin parçası olun, Docker Compose’un sunduğu otomasyon ve tutarlılık, geliştirme ve dağıtım süreçlerinizi önemli ölçüde hızlandıracaktır. Bu rehberde edindiğiniz bilgilerle, kendi çok kapsayıcılı uygulamalarınızı güvenle Dockerize etmeye ve yönetmeye başlayabilirsiniz.
Sıkça Sorulan Sorular
Aşağıda, Docker Compose hakkında sıkça karşılaşılan bazı soruları ve cevaplarını bulabilirsiniz:
- Docker Compose neden
dockerkomutunun bir parçası değil?Docker Compose, Docker Engine’den ayrı bir projedir ve farklı bir geliştirme döngüsüne sahiptir. Tarihsel olarak ayrı bir Python uygulaması olarak başlamıştır. Modern Docker sürümlerinde (Docker Desktop veya Docker Engine’in daha yeni versiyonları), Docker Compose CLI eklentisi olarak entegre edilmiş olabilir ve
docker compose(arada tire olmadan) şeklinde kullanılabilir. Ancak CentOS 7’deki geleneksel kurulumda ayrı bir binary olarak kalır. - Docker Compose ile
docker runarasındaki fark nedir?docker run, tek bir Docker kapsayıcısını başlatmak ve yönetmek için kullanılır. Çevresel değişkenler, port eşlemeleri ve volume’ler gibi ayarlar komut satırında argüman olarak verilir. Docker Compose ise birden fazla kapsayıcıyı, ağlarını ve depolama birimlerini tek birdocker-compose.ymldosyası içinde tanımlar ve tek bir komutla tüm uygulama yığınını yönetmenizi sağlar. Çok kapsayıcılı uygulamalar içindocker-composeçok daha pratiktir. - CentOS 7 üzerinde Docker Compose’u güncellemek için ne yapmalıyım?
Docker Compose’u güncellemek için, ilk kurulumda kullandığınız
curlkomutunu en son sürüm numarasını belirterek tekrar çalıştırmanız yeterlidir. Bu, mevcut binary dosyasının üzerine yenisini yazacaktır. Ardındanchmod +xkomutunu tekrar çalıştırmanıza gerek yoktur, çünkü dosya zaten yürütülebilir izne sahiptir.sudo curl -L "https://github.com/docker/compose/releases/download/<EN_SON_SURUM>/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - Üretim ortamında Docker Compose kullanmak güvenli mi?
Docker Compose, küçük ve orta ölçekli üretim ortamları için kesinlikle kullanılabilir. Basit ve yönetimi kolay bir dağıtım aracıdır. Ancak, yüksek kullanılabilirlik, otomatik ölçeklendirme, hizmet keşfi ve daha karmaşık orkestrasyon ihtiyaçları olan büyük ölçekli ve kritik üretim ortamları için Kubernetes veya Docker Swarm gibi daha gelişmiş orkestrasyon platformları daha uygun olabilir. Docker Compose, üretimde hızlı dağıtım ve yönetim kolaylığı sunduğu için birçok senaryoda yeterlidir.
docker-compose.ymldosyasında hangi versiyonu kullanmalıyım?Genellikle
docker-compose.ymldosyasının en son stabil versiyonunu kullanmanız önerilir. Bu rehberdeversion: '3.8'kullanılmıştır. Her yeni versiyon, yeni özellikler ve iyileştirmeler sunar. Docker Compose belgelerinden en güncel versiyonu ve özelliklerini kontrol edebilirsiniz. Eski versiyonlar da çalışmaya devam eder ancak yeni özelliklerden faydalanamazsınız.
Bu bilgilerle, Docker Compose’u CentOS 7 üzerinde etkin bir şekilde kullanmaya hazırsınız. Başarılar dileriz!
