Takip et

Debian Üzerine Docker Kurulumu: Adım Adım Kapsamlı Rehber

Günümüz yazılım geliştirme süreçlerinde karşılaşılan en büyük zorluklardan biri, uygulamaların farklı ortamlarda (geliştirme, test, üretim) tutarlı bir şekilde çalışmasını sağlamaktır.

Debian Üzerine Docker Kurulumu: Adım Adım Kapsamlı Rehber

Günümüz yazılım geliştirme süreçlerinde karşılaşılan en büyük zorluklardan biri, uygulamaların farklı ortamlarda (geliştirme, test, üretim) tutarlı bir şekilde çalışmasını sağlamaktır. “Benim makinemde çalışıyor!” cümlesi, birçok geliştiricinin kâbusu haline gelmiştir. Peki, bu sorunu kökten çözmek ve geliştirme süreçlerinizi standardize ederek hızlandırmak mümkün mü? Elbette! İşte tam da bu noktada Docker, konteynerleşme (containerization) teknolojisiyle devreye girerek, uygulamalarınızı ve tüm bağımlılıklarını izole edilmiş, taşınabilir birimler halinde paketlemenizi sağlar. Bu makalede, açık kaynak dünyasının güçlü ve istikrarlı işletim sistemlerinden biri olan Debian üzerine Docker’ı nasıl kuracağınızı, temelden ileri düzeye kadar adım adım detaylı bir şekilde inceleyeceğiz. Bu rehber sayesinde, Docker’ın sunduğu esneklik ve verimlilikle tanışacak, geliştirme ve dağıtım süreçlerinizi yepyeni bir boyuta taşıyacaksınız. Hazırsanız, Debian sunucunuzu modern yazılım geliştirme platformuna dönüştürmeye başlayalım.

Geliştirme Süreçlerinizi Hızlandırmak İçin Neden Docker Kullanmalısınız?

Yazılım geliştirme dünyası sürekli evrim geçirirken, uygulamaların geliştirilmesi, test edilmesi ve dağıtılması süreçleri de giderek karmaşıklaşmaktadır. Farklı geliştiricilerin farklı işletim sistemleri, kütüphane versiyonları veya bağımlılıkları kullanması, “benim makinemde çalışıyor ama sunucuda çalışmıyor” gibi klasik problemlerin ortaya çıkmasına neden olmaktadır. Bu durum, hem zaman kaybına yol açar hem de ekipler arasındaki iş birliğini zorlaştırır. İşte bu noktada Docker, modern yazılım geliştirme ve DevOps pratiklerinin vazgeçilmez bir parçası haline gelmiştir. Docker, uygulamaları ve onların tüm bağımlılıklarını, işletim sisteminden bağımsız, hafif ve taşınabilir birimler olan “konteynerler” içine paketleyerek bu tutarsızlık sorununu ortadan kaldırır. Konteynerler, bir sanal makine (virtual machine) gibi tüm bir işletim sistemini taklit etmek yerine, ana işletim sisteminin çekirdeğini (kernel) paylaşır ve sadece uygulama ile ilgili bağımlılıkları içerir. Bu sayede, çok daha az kaynak tüketirler ve saniyeler içinde başlatılabilirler.

Docker’ın sunduğu en önemli avantajlardan biri taşınabilirliktir. Bir Docker konteynerini, ister yerel geliştirme ortamınızda, ister bir test sunucusunda, isterse de bulut tabanlı bir üretim ortamında çalıştırın, her yerde aynı şekilde davranacağından emin olabilirsiniz. Bu tutarlılık, geliştiricilerin kodlarını daha hızlı yazmalarına, test ekiplerinin daha güvenilir testler yapmalarına ve operasyon ekiplerinin uygulamaları daha sorunsuz bir şekilde dağıtmalarına olanak tanır. Ayrıca, Docker, mikroservis mimarileri için ideal bir platform sunar. Uygulamanızın farklı bileşenlerini ayrı konteynerlerde çalıştırarak, her bir bileşenin bağımsız olarak geliştirilmesini, ölçeklenmesini ve güncellenmesini sağlayabilirsiniz. Bu da daha esnek, dayanıklı ve yönetilebilir sistemler oluşturmanıza yardımcı olur. Kaynak verimliliği açısından da Docker oldukça etkilidir. Konteynerler, sanal makinelere kıyasla çok daha az bellek ve işlemci kullanır, bu da aynı donanım üzerinde daha fazla uygulamanın çalıştırılmasına olanak tanır ve altyapı maliyetlerini düşürür. Güvenlik tarafında ise, her konteynerin izole bir ortamda çalışması, bir konteynerdeki sorunun diğerlerini etkilemesini engeller. Bu nedenlerle, Docker, modern yazılım geliştiricileri, DevOps mühendisleri ve sistem yöneticileri için vazgeçilmez bir araç haline gelmiştir. Debian gibi kararlı ve güvenilir bir işletim sistemi üzerinde Docker kullanmak, bu avantajları sağlam bir temel üzerine inşa etmek anlamına gelir.

Docker ve Konteynerleşme Nedir? Temel Kavramlara Hızlı Bir Bakış

Docker’ı etkin bir şekilde kullanabilmek için, öncelikle konteynerleşme felsefesini ve Docker ekosisteminin temel bileşenlerini anlamak hayati önem taşır. Konteynerleşme, bir uygulamayı ve onun tüm bağımlılıklarını (kod, çalışma zamanı ortamı, sistem araçları, kütüphaneler ve ayarlar) izole edilmiş bir ortamda paketleme sürecidir. Bu sayede uygulama, farklı bilgisayarlar veya sunucular arasında tutarlı bir şekilde çalışabilir. Docker, bu konteynerleşme teknolojisinin en popüler ve yaygın kullanılan platformudur. Sanal makinelerden farklı olarak, Docker konteynerleri tüm bir işletim sistemini sanallaştırmak yerine, ana bilgisayarın (host) işletim sistemi çekirdeğini paylaşır. Bu “paylaşılan çekirdek” yaklaşımı, konteynerlerin çok daha hafif, hızlı başlatılabilir ve kaynak açısından verimli olmasını sağlar. Sanal makineler gigabaytlarca yer kaplarken ve dakikalarca açılırken, Docker konteynerleri megabaytlarca yer kaplayabilir ve saniyeler içinde çalışmaya başlayabilir.

Docker ekosisteminde birkaç temel kavram bulunmaktadır:

  • Docker Engine: Docker’ın kalbidir. Konteynerleri oluşturan, çalıştıran, durduran ve yöneten arka plan servisi (daemon) ve komut satırı arayüzünden (CLI) oluşur.
  • Docker İmajı (Image): Bir konteyner çalıştırmak için gerekli tüm uygulama kodunu, kütüphaneleri, bağımlılıkları ve çalışma zamanı ayarlarını içeren salt okunur bir şablondur. İmajlar, bir uygulamanın “kalıbı” gibidir. Örneğin, bir Nginx web sunucusu imajı, Nginx’i çalıştırmak için gereken her şeyi içerir.
  • Dockerfile: Bir Docker imajını otomatik olarak oluşturmak için kullanılan talimatları içeren basit bir metin dosyasıdır. Bu dosya, temel bir imaj seçmekten, uygulama kodunu eklemeye, bağımlılıkları yüklemeye ve uygulama başlatma komutunu tanımlamaya kadar tüm adımları içerir. Geliştiriciler, Dockerfile’ı kullanarak uygulamalarının imajlarını kolayca oluşturabilir ve sürüm kontrolü altında tutabilirler.
  • Docker Konteyneri (Container): Bir Docker imajının çalıştırılabilir bir örneğidir. İmaj salt okunurken, konteynerler çalıştırılabilir ve üzerinde değişiklikler yapılabilir (ancak bu değişiklikler varsayılan olarak kalıcı değildir). Konteynerler, izole edilmiş bir ortamda çalışan uygulamalardır.
  • Docker Hub: Docker imajları için herkese açık bir bulut tabanlı depodur (registry). Geliştiriciler kendi imajlarını Docker Hub’a yükleyebilir veya başkaları tarafından oluşturulmuş binlerce hazır imajı (örneğin Ubuntu, Nginx, MySQL gibi) çekip kullanabilirler. Bu, imaj paylaşımını ve yeniden kullanımı kolaylaştırır.

Bu temel kavramlar, Docker’ın gücünü ve esnekliğini anlamak için bir başlangıç noktasıdır. Konteynerleşme, uygulamaların geliştirilme, test edilme ve üretim ortamlarına dağıtılma şeklini kökten değiştirerek, ekiplerin daha verimli çalışmasını ve daha hızlı inovasyon yapmasını sağlamıştır. Debian gibi sağlam bir temel üzerinde bu teknolojiyi kullanmak, altyapınızın hem güvenilir hem de modern olmasını garanti eder.

Debian Üzerine Docker Kurulumu Öncesi Hazırlıklar Nelerdir?

Debian üzerine Docker kurmaya başlamadan önce, sorunsuz bir kurulum süreci için bazı ön hazırlıklar yapmamız gerekmektedir. Bu adımlar, sisteminizin Docker için uygun olduğundan emin olmanızı ve olası çakışmaları önlemenizi sağlayacaktır. Öncelikle, Debian işletim sisteminizin güncel olduğundan emin olmalıyız. Güncel olmayan paketler veya sistem bileşenleri, Docker kurulumu sırasında veya sonrasında beklenmedik sorunlara yol açabilir. Terminali açın ve aşağıdaki komutları çalıştırarak paket listelerinizi güncelleyin ve yüklü paketleri yükseltin:

sudo apt update
sudo apt upgrade -y

Bu komutlar, sisteminizdeki mevcut tüm paketleri en son sürümlerine güncelleyecektir. İşlem tamamlandığında, bazı çekirdek (kernel) güncellemeleri yapılmışsa sisteminizi yeniden başlatmanız önerilir. Docker, Linux çekirdeğinin belirli özelliklerini kullandığı için, güncel bir çekirdek sürümüne sahip olmak önemlidir.

İkinci olarak, daha önce sisteminizde Docker’ın eski veya farklı bir sürümü yüklüyse, bu kurulumları tamamen kaldırmanız gerekmektedir. Eski kurulumlar, yeni kurulumla çakışabilir ve beklenmedik davranışlara neden olabilir. Aşağıdaki komutları kullanarak eski Docker paketlerini kaldırabilirsiniz:

sudo apt remove docker docker-engine docker.io containerd runc
sudo apt autoremove -y

Bu komutlar, Docker ile ilişkili olabilecek tüm ana paketleri kaldıracaktır. Eğer bu komutlar “paket bulunamadı” gibi bir hata verirse endişelenmeyin, bu sadece sisteminizde zaten bir Docker kurulumu olmadığını gösterir. Ayrıca, Docker’ın yapılandırma dosyaları veya konteyner verileri gibi kalıntıları da temizlemek isteyebilirsiniz. Bu genellikle /var/lib/docker dizininde bulunur. Eğer bu dizini temizlemek isterseniz, dikkatli olun, çünkü bu işlem mevcut tüm Docker imajlarınızı, konteynerlerinizi ve birimlerinizi (volumes) silecektir:

sudo rm -rf /var/lib/docker

Son olarak, Docker’ın HTTPS üzerinden güvenli bir şekilde paket indirmesi için gerekli olan bazı bağımlılık paketlerini yüklememiz gerekmektedir. Bu paketler, sertifikaları yönetmeye ve Docker deposuna güvenli bir bağlantı kurmaya yardımcı olur:

sudo apt install ca-certificates curl gnupg lsb-release -y
  • ca-certificates: Güvenilir sertifika yetkililerinin (CA) sertifikalarını içerir.
  • curl: İnternet üzerinden veri aktarımı için kullanılan bir araçtır. Docker’ın GPG anahtarını indirmek için kullanılacaktır.
  • gnupg: GPG anahtarlarını yönetmek ve paket bütünlüğünü doğrulamak için kullanılır.
  • lsb-release: İşletim sisteminin dağıtım bilgilerini (örneğin, Debian sürüm adı) sağlar, bu da doğru Docker deposu URL’sini oluşturmak için gereklidir.

Bu hazırlık adımları tamamlandıktan sonra, Debian sisteminiz Docker Engine’i kurmaya tamamen hazır hale gelmiş demektir. Güvenli ve sorunsuz bir kurulum için bu adımları atlamamak önemlidir.

Adım Adım Debian’a Docker Engine Nasıl Kurulur?

Debian sisteminiz Docker kurulumu için hazırlandığına göre, artık Docker Engine’i kurma işlemine geçebiliriz. Bu süreç, Docker’ın resmi deposunu sisteminize eklemeyi ve ardından gerekli paketleri yüklemeyi içerir. Adımları dikkatlice takip ederek, Debian’ınızda güvenilir bir Docker kurulumuna sahip olacaksınız.

1. Docker’ın GPG Anahtarını Ekleme

Docker, paketlerinin bütünlüğünü ve orijinalliğini doğrulamak için GPG (GNU Privacy Guard) anahtarları kullanır. Bu anahtarı sistemimize eklemek, indireceğimiz paketlerin güvenilir olduğunu garantiler. İlk olarak, anahtarı indirip sistemimize kaydetmek için aşağıdaki komutları kullanacağız:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

İlk komut, GPG anahtarlarını depolamak için bir dizin oluşturur ve gerekli izinleri verir. İkinci komut ise Docker’ın resmi GPG anahtarını indirir ve /etc/apt/keyrings/docker.gpg dosyasına kaydeder. --dearmor seçeneği, anahtarı ASCII zırhlı biçimden ikili biçime dönüştürür.

2. Docker Deposunu APT Kaynaklarına Ekleme

GPG anahtarını ekledikten sonra, APT paket yöneticimizin Docker paketlerini bulabilmesi için Docker’ın resmi deposunu sistemimizin kaynak listesine eklememiz gerekir. Bu sayede, Docker paketlerini diğer Debian paketleri gibi apt komutuyla kolayca yönetebiliriz:

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Bu uzun komut, sisteminizin mimarisine (arch=$(dpkg --print-architecture)) ve Debian sürümüne ($(lsb_release -cs)) uygun Docker deposu URL’sini otomatik olarak oluşturur ve /etc/apt/sources.list.d/docker.list dosyasına yazar. signed-by parametresi, paketlerin az önce eklediğimiz GPG anahtarı ile imzalandığını belirtir, böylece APT bu depoyu güvenilir kabul eder.

3. APT Paket Listesini Güncelleme

Yeni depoyu ekledikten sonra, APT’nin yeni kaynakları tanıması için paket listesini güncellememiz gerekir:

sudo apt update

Bu komut, Docker deposundaki mevcut paketlerin listesini sisteminize çekecektir.

4. Docker Engine’i Yükleme

Artık Docker Engine’i, Docker CLI’yı (komut satırı arayüzü) ve containerd’yi (konteyner çalışma zamanı) yüklemeye hazırız. Ayrıca, Docker Buildx ve Docker Compose eklentilerini de yükleyerek daha gelişmiş özelliklere sahip olacağız:

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
  • docker-ce: Docker Community Edition (Topluluk Sürümü) motorudur.
  • docker-ce-cli: Docker komut satırı arayüzüdür.
  • containerd.io: Konteynerleri yönetmek için endüstri standardı bir çalışma zamanıdır.
  • docker-buildx-plugin: Docker’ın çoklu mimari imajları oluşturmak için kullanılan bir eklentisidir.
  • docker-compose-plugin: Birden fazla konteyneri tek bir komutla yönetmek için Docker Compose eklentisidir.

5. Kurulumu Doğrulama

Docker’ın doğru bir şekilde kurulup kurulmadığını kontrol etmek için, basit bir “hello-world” konteynerini çalıştırabiliriz:

sudo docker run hello-world

Eğer kurulum başarılıysa, terminalde “Hello from Docker!” mesajını ve Docker’ın nasıl çalıştığına dair kısa bir açıklama göreceksiniz. Bu, Docker Engine’in düzgün çalıştığını gösterir.

6. Docker Komutlarını Sudo Olmadan Çalıştırma (İsteğe Bağlı ama Önerilen)

Varsayılan olarak, Docker komutlarını çalıştırmak için sudo kullanmanız gerekir. Ancak, kullanıcınızı docker grubuna ekleyerek bu gerekliliği ortadan kaldırabilirsiniz. Bu, günlük kullanımda çok daha pratik bir yaklaşımdır:

sudo usermod -aG docker $USER

Bu komut, mevcut kullanıcınızı ($USER değişkeni ile temsil edilen) docker grubuna ekler. Bu değişikliğin etkili olması için oturumu kapatıp tekrar açmanız veya sisteminizi yeniden başlatmanız gerekmektedir. Oturumunuzu yeniden başlattıktan sonra, sudo kullanmadan Docker komutlarını çalıştırabilirsiniz:

docker run hello-world

Bu adımları tamamladıktan sonra, Debian sisteminizde tam işlevsel bir Docker kurulumuna sahip olacaksınız. Artık konteynerler oluşturmaya, çalıştırmaya ve yönetmeye hazırsınız!

Docker ile İlk Konteynerinizi Çalıştırma ve Yönetme: Pratik Uygulamalar

Docker Engine’i Debian sisteminize başarıyla kurduğunuza göre, şimdi sıra Docker’ın temel gücünü deneyimlemeye geldi: Konteynerleri çalıştırmak ve yönetmek. Bu bölümde, Docker’ın en yaygın kullanılan komutlarını öğrenecek ve basit bir web sunucusundan kendi uygulamanıza kadar farklı senaryoları nasıl konteynerleştireceğinizi göreceksiniz. Docker’ın mantığını kavramak için pratik yapmak çok önemlidir.

Temel Docker Komutları

Docker ile çalışırken sıklıkla kullanacağınız birkaç temel komut bulunmaktadır:

  • docker pull [imaj_adı]: Bir imajı Docker Hub’dan veya başka bir depodan yerel makinenize indirir.
  • docker run [imaj_adı]: Bir imajdan yeni bir konteyner oluşturur ve çalıştırır.
  • docker ps: Çalışan tüm konteynerleri listeler. -a parametresi ile durdurulmuş konteynerleri de görebilirsiniz.
  • docker stop [konteyner_adı_veya_ID]: Çalışan bir konteyneri durdurur.
  • docker start [konteyner_adı_veya_ID]: Durdurulmuş bir konteyneri başlatır.
  • docker rm [konteyner_adı_veya_ID]: Bir konteyneri siler (önce durdurulmuş olmalıdır).
  • docker rmi [imaj_adı_veya_ID]: Bir imajı yerel depodan siler.
  • docker logs [konteyner_adı_veya_ID]: Bir konteynerin loglarını (günlüklerini) gösterir.

Örnek 1: Basit Bir Nginx Web Sunucusu Çalıştırma

Hemen pratik bir örnekle başlayalım. Popüler web sunucusu Nginx’i bir Docker konteynerinde nasıl çalıştıracağınızı görelim:

docker run --name my-nginx -p 8080:80 -d nginx

Bu komutu inceleyelim:

  • docker run: Yeni bir konteyner oluştur ve çalıştır.
  • --name my-nginx: Konteynerimize okunabilir bir isim veririz (my-nginx).
  • -p 8080:80: Bu, “port eşleme” (port mapping) olarak bilinir. Ana bilgisayarımızın 8080 portunu, konteynerin içindeki 80 portuna eşler. Böylece ana makinenizin http://localhost:8080 adresinden Nginx’e erişebilirsiniz.
  • -d: Konteyneri arka planda (detached mode) çalıştırır, böylece terminaliniz serbest kalır.
  • nginx: Kullanılacak imajın adıdır. Docker Hub’dan otomatik olarak en son Nginx imajını çekecektir.

Şimdi tarayıcınızdan http://localhost:8080 adresine giderek Nginx’in varsayılan “Welcome to Nginx!” sayfasını görmelisiniz. Çalışan konteynerinizi görmek için:

docker ps

Konteyneri durdurmak ve silmek için:

docker stop my-nginx
docker rm my-nginx

Örnek 2: Kendi Python Flask Uygulamanızı Konteynerleştirme

Şimdi daha gerçekçi bir senaryoya geçelim: Basit bir Python Flask uygulamasını Docker ile nasıl ayağa kaldıracağınızı göreceğiz. Öncelikle, uygulama dosyalarımızı oluşturalım. Bir dizin oluşturun (örneğin my_flask_app) ve içine app.py ve requirements.txt adında iki dosya ekleyin:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Merhaba Docker ve Debian! Bu benim Flask uygulamam."

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
# requirements.txt
Flask==2.3.2

Şimdi bu uygulamayı konteynerleştirmek için bir Dockerfile oluşturalım (aynı dizinde):

# Dockerfile
# Resmi Python 3.9 imajını temel al
FROM python:3.9-slim-buster

# Çalışma dizinini ayarla
WORKDIR /app

# Bağımlılıkları kopyala ve yükle
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Uygulama kodunu kopyala
COPY . .

# Uygulamanın çalışacağı portu belirt
EXPOSE 5000

# Uygulamayı başlat
CMD ["python", "app.py"]

Bu Dockerfile, uygulamanız için bir imaj oluşturma adımlarını tanımlar. Şimdi imajı oluşturalım:

docker build -t my-flask-app .

-t my-flask-app imaja bir etiket (tag) verirken, . mevcut dizindeki Dockerfile‘ı kullanmasını söyler. İmaj oluşturulduktan sonra, uygulamayı bir konteynerde çalıştırabiliriz:

docker run --name flask-web -p 5000:5000 -d my-flask-app

Artık tarayıcınızdan http://localhost:5000 adresine giderek Flask uygulamanızın çalıştığını görebilirsiniz. Bu örnekler, Docker’ın nasıl çalıştığına dair pratik bir bakış sunar ve uygulamalarınızı konteynerleştirme yolculuğunuzda size rehberlik eder. Konteynerlerin izole yapısı sayesinde, farklı uygulamalarınızı veya aynı uygulamanın farklı versiyonlarını aynı Debian sunucusu üzerinde çakışma olmadan çalıştırabilirsiniz.

Docker Compose ile Çoklu Konteyner Uygulamaları Nasıl Yönetilir?

Tek bir konteyner çalıştırmak nispeten basit olsa da, çoğu modern uygulama birden fazla servisten oluşur. Örneğin, bir web uygulaması genellikle bir web sunucusu (Nginx veya Apache), bir uygulama sunucusu (Python Flask/Django, Node.js, PHP-FPM) ve bir veritabanı (PostgreSQL, MySQL, MongoDB) gibi farklı bileşenleri içerir. Bu bileşenlerin her birini ayrı Docker komutlarıyla yönetmek karmaşık ve hata yapmaya açık olabilir. İşte bu noktada Docker Compose devreye girer. Docker Compose, çoklu konteyner Docker uygulamalarını tanımlamak ve çalıştırmak için bir araçtır. Tek bir YAML dosyası kullanarak uygulamanızın tüm servislerini, ağlarını ve birimlerini (volumes) yapılandırabilir ve ardından tek bir komutla tüm uygulamayı ayağa kaldırabilir veya durdurabilirsiniz.

Docker Compose’un temel amacı, birden fazla servisten oluşan uygulamalar için geliştirme, test ve hatta küçük ölçekli üretim ortamlarını kolayca yönetmektir. Docker Engine kurulumu sırasında docker-compose-plugin paketini zaten yüklediğimiz için, Docker Compose komutlarını doğrudan docker compose şeklinde kullanabiliriz (eski sürümlerde docker-compose ayrı bir komuttu).

Docker Compose ile WordPress Kurulumu Vaka Analizi

En popüler içerik yönetim sistemlerinden biri olan WordPress’i Docker Compose ile nasıl kuracağımızı inceleyelim. WordPress, bir web sunucusu (genellikle Apache veya Nginx) ve bir veritabanı (MySQL veya MariaDB) gerektiren tipik bir çoklu servis uygulamasıdır. Aşağıdaki adımları takip ederek bu kurulumu gerçekleştirebiliriz:

1. Proje Dizini Oluşturma

Öncelikle, WordPress projemiz için bir dizin oluşturalım ve içine girelim:

mkdir wordpress-app
cd wordpress-app

2. docker-compose.yml Dosyası Oluşturma

Bu dizinde, docker-compose.yml adında bir dosya oluşturacağız ve içine aşağıdaki içeriği yapıştıracağız:

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: wordpress_db
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password_here # Güçlü bir şifre belirleyin!
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: your_wordpress_password_here # Güçlü bir şifre belirleyin!
    volumes:
      - db_data:/var/lib/mysql
    restart: always

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    container_name: my_wordpress_site
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: your_wordpress_password_here
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    restart: always

volumes:
  db_data:
  wordpress_data:

Bu docker-compose.yml dosyası iki ana servis tanımlar:

  • db servisi: MySQL 8.0 imajını kullanır. Ortam değişkenleri ile veritabanı adı, kullanıcı adı ve şifreleri belirlenir. db_data adında bir birim (volume) kullanarak veritabanı verilerinin kalıcı olmasını sağlar.
  • wordpress servisi: En son WordPress imajını kullanır. depends_on: - db ile MySQL servisi çalışana kadar başlamamasını sağlar. Ana bilgisayarın 80 portunu konteynerin 80 portuna eşler. Ortam değişkenleri ile WordPress’in veritabanı bağlantı bilgilerini yapılandırır. wordpress_data adında bir birim kullanarak WordPress dosyalarının kalıcı olmasını sağlar.

volumes bölümü, veritabanı ve WordPress dosyaları için kalıcı depolama alanları tanımlar. Bu sayede konteynerler silinse bile verileriniz kaybolmaz.

3. Uygulamayı Başlatma

docker-compose.yml dosyasını kaydettikten sonra, tüm uygulamayı tek bir komutla başlatabilirsiniz:

docker compose up -d

Bu komut, db ve wordpress servislerinin imajlarını çekecek (eğer yerelde yoksa), konteynerleri oluşturacak, ağları yapılandıracak ve arka planda (-d) çalıştıracaktır. Birkaç dakika içinde WordPress siteniz hazır olacaktır. Tarayıcınızdan Debian sunucunuzun IP adresine veya localhost‘a (eğer yerel makinede çalıştırıyorsanız) giderek WordPress kurulum sihirbazını görebilirsiniz.

4. Konteynerleri Durdurma ve Silme

Uygulamayı durdurmak ve tüm servisleri kapatmak için:

docker compose down

Bu komut, docker-compose.yml dosyasında tanımlanan tüm konteynerleri durdurur ve siler. Ancak, birimler (volumes) varsayılan olarak silinmez. Verileri de silmek isterseniz -v parametresini kullanabilirsiniz:

docker compose down -v

Docker Compose, özellikle mikroservis tabanlı uygulamalar veya karmaşık geliştirme ortamları için vazgeçilmez bir araçtır. Bir uygulamanın tüm bağımlılıklarını tek bir dosyada tanımlayarak, geliştirme ve dağıtım süreçlerini büyük ölçüde basitleştirir ve tutarlılık sağlar. Bu sayede, ekiplerin daha hızlı ve daha verimli çalışmasına olanak tanır.

İleri Düzey Docker Kullanımı ve En İyi Uygulamalar

Docker’ın temel kurulumunu ve basit uygulamalarını öğrendikten sonra, şimdi daha karmaşık senaryolar için ileri düzey Docker özelliklerine ve en iyi uygulamalara göz atalım. Bu bilgiler, Docker’ı üretim ortamlarında daha verimli, güvenli ve yönetilebilir bir şekilde kullanmanıza yardımcı olacaktır.

Docker Ağları (Networking)

Konteynerler arasında ve konteynerler ile ana bilgisayar arasında iletişimi sağlamak için Docker çeşitli ağ sürücüleri (network drivers) sunar:

  • Bridge (Köprü) Ağı: Varsayılan ağ sürücüsüdür. Yeni oluşturulan her konteyner, bu köprü ağına bağlanır ve kendi özel IP adresini alır. Konteynerler bu ağ üzerinden birbirleriyle iletişim kurabilir. Dışarıdan erişim için port eşleme (-p) gereklidir.
  • Host (Ana Bilgisayar) Ağı: Konteyner, ağ yığınını ana bilgisayarla paylaşır. Bu, konteynerin doğrudan ana bilgisayarın ağ arayüzlerini kullanması anlamına gelir. Performans avantajı sağlayabilir ancak ağ izolasyonunu ortadan kaldırır.
  • Overlay (Katmanlı) Ağı: Birden fazla Docker daemon’ı (Swarm modu) arasında çalışan konteynerlerin iletişim kurmasını sağlar. Dağıtılmış uygulamalar için kullanılır.
  • None (Yok) Ağı: Konteyner için herhangi bir ağ arayüzü oluşturulmaz. Konteyner tamamen izole olur ve dış dünyayla iletişim kuramaz.

Kendi özel bridge ağlarınızı oluşturmak, uygulamalarınız için daha iyi izolasyon ve isim çözümlemesi (name resolution) sağlar. Örneğin, bir web uygulaması ve veritabanı için özel bir ağ oluşturabilirsiniz:

docker network create my-app-network
docker run --name my-db --network my-app-network -e MYSQL_ROOT_PASSWORD=secret -d mysql
docker run --name my-web --network my-app-network -p 80:80 -d nginx

Bu senaryoda, my-web konteyneri, my-db konteynerine doğrudan my-db ismiyle erişebilir, IP adresi bilmeye gerek kalmaz.

Docker Depolama (Storage)

Konteynerler varsayılan olarak durumsuz (stateless) ve geçicidir. Bir konteyner silindiğinde, içindeki tüm veriler de kaybolur. Verileri kalıcı hale getirmek için Docker çeşitli depolama seçenekleri sunar:

  • Volumes (Birimler): Docker tarafından yönetilen, ana bilgisayarın dosya sisteminde özel olarak oluşturulan veri alanlarıdır. Konteynerler arasında veri paylaşımı ve kalıcı depolama için en çok önerilen yöntemdir. Birimleri oluşturmak ve konteynere bağlamak kolaydır.
  • Bind Mounts (Bağlama Noktaları): Ana bilgisayarın dosya sistemindeki belirli bir dizini veya dosyayı doğrudan bir konteynere bağlar. Geliştirme sırasında kod dosyalarını konteyner ile senkronize etmek için kullanışlıdır.
  • Tmpfs Mounts: Konteynerin belleğinde geçici depolama alanı oluşturur. Kalıcı olmayan, hassas veriler veya performans gerektiren geçici dosyalar için idealdir.

Örnek bir volume kullanımı:

docker volume create my-data
docker run -d --name my-app -v my-data:/app/data my-custom-image

Dockerfile Optimizasyonu ve En İyi Uygulamalar

Etkili ve küçük Docker imajları oluşturmak için Dockerfile’ınızı optimize etmek önemlidir:

  • Küçük Temel İmajlar Kullanın: alpine veya slim etiketli imajlar (örneğin python:3.9-alpine) daha az yer kaplar ve güvenlik açıklarını azaltır.
  • Çok Aşamalı Derlemeler (Multi-Stage Builds): Uygulamanızı derlemek için bir aşama, ardından nihai, daha küçük bir çalışma zamanı imajı için başka bir aşama kullanın. Bu, derleme araçlarını ve geçici dosyaları nihai imajdan dışarıda bırakır.
  • Katman Önbellekleme (Layer Caching): Docker, her RUN, COPY veya ADD komutunu bir katman olarak önbelleğe alır. Sık değişen komutları (örneğin uygulama kodunu kopyalama) Dockerfile’ın alt kısımlarına yerleştirerek, daha az değişen bağımlılık katmanlarının önbellekten kullanılmasını sağlayın.
  • Gereksiz Bağımlılıkları Kaldırın: İmajınızı oluşturduktan sonra artık ihtiyacınız olmayan paketleri ve bağımlılıkları temizleyin. Örneğin, apt clean veya rm -rf /var/lib/apt/lists/* gibi komutlar kullanın.
  • Root Olmayan Kullanıcı Kullanın: Güvenlik nedeniyle, konteyner içinde uygulamayı çalıştırmak için root olmayan bir kullanıcı oluşturun ve kullanın.

Güvenlik İpuçları

  • Minimum Yetki Prensibi: Konteynerlerinize yalnızca ihtiyaç duydukları izinleri verin.
  • İmaj Tarama Araçları: Güvenlik açıklarını tespit etmek için Docker imajlarınızı düzenli olarak tarayın (örneğin Clair, Trivy).
  • Güncel İmajlar Kullanın: Temel imajlarınızı ve uygulama bağımlılıklarınızı düzenli olarak güncelleyin.
  • Ortam Değişkenlerinde Hassas Bilgileri Saklamayın: Veritabanı şifreleri gibi hassas bilgileri Docker Secrets veya Kubernetes Secrets gibi araçlarla yönetin.

Bu ileri düzey konular ve en iyi uygulamalar, Docker altyapınızı daha sağlam, güvenli ve performanslı hale getirmenize yardımcı olacaktır. Debian üzerinde bu pratikleri uygulamak, kararlı ve güvenilir bir temel üzerinde modern bir konteyner ortamı oluşturmanızı sağlar.

Sonuç: Geleceğin Geliştirme Pratikleri İçin Docker’ı Benimseyin

Bu kapsamlı rehber boyunca, Debian işletim sistemi üzerine Docker Engine’in nasıl kurulacağını, temelden ileri düzeye kadar adım adım inceledik. Konteynerleşmenin ne olduğundan, Docker’ın temel bileşenlerine, basit bir Nginx sunucusundan karmaşık bir WordPress uygulamasına kadar birçok pratik senaryoyu ele aldık. Ayrıca, Docker ağları, depolama, Dockerfile optimizasyonu ve güvenlik gibi ileri düzey konulara da değinerek, Docker’ı daha verimli ve güvenli bir şekilde kullanmanıza yardımcı olacak bilgiler sunduk.

Docker, günümüzün hızla değişen yazılım dünyasında geliştiriciler ve operasyon ekipleri için vazgeçilmez bir araç haline gelmiştir. Uygulamaların geliştirme, test ve üretim ortamları arasında tutarlı bir şekilde çalışmasını sağlayarak “benim makinemde çalışıyor” sorununu ortadan kaldırır. Bu tutarlılık, dağıtım süreçlerini hızlandırır, hata oranlarını azaltır ve ekipler arası iş birliğini geliştirir. Kaynak verimliliği sayesinde altyapı maliyetlerini düşürürken, mikroservis mimarileri için ideal bir platform sunarak daha esnek ve ölçeklenebilir sistemler inşa etmenize olanak tanır. Debian gibi sağlam ve güvenilir bir işletim sistemi üzerinde Docker kullanmak, bu avantajları sağlam bir temel üzerine inşa etmek anlamına gelir.

Artık Debian sunucunuzda Docker’ı başarıyla kurduğunuza ve temel komutlara hakim olduğunuza göre, konteynerleşme yolculuğunuzda bir sonraki adımları atmaya hazırsınız. Kendi uygulamalarınızı konteynerleştirin, farklı servisleri Docker Compose ile bir araya getirin ve DevOps pratiklerinizi Docker ile güçlendirin. Unutmayın, Docker ekosistemi sürekli gelişiyor; bu yüzden öğrenmeye ve yeni özellikleri keşfetmeye devam edin. Konteynerleşmenin gücüyle, geleceğin yazılım geliştirme ve dağıtım pratiklerine şimdiden adapte olmuş olacaksınız.

Sıkça Sorulan Sorular (SSS)

  1. Docker ve sanal makine arasındaki temel fark nedir?

    Temel fark, sanallaştırma seviyesindedir. Sanal makineler (VM’ler), ana bilgisayarın donanımını sanallaştırır ve her bir VM, kendi tam işletim sistemine (kernel dahil) sahiptir. Bu, onları daha büyük ve daha yavaş hale getirir. Docker konteynerleri ise ana bilgisayarın işletim sistemi çekirdeğini paylaşır ve sadece uygulama ile ilgili bağımlılıkları içerir. Bu, konteynerleri çok daha hafif, hızlı başlatılabilir ve kaynak açısından daha verimli kılar.

  2. Debian’da Docker kurarken yaygın karşılaşılan sorunlar nelerdir ve nasıl çözülür?

    En yaygın sorunlardan biri, kullanıcı izinleri nedeniyle Docker komutlarını sudo olmadan çalıştıramamaktır. Bu, kullanıcınızı docker grubuna ekleyip oturumu yeniden başlatarak çözülür (sudo usermod -aG docker $USER). Diğer bir sorun, eski Docker sürümlerinin kalıntılarının yeni kurulumla çakışmasıdır. Bu durumda, önceki bölümde belirtildiği gibi eski paketleri ve /var/lib/docker dizinini temizlemek gerekir. Ayrıca, yanlış GPG anahtarı veya depo URL’si de kurulum hatalarına yol açabilir; bu adımları dikkatlice kontrol etmek önemlidir.

  3. Docker imajlarını nereden bulabilirim ve kendi imajımı nasıl oluştururum?

    Docker imajlarını genellikle Docker Hub’dan bulabilirsiniz (hub.docker.com). Burada binlerce resmi ve topluluk tarafından oluşturulmuş imaj mevcuttur. Kendi imajınızı oluşturmak için, uygulamanızın bağımlılıklarını ve çalışma zamanı adımlarını tanımlayan bir Dockerfile yazmanız gerekir. Ardından, docker build -t my-custom-image . komutunu kullanarak bu Dockerfile’dan bir imaj oluşturabilirsiniz.

  4. Docker konteynerlerindeki verilerimi nasıl kalıcı hale getirebilirim?

    Konteynerler geçici olduğu için, verileri kalıcı hale getirmek için “volumes” (birimler) veya “bind mounts” (bağlama noktaları) kullanmanız gerekir. Volumes, Docker tarafından yönetilen depolama alanlarıdır ve genellikle en çok önerilen yöntemdir. Bind mounts ise ana bilgisayarın dosya sistemindeki belirli bir dizini doğrudan konteynere bağlar. Her ikisi de -v parametresi ile docker run komutunda veya docker-compose.yml dosyasında tanımlanır.

  5. Üretim ortamında Docker kullanırken nelere dikkat etmeliyim?

    Üretim ortamında Docker kullanırken güvenlik, performans ve yönetilebilirlik ön planda olmalıdır. Güvenlik için, küçük temel imajlar kullanın, root olmayan kullanıcılarla çalıştırın, imajları tarayın ve hassas bilgileri Docker Secrets gibi araçlarla yönetin. Performans için, Dockerfile’ınızı optimize edin, yeterli kaynak tahsisi yapın ve uygun ağ sürücülerini kullanın. Yönetilebilirlik için, konteynerleri izlemek (monitoring), logları toplamak (logging) ve otomatik dağıtım (CI/CD) süreçlerini entegre etmek önemlidir. Ayrıca, yüksek erişilebilirlik ve ölçeklenebilirlik için Docker Swarm veya Kubernetes gibi konteyner orkestrasyon araçlarını değerlendirebilirsiniz.

#Docker #Debian #Konteynerleşme #DevOps #YazılımGeliştirme #SistemYönetimi

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version