Takip et

Giriş: Neden Docker Kullanmalısınız ve Ne İşe Yarar?

Ubuntu’da Docker Kurulumu ve Kullanımı: Adım Adım Kapsamlı Rehber

Giriş: Neden Docker Kullanmalısınız ve Ne İşe Yarar?

Ubuntu üzerinde Docker’ı kurmak ve kullanmak mı istiyorsunuz? Bu kapsamlı rehber, konteyner teknolojisinin temellerinden ileri düzey ipuçlarına kadar her şeyi adım adım açıklıyor, projelerinizi verimli yönetmenizi sağlıyor.

Yazılım geliştirme dünyasında “Benim makinemde çalışıyor!” cümlesiyle sıkça karşılaşıyor musunuz? Geliştiricilerin ortak bir sorunu olan bu durum, farklı geliştirme, test ve üretim ortamları arasındaki tutarsızlıklardan kaynaklanır. Uygulamalar bir ortamda sorunsuz çalışırken, başka bir ortamda beklenmedik hatalar verebilir. İşte tam da bu noktada, modern yazılım geliştirme süreçlerinin vazgeçilmezi haline gelen Docker devreye giriyor. Peki, Docker nedir ve geliştirme süreçlerinizi nasıl dönüştürebilir?

Docker, uygulamalarınızı ve bağımlılıklarını “konteyner” adı verilen izole, taşınabilir birimler halinde paketlemenizi sağlayan açık kaynaklı bir platformdur. Bu konteynerler, uygulamanızın çalışması için gereken her şeyi (kod, çalışma zamanı, sistem araçları, kütüphaneler ve ayarlar) içerir. Böylece, uygulamanızın farklı ortamlarda tutarlı bir şekilde çalışmasını garanti altına alır. Bir geliştiricinin makinesinde, test sunucusunda veya üretim ortamında olsun, Docker konteynerleri her yerde aynı şekilde davranır. Bu, özellikle büyük ve karmaşık uygulamaların geliştirilmesi ve dağıtılması söz konusu olduğunda paha biçilmez bir avantaj sunar.

Docker’ın sunduğu en önemli faydalardan biri, geliştirme ve operasyon (DevOps) ekipleri arasındaki işbirliğini kolaylaştırmasıdır. Geliştiriciler, uygulamalarını konteynerize ederek operasyon ekiplerine “çalışan bir paket” teslim ederler. Operasyon ekipleri ise bu paketi herhangi bir uyumluluk sorunu yaşamadan dağıtabilir ve yönetebilir. Ayrıca, Docker konteynerleri hafif yapıda oldukları için sanal makinelere göre daha az kaynak tüketir ve daha hızlı başlar. Bu durum, özellikle mikroservis mimarisine sahip uygulamaların geliştirilmesinde ve bulut tabanlı dağıtımlarda büyük bir performans ve maliyet avantajı sağlar. Örneğin, bir e-ticaret platformu düşünün; ödeme, ürün yönetimi ve kullanıcı arayüzü gibi farklı servisler ayrı ayrı konteynerize edilerek birbirinden bağımsız olarak geliştirilebilir, dağıtılabilir ve ölçeklenebilir.

Bu makalede, Ubuntu işletim sistemi üzerinde Docker’ı sıfırdan nasıl kuracağınızı, temel komutlarını öğrenerek ilk konteynerinizi nasıl çalıştıracağınızı ve hatta çoklu konteyner uygulamalarını Docker Compose ile nasıl yöneteceğinizi adım adım inceleyeceğiz. Amacımız, ister yeni başlayan bir geliştirici olun ister deneyimli bir DevOps mühendisi, Docker’ın gücünden tam anlamıyla faydalanmanızı sağlayacak pratik bilgiler ve ipuçları sunmaktır. Hazırsanız, konteyner teknolojisinin heyecan verici dünyasına dalış yapalım!

Docker’ın Temel Taşları Nelerdir? Konteyner ve İmaj Kavramları

Docker’ı anlamanın anahtarı, onun temel yapı taşları olan imajlar ve konteynerler arasındaki ilişkiyi kavramaktan geçer. Bu iki kavram, Docker ekosisteminin kalbinde yer alır ve uygulamanızın paketlenmesi ile çalıştırılması süreçlerini tanımlar. Geleneksel sanallaştırma yöntemlerinden farklı olarak, Docker bu kavramları kullanarak çok daha hafif ve verimli bir izolasyon katmanı sunar. Peki, bu kavramlar tam olarak ne anlama geliyor ve birbirlerinden nasıl ayrılıyorlar?

Öncelikle, Docker İmajları (Images) ile başlayalım. Bir Docker imajı, bir uygulamanın çalışması için gereken tüm bileşenleri içeren, sadece okunabilir bir şablondur. Bu bileşenler arasında uygulamanın kodu, çalışma zamanı (runtime), kütüphaneler, ortam değişkenleri ve yapılandırma dosyaları bulunur. Bir imajı, bir yazılımın “kalıbı” veya “planı” olarak düşünebilirsiniz. Örneğin, bir Nginx web sunucusu imajı, Nginx yazılımının kendisini, gerekli tüm bağımlılıklarını ve varsayılan yapılandırmasını içerir. İmajlar katmanlı bir yapıya sahiptir; yani, bir imaj başka bir imajın üzerine inşa edilebilir. Bu katmanlı yapı, imajların boyutunu optimize eder ve yeniden kullanılabilirliği artırır. Docker Hub gibi merkezi bir depodan hazır imajları çekebilir veya kendi özel imajlarınızı bir Dockerfile kullanarak oluşturabilirsiniz.

Daha sonra, Docker Konteynerleri (Containers) devreye girer. Bir konteyner, bir Docker imajının çalışan bir örneğidir. Eğer imaj bir sınıfsa, konteyner o sınıfın bir nesnesidir. Bir imajdan birden fazla konteyner oluşturabilir ve her biri birbirinden tamamen izole edilmiş bağımsız ortamlar olarak çalışır. Her konteynerin kendine ait bir dosya sistemi, ağ arayüzü ve işlem alanı vardır. Bu izolasyon, uygulamaların birbirini etkilemeden aynı ana bilgisayar üzerinde güvenli bir şekilde çalışmasını sağlar. Konteynerler, imajlardan farklı olarak yazılabilir katmanlara sahiptir; yani, bir konteyner çalışırken yapılan değişiklikler (örneğin, bir dosyanın oluşturulması veya bir ayarın değiştirilmesi) sadece o konteynere özgüdür ve imajı etkilemez. Konteynerleri başlatabilir, durdurabilir, yeniden başlatabilir, kaldırabilir ve hatta bir imaja dönüştürerek kalıcı hale getirebilirsiniz.

Bu temel kavramların yanı sıra, Docker ekosisteminde başka önemli bileşenler de bulunmaktadır:

  • Docker Engine: Docker’ın ana bileşenidir ve konteynerleri oluşturan, çalıştıran ve yöneten arka plan servisidir (daemon). Kullanıcılar, Docker CLI (Komut Satırı Arayüzü) aracılığıyla Docker Engine ile etkileşime girer.
  • Dockerfile: Kendi Docker imajlarınızı oluşturmak için kullanılan talimatları içeren metin dosyasıdır. Bu dosya, uygulamanızın nasıl inşa edileceğini ve hangi bağımlılıklara sahip olduğunu adım adım tanımlar.
  • Docker Hub: Docker imajları için bulut tabanlı bir kayıt defteridir (registry). Binlerce hazır imajı barındırır ve kendi imajlarınızı depolamanıza, paylaşmanıza olanak tanır.

Geleneksel sanal makineler (VM’ler) ile Docker konteynerleri arasındaki temel farkı anlamak da önemlidir. Sanal makineler, her biri kendi işletim sistemini (Guest OS) içeren tam teşekküllü sanal donanım katmanları üzerinde çalışır. Bu da onları ağır ve kaynak yoğun yapar. Docker konteynerleri ise ana bilgisayarın işletim sistemini (Host OS) paylaşır ve sadece uygulamanın çalışması için gereken bağımlılıkları içerir. Bu “işletim sistemi sanallaştırması” yaklaşımı, konteynerleri çok daha hafif, hızlı ve verimli hale getirir. Sonuç olarak, Docker’ın bu temel taşları, modern uygulama geliştirme ve dağıtım süreçlerinde esneklik, verimlilik ve tutarlılık sağlayarak devrim yaratmıştır.

Ubuntu Üzerinde Docker Nasıl Kurulur? Adım Adım Kurulum Rehberi

Docker’ın ne olduğunu ve neden önemli olduğunu anladıktan sonra, sıra onu Ubuntu sisteminize kurmaya geldi. Bu bölüm, Docker Engine’i Ubuntu 20.04 veya 22.04 gibi güncel bir Ubuntu sürümüne sorunsuz bir şekilde yüklemek için adım adım bir rehber sunmaktadır. Kurulum süreci, sisteminizin güncel olmasını sağlamak, gerekli bağımlılıkları yüklemek ve Docker’ın resmi deposunu eklemek gibi birkaç basit adımdan oluşur. Bu adımları dikkatlice takip ederek, kısa sürede ilk Docker konteynerinizi çalıştırmaya hazır hale geleceksiniz. Kurulum sırasında herhangi bir hata yaşamamak adına, her komutu doğru sırayla ve dikkatlice uygulamanız önemlidir.

Adım 1: Sistem Güncellemesi ve Gerekli Paketlerin Kurulumu

Kuruluma başlamadan önce, sisteminizin güncel olduğundan emin olmak her zaman iyi bir uygulamadır. Ayrıca, Docker’ın HTTPS üzerinden paket depolarına erişebilmesi için bazı yardımcı paketlere ihtiyacımız var. Terminali açın ve aşağıdaki komutları çalıştırın:


sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
    

sudo apt update komutu, paket listelerinizi güncellerken, sudo apt install komutu ise ca-certificates (güvenli sertifikalar için), curl (URL’lerden veri almak için), gnupg (GPG anahtarlarını yönetmek için) ve lsb-release (Linux Standard Base bilgilerini almak için) paketlerini kurar. Bu paketler, Docker’ın resmi deposunu sisteminize güvenli bir şekilde eklemek için kritik öneme sahiptir.

Adım 2: Docker’ın GPG Anahtarını Eklemek

Docker’ın resmi deposundan indirilen paketlerin doğruluğunu sağlamak için Docker’ın GPG anahtarını sisteminizin anahtar halkasına eklememiz gerekir. Bu, indirdiğimiz paketlerin gerçekten Docker tarafından yayınlandığını ve değiştirilmediğini doğrulamamızı sağlar.


sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    

İlk komut, GPG anahtarları için bir dizin oluştururken, ikinci komut Docker’ın GPG anahtarını indirir ve /etc/apt/keyrings dizinine kaydeder. --dearmor seçeneği, anahtarı APT’nin anlayabileceği bir formata dönüştürür.

Adım 3: Docker Deposunu Eklemek

Şimdi, Docker paketlerinin bulunduğu resmi depoyu APT kaynak listenize eklememiz gerekiyor. Bu sayede apt komutunu kullanarak Docker’ı kolayca kurabilir ve güncelleyebilirsiniz.


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
    

Bu komut, sisteminizin mimarisine (dpkg --print-architecture) ve Ubuntu sürümünüze (lsb_release -cs) uygun Docker deposu satırını /etc/apt/sources.list.d/docker.list dosyasına ekler. signed-by=/etc/apt/keyrings/docker.gpg kısmı, bu depodan indirilen paketlerin daha önce eklediğimiz GPG anahtarı ile imzalanmış olması gerektiğini belirtir.

Adım 4: Docker Engine’i Kurmak

Depoyu ekledikten sonra, paket listelerinizi tekrar güncelleyin ve Docker Engine’i, Docker CLI’yi ve containerd’i kurun:


sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

Bu komut, Docker’ın ana bileşenlerini kurar. docker-ce (Community Edition) Docker Engine’in kendisidir, docker-ce-cli Docker komut satırı arayüzüdür ve containerd.io, konteyner yaşam döngüsünü yöneten bir konteyner çalışma zamanıdır. docker-buildx-plugin ve docker-compose-plugin ise Docker’ın gelişmiş build ve çoklu konteyner yönetim araçlarıdır.

Adım 5: Docker Servisini Doğrulamak ve Test Etmek

Kurulum tamamlandıktan sonra, Docker servisinin çalışıp çalışmadığını kontrol edebilir ve basit bir test konteyneri çalıştırarak kurulumu doğrulayabilirsiniz:


sudo systemctl status docker
docker run hello-world
    

systemctl status docker komutu, Docker servisinin durumunu gösterir. Eğer “active (running)” olarak görüyorsanız, Docker başarıyla çalışıyordur. docker run hello-world komutu ise, Docker Hub’dan “hello-world” imajını çeker ve ondan bir konteyner çalıştırır. Eğer her şey yolundaysa, terminalinizde “Hello from Docker!” mesajını görmelisiniz. Bu mesaj, Docker kurulumunuzun doğru çalıştığını ve ilk konteynerinizi başarıyla çalıştırdığınızı gösterir.

Adım 6: Docker Komutlarını Sudo Olmadan Çalıştırmak (İsteğe Bağlı ama Önemli)

Varsayılan olarak, Docker komutlarını çalıştırmak için sudo kullanmanız gerekir. Bu, güvenlik nedeniyle böyledir. Ancak, her seferinde sudo yazmak yerine, kullanıcınızı docker grubuna ekleyerek bu kısıtlamayı kaldırabilirsiniz. Bu adımı dikkatli uygulayın, çünkü docker grubuna eklenen kullanıcılar, ana sistem üzerinde kök ayrıcalıklarına benzer yeteneklere sahip olabilir.


sudo usermod -aG docker $USER
newgrp docker
    

İlk komut, mevcut kullanıcınızı ($USER değişkeni ile temsil edilir) docker grubuna ekler. İkinci komut olan newgrp docker, mevcut oturumunuz için grup değişikliklerini anında etkinleştirir. Alternatif olarak, oturumu kapatıp tekrar açabilirsiniz. Bu adımdan sonra, sudo kullanmadan Docker komutlarını çalıştırabilirsiniz. Örneğin, tekrar docker run hello-world komutunu sudo olmadan deneyin.

Tebrikler! Ubuntu sisteminize Docker’ı başarıyla kurdunuz ve ilk konteynerinizi çalıştırdınız. Artık Docker’ın gücünden faydalanarak uygulamalarınızı konteynerize etmeye ve yönetmeye hazırsınız. Bir sonraki bölümde, daha pratik uygulamalarla Docker’ı nasıl kullanacağınızı keşfedeceğiz.

İlk Docker Konteynerinizi Nasıl Çalıştırırsınız? Pratik Uygulamalar

Docker’ı Ubuntu sisteminize başarıyla kurduğunuza göre, şimdi sıra onu gerçek dünya senaryolarında kullanmaya geldi. Bu bölümde, basit bir Nginx web sunucusunu çalıştırmaktan kendi özel web uygulamanız için bir Docker imajı oluşturmaya kadar çeşitli pratik uygulamaları ele alacağız. Bu örnekler, Docker’ın gücünü ve esnekliğini anlamanıza yardımcı olacak ve konteynerleştirilmiş uygulamalarla çalışma konusunda size sağlam bir temel oluşturacaktır. Her adımda, kullanılan komutları ve bu komutların ne anlama geldiğini açıklayarak öğrenme sürecinizi kolaylaştıracağız.

Basit Bir Nginx Konteyneri Çalıştırmak

Bir web sunucusu çalıştırmak, Docker’ın en yaygın kullanım senaryolarından biridir. Nginx, hafif ve yüksek performanslı bir web sunucusu olduğu için bu tür bir örnek için mükemmel bir seçimdir. Aşağıdaki komut, Docker Hub’dan Nginx imajını çeker, ondan bir konteyner oluşturur ve onu arka planda çalıştırır. Ayrıca, ana bilgisayarınızın 80 numaralı portunu konteynerin 80 numaralı portuna eşleyerek dışarıdan erişilebilir hale getiririz.


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

Bu komutun bileşenlerini inceleyelim:

  • docker run: Yeni bir konteyner oluşturup çalıştırır.
  • -d (--detach): Konteyneri arka planda (detached mode) çalıştırır, böylece terminaliniz serbest kalır.
  • -p 80:80 (--publish): Ana bilgisayarın (host) 80 numaralı portunu konteynerin 80 numaralı portuna eşler. Böylece web tarayıcınızdan http://localhost adresine giderek Nginx sunucusuna erişebilirsiniz.
  • --name my-nginx: Konteynerinize okunabilir bir isim verir. Bu, birden fazla konteyneri yönetirken kolaylık sağlar.
  • nginx: Kullanılacak Docker imajının adıdır. Eğer yerel olarak bulunmuyorsa, Docker Hub’dan otomatik olarak çekilecektir.

Konteynerin çalışıp çalışmadığını kontrol etmek için aşağıdaki komutu kullanabilirsiniz:


docker ps
    

Bu komut, çalışan tüm konteynerleri listeler. Nginx konteynerinizi listede görmelisiniz. Şimdi web tarayıcınızı açın ve http://localhost adresine gidin. Nginx’in varsayılan “Welcome to nginx!” sayfasını görmelisiniz. Bu, ilk web sunucunuzu bir Docker konteynerinde başarıyla çalıştırdığınız anlamına gelir.

Konteyneri durdurmak ve kaldırmak için:


docker stop my-nginx
docker rm my-nginx
    

docker stop konteyneri durdururken, docker rm durdurulmuş bir konteyneri sistemden kaldırır. Bu komutlar, konteyner yaşam döngüsünü yönetmek için temel araçlardır.

Kendi Web Uygulamanız İçin Dockerfile Oluşturma

Hazır imajları kullanmak harika olsa da, genellikle kendi uygulamalarınızı konteynerize etmeniz gerekir. Bunun için Dockerfile adı verilen bir metin dosyası kullanırız. Bir Dockerfile, Docker’ın bir imajı nasıl inşa edeceğini adım adım talimatlarla anlatır. Aşağıda, basit bir Python Flask web uygulaması için bir Dockerfile örneği ve onu nasıl oluşturup çalıştıracağınız gösterilmiştir.

Vaka Analizi: Python Flask Uygulamasını Konteynerize Etme

Bir geliştirici, yerel makinesinde çalışan basit bir Python Flask uygulamasını Docker ile konteynerize etmek istiyor. Uygulama, kullanıcılara “Merhaba Docker!” mesajı gösteren tek bir sayfadan oluşuyor. Amacı, bu uygulamayı farklı ortamlara kolayca dağıtabilmek ve bağımlılık sorunlarından kaçınmak. İşte bunun için izleyeceği adımlar:

  1. Uygulama Dosyalarını Oluşturma:
    Öncelikle, uygulamanın kodunu içeren bir dizin oluşturulur (örneğin, my-flask-app).
    Bu dizinin içine app.py adında bir dosya ve requirements.txt adında bir bağımlılık dosyası oluşturulur.
    
    # app.py
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return "Merhaba Docker! Bu benim konteynerize edilmiş Flask uygulamam."
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
                
    
    # requirements.txt
    Flask==2.3.3
                
  2. Dockerfile Oluşturma:
    Aynı dizine (my-flask-app), Dockerfile adında bir dosya oluşturulur (dosya adı tam olarak ‘Dockerfile’ olmalı ve uzantısı olmamalıdır).
    
    # Dockerfile
    # Bir Python 3.9 tabanlı imaj kullan
    FROM python:3.9-slim-buster
    
    # Çalışma dizinini ayarla
    WORKDIR /app
    
    # Bağımlılıklar dosyasını kopyala
    COPY requirements.txt .
    
    # Bağımlılıkları yükle
    RUN pip install -r requirements.txt
    
    # Uygulama kodunu kopyala
    COPY . .
    
    # Uygulamanın çalışacağı portu belirt
    EXPOSE 5000
    
    # Uygulamayı başlat
    CMD ["python", "app.py"]
                

    Bu Dockerfile‘daki komutların açıklamaları:

    • FROM python:3.9-slim-buster: İmajımızın temelini belirler. Burada, Python 3.9’un hafif bir Debian (buster) sürümünü kullanıyoruz.
    • WORKDIR /app: Konteyner içinde çalışma dizinini /app olarak ayarlar. Sonraki tüm komutlar bu dizinde çalışır.
    • COPY requirements.txt .: Yerel makinenizdeki requirements.txt dosyasını konteynerin /app dizinine kopyalar.
    • RUN pip install -r requirements.txt: Konteyner içinde Python bağımlılıklarını yükler.
    • COPY . .: Yerel dizindeki tüm diğer dosyaları (yani app.py) konteynerin /app dizinine kopyalar.
    • EXPOSE 5000: Konteynerin 5000 numaralı portu dinlediğini belirtir. Bu bir belgeleme gibidir, gerçek port eşlemesini yapmaz.
    • CMD ["python", "app.py"]: Konteyner başlatıldığında çalıştırılacak komutu tanımlar. Bu, Flask uygulamasını başlatır.
  3. İmajı Oluşturma:
    my-flask-app dizininde terminali açın ve aşağıdaki komutu çalıştırarak Docker imajınızı oluşturun:
    
    docker build -t my-flask-app .
                

    -t my-flask-app: Oluşturulan imaja my-flask-app etiketini verir. Sondaki nokta (.), Dockerfile‘ın mevcut dizinde olduğunu belirtir.

  4. Konteyneri Çalıştırma:
    İmajı oluşturduktan sonra, ondan bir konteyner çalıştırabilirsiniz. Uygulama 5000 numaralı portta çalıştığı için, ana bilgisayarınızın bir portunu bu porta eşlememiz gerekir.
    
    docker run -d -p 5000:5000 --name flask-app my-flask-app
                

    Şimdi web tarayıcınızdan http://localhost:5000 adresine giderek uygulamanızın çalıştığını görebilirsiniz. Bu, kendi özel uygulamanızı başarıyla konteynerize ettiğiniz ve çalıştırdığınız anlamına gelir. Bu yöntem, uygulamanızın her ortamda tutarlı bir şekilde çalışmasını sağlar ve “Benim makinemde çalışıyor” sorununu ortadan kaldırır.

Bu pratik uygulamalar, Docker’ın nasıl çalıştığına dair sağlam bir fikir vermiştir. Konteynerler, geliştirme ve dağıtım süreçlerinizi basitleştirerek size büyük bir esneklik ve verimlilik sunar. Bir sonraki bölümde, daha karmaşık, çoklu konteyner uygulamalarını Docker Compose ile nasıl yöneteceğinizi inceleyeceğiz.

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

Modern uygulamalar genellikle tek bir bileşenden oluşmaz; veritabanları, ön uç sunucuları, arka uç API’leri ve önbellek sistemleri gibi birden fazla servisi bir araya getirirler. Bu tür çoklu konteyner uygulamalarını manuel olarak yönetmek karmaşık ve hataya açık olabilir. İşte tam da 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 depolama birimlerini yapılandırabilir ve tek bir komutla tüm uygulamayı başlatabilir veya durdurabilirsiniz. Bu, özellikle geliştirme ortamlarında ve CI/CD süreçlerinde büyük kolaylık sağlar.

Docker Compose Nedir ve Neden Kullanılır?

Docker Compose, birden fazla Docker konteynerini içeren uygulamaların yaşam döngüsünü yönetmek için tasarlanmıştır. Temel olarak, docker-compose.yml adlı bir YAML dosyası aracılığıyla uygulamanızın servislerini, her servisin kullanacağı imajı, port eşlemelerini, volume bağlamalarını, ortam değişkenlerini ve diğer yapılandırma detaylarını tanımlarsınız. Bu dosya, uygulamanızın tüm mimarisini tek bir yerde belgelemenizi ve yönetmenizi sağlar.

Docker Compose kullanmanın başlıca avantajları şunlardır:

  • Kolay Uygulama Tanımı: Tüm servisleri ve bağımlılıklarını tek bir dosyada tanımlarsınız.
  • Tek Komutla Yönetim: docker-compose up ile tüm uygulamayı tek komutla başlatabilir, docker-compose down ile durdurabilir ve kaldırabilirsiniz.
  • Geliştirme Ortamı Tutarlılığı: Geliştiriciler arasında ve farklı ortamlar arasında (geliştirme, test, üretim) tutarlı bir uygulama ortamı sağlar.
  • Servisler Arası Ağ İletişimi: Compose, servisler arasında varsayılan olarak bir ağ oluşturur, böylece servisler birbirleriyle isimleriyle iletişim kurabilir.
  • Verimlilik: Özellikle geliştirme ve test süreçlerinde kurulum ve dağıtım süresini önemli ölçüde azaltır.

Vaka Analizi: E-ticaret Uygulamasının Docker Compose ile Yönetilmesi

Bir e-ticaret uygulaması geliştirdiğinizi hayal edin. Bu uygulama genellikle aşağıdaki servislerden oluşur:

  • Web (Ön Uç): Kullanıcıların etkileşimde bulunduğu arayüz (örneğin, Nginx ile sunulan bir React uygulaması).
  • API (Arka Uç): İş mantığını içeren ve veritabanıyla etkileşime giren servis (örneğin, bir Node.js veya Python API).
  • Veritabanı: Ürün bilgileri, kullanıcı verileri vb. depolayan veritabanı (örneğin, PostgreSQL).

Bu servisleri tek tek manuel olarak başlatmak ve yönetmek yerine, Docker Compose ile hepsini bir araya getirebiliriz. İşte basit bir docker-compose.yml örneği:


# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./frontend/build:/usr/share/nginx/html
    depends_on:
      - api
    networks:
      - app-network

  api:
    build: ./backend
    ports:
      - "5000:5000"
    environment:
      DATABASE_URL: postgres://user:password@db:5432/mydatabase
    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

networks:
  app-network:
    driver: bridge

volumes:
  db-data:
    driver: local
    

Bu docker-compose.yml dosyasını açıklayalım:

  • version: '3.8': Compose dosyasının format sürümünü belirtir.
  • services:: Uygulamanızdaki her bir servisi tanımladığınız bölümdür.
    • web: Nginx tabanlı ön uç web sunucusu.
      • image: nginx:latest: En son Nginx imajını kullanır.
      • ports: - "80:80": Ana bilgisayarın 80 portunu konteynerin 80 portuna eşler.
      • volumes:: Yerel dizinleri konteyner içindeki dizinlere bağlar. Burada Nginx yapılandırması ve frontend build dosyaları eşlenir.
      • depends_on: - api: web servisinin api servisi başlamadan önce başlamayacağını belirtir (başlangıç sırasını garanti eder, sağlıklı çalışmayı değil).
    • api: Arka uç API servisi.
      • build: ./backend: Mevcut dizindeki backend klasöründe bulunan Dockerfile‘dan imajı inşa eder.
      • ports: - "5000:5000": API’nin portunu eşler.
      • environment:: Konteyner içine ortam değişkenleri tanımlar (veritabanı bağlantı bilgileri gibi).
      • depends_on: - db: API’nin veritabanı başlamadan önce başlamayacağını belirtir.
    • db: PostgreSQL veritabanı servisi.
      • image: postgres:13: PostgreSQL 13 imajını kullanır.
      • environment:: Veritabanı için gerekli ortam değişkenlerini ayarlar.
      • volumes: - db-data:/var/lib/postgresql/data: Veritabanı verilerini kalıcı olarak saklamak için bir Docker volume’u kullanır. Bu, konteyner kaldırılsa bile verilerin korunmasını sağlar.
  • networks:: Servisler arası iletişimi sağlayan özel bir ağ tanımlarız.
  • volumes:: Kalıcı veri depolama için Docker volume’larını tanımlarız.

Uygulamayı Başlatma, Durdurma ve Kaldırma

Bu docker-compose.yml dosyasını (ve ilgili nginx/conf.d, frontend/build, backend dizinlerini ve dosyalarını) projenizin kök dizinine yerleştirdikten sonra, terminalde o dizine giderek aşağıdaki komutlarla uygulamanızı yönetebilirsiniz:


# Tüm servisleri arka planda (detached mode) başlat
docker-compose up -d

# Çalışan servisleri listele
docker-compose ps

# Servis loglarını görüntüle (tüm servisler için)
docker-compose logs -f

# Tüm servisleri durdur ve kaldır (volume'lar hariç)
docker-compose down

# Tüm servisleri, ağları ve volume'ları kaldır
docker-compose down --volumes
    

docker-compose up -d komutu, tüm servisleri tanımladığınız şekilde oluşturur, ağları kurar ve arka planda çalıştırır. docker-compose down komutu ise tüm konteynerleri durdurur ve kaldırır. --volumes seçeneği ile veritabanı volume’u gibi kalıcı depolama birimlerini de kaldırabilirsiniz (dikkatli kullanın, veri kaybına yol açabilir!).

Docker Compose, özellikle mikroservis tabanlı uygulamaların geliştirilmesinde ve yerel geliştirme ortamlarının hızlı bir şekilde kurulmasında vazgeçilmez bir araçtır. Bu sayede, karmaşık uygulamaların tüm bileşenlerini tutarlı ve kolay bir şekilde yönetebilir, geliştirme sürecinizi hızlandırabilirsiniz. Bir sonraki bölümde, Docker kullanımınızı daha da optimize etmek için bazı ileri düzey ipuçları ve en iyi uygulamaları inceleyeceğiz.

Docker İpuçları ve En İyi Uygulamalar: Daha Verimli Çalışın

Docker’ı kurmayı ve temel düzeyde kullanmayı öğrendikten sonra, sıra daha verimli ve güvenli bir şekilde çalışmak için ileri düzey ipuçlarına ve en iyi uygulamalara geliyor. Bu bölümde, Docker imajlarınızın boyutunu optimize etmekten güvenlik pratiklerine, kaynak yönetiminden temizlik işlemlerine kadar çeşitli konuları ele alacağız. Bu teknikler, konteynerleştirilmiş uygulamalarınızın performansını artırmanıza, kaynak tüketimini azaltmanıza ve genel olarak Docker deneyiminizi geliştirmenize yardımcı olacaktır.

İmaj Boyutunu Optimize Etmek: Multi-Stage Build Nedir?

Docker imajlarının boyutu, dağıtım süresini, depolama maliyetini ve güvenlik risklerini doğrudan etkiler. Daha küçük imajlar daha hızlı çekilir, daha az yer kaplar ve saldırı yüzeyini azaltır. İmaj boyutunu küçültmenin en etkili yollarından biri “Multi-Stage Build” kullanmaktır.

Multi-stage build, bir Dockerfile içinde birden fazla FROM ifadesi kullanarak, imaj oluşturma sürecini farklı aşamalara ayırmanıza olanak tanır. Genellikle, ilk aşamada uygulamanın derlenmesi veya bağımlılıklarının yüklenmesi gibi geliştirme bağımlılıklarını içeren daha büyük bir imaj kullanılır. İkinci (veya son) aşamada ise, sadece uygulamanın çalışması için gereken nihai çıktılar (derlenmiş kod, statik dosyalar vb.) daha küçük, minimalist bir temel imaja kopyalanır. Bu sayede, geliştirme sırasında kullanılan derleyiciler, test araçları ve gereksiz bağımlılıklar nihai imaja dahil edilmez.

Örnek bir Node.js uygulaması için multi-stage build:


# Dockerfile (Multi-Stage Build Örneği)

# Aşama 1: Build Aşaması (Geliştirme bağımlılıklarını içerir)
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Aşama 2: Çalışma Zamanı Aşaması (Sadece uygulama ve çalışma zamanı)
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
CMD ["npm", "start"]
EXPOSE 3000
    

Bu örnekte, ilk aşamada (builder olarak adlandırılan) tüm npm install ve npm run build işlemleri yapılır. İkinci aşama ise, sadece nihai node_modules ve derlenmiş dist klasörünü kopyalayarak çok daha küçük bir çalışma zamanı imajı oluşturur. Bu teknik, imaj boyutunu önemli ölçüde azaltır.

Docker Güvenlik İpuçları

Konteynerler izole olsa da, güvenlik her zaman öncelikli olmalıdır. İşte bazı temel Docker güvenlik ipuçları:

  1. Minimal İmajlar Kullanın: alpine veya slim etiketli imajlar gibi minimalist temel imajlar kullanın. Bu imajlar, daha az paket içerdiği için saldırı yüzeyini daraltır.
  2. Root Olmayan Kullanıcılar Kullanın: Konteyner içinde uygulamayı çalıştırmak için root kullanıcısı yerine özel, ayrıcalıksız bir kullanıcı oluşturun.
    
    # Dockerfile içinde kullanıcı oluşturma örneği
    FROM ubuntu:latest
    RUN adduser --system --group appuser
    USER appuser
    CMD ["./my-app"]
                
  3. En Az Ayrıcalık Prensibi: Konteynerlere sadece ihtiyaç duydukları kaynaklara erişim izni verin. Örneğin, --cap-drop ALL --cap-add NET_BIND_SERVICE gibi komutlarla yetenekleri düşürebilirsiniz.
  4. Güvenlik Taraması Yapın: Docker Hub gibi platformlar, imajlarınızdaki bilinen güvenlik açıklarını taramanıza olanak tanır. Ayrıca, Clair veya Trivy gibi araçları CI/CD sürecinize entegre edebilirsiniz.
  5. Sürekli Güncel Tutun: Docker Engine’i ve kullandığınız temel imajları düzenli olarak güncelleyin. Güvenlik yamaları ve düzeltmeleri genellikle yeni sürümlerle birlikte gelir.

Uzman İpucu: Konteynerlerinizi düzenli olarak temizlemek, disk alanından tasarruf etmenizi ve gereksiz kaynak tüketimini önlemenizi sağlar. Kullanılmayan imajları, konteynerleri ve volume’ları temizlemek için docker system prune -a komutunu kullanabilirsiniz. Bu komut, durdurulmuş konteynerleri, kullanılmayan ağları, dangling imajları ve isteğe bağlı olarak tüm build cache’i temizler. Dikkatli kullanın, çünkü tüm kullanılmayan kaynakları kaldırır!

Konteyner Kaynak Yönetimi ve Temizlik

Büyük ölçekli ortamlarda veya yoğun kullanımda, konteynerlerin kaynak tüketimini yönetmek kritik hale gelir. Docker, konteynerlerin CPU ve bellek kullanımını sınırlamanıza olanak tanır.

  • Bellek Sınırlaması: -m veya --memory ile bellek limiti belirleyebilirsiniz. Örneğin, docker run -m 512m my-app konteynere 512 MB bellek sınırı koyar.
  • CPU Sınırlaması: --cpus ile CPU çekirdek sayısını, --cpu-shares ile CPU ağırlığını belirleyebilirsiniz. Örneğin, docker run --cpus 0.5 my-app konteynere yarım CPU çekirdeği ayırır.

Zamanla, sisteminizde çok sayıda kullanılmayan Docker imajı, durdurulmuş konteyner ve volume birikebilir. Bu, disk alanını tüketir ve performansı etkileyebilir. Düzenli temizlik yapmak önemlidir:


# Durdurulmuş tüm konteynerleri kaldır
docker container prune

# Kullanılmayan tüm imajları kaldır (hiçbir konteyner tarafından kullanılmayan)
docker image prune

# Hiçbir konteyner tarafından kullanılmayan tüm volume'ları kaldır
docker volume prune

# Yukarıdakilerin hepsini ve daha fazlasını temizle (dikkatli kullanın!)
docker system prune
# Tüm durdurulmuş konteynerleri, kullanılmayan ağları, dangling imajları ve isteğe bağlı olarak tüm build cache'i temizler.
# Tüm kullanılmayan imajları (dangling ve hiç bir konteyner tarafından referans alınmayan) kaldırmak için:
docker system prune -a
    

Bu komutlar, Docker ortamınızı düzenli ve optimize tutmanıza yardımcı olur. Özellikle docker system prune -a komutu, disk alanını geri kazanmak için oldukça etkilidir, ancak dikkatli kullanılmalıdır çünkü geri dönüşü olmayan bir temizlik yapar. Bu ipuçları ve en iyi uygulamalarla Docker kullanımınızı daha profesyonel bir seviyeye taşıyabilir, uygulamalarınızın daha güvenli, verimli ve ölçeklenebilir olmasını sağlayabilirsiniz.

Sonuç: Docker ile Geliştirme Süreçlerinizi Dönüştürün

Bu kapsamlı rehber boyunca, Ubuntu üzerinde Docker’ın kurulumundan temel kullanımına, çoklu konteyner uygulamalarını yönetmekten ileri düzey optimizasyon ve güvenlik ipuçlarına kadar birçok konuyu ele aldık. “Benim makinemde çalışıyor!” sorununa veda ederek, uygulamalarınızı her ortamda tutarlı bir şekilde çalıştırabilmenizi sağlayan konteyner teknolojisinin temel prensiplerini ve pratik uygulamalarını derinlemesine inceledik. Docker’ın sunduğu esneklik, verimlilik ve taşınabilirlik, modern yazılım geliştirme ve dağıtım süreçlerinin vazgeçilmez bir parçası haline gelmiştir.

Docker, sadece uygulamaları paketlemekle kalmaz, aynı zamanda geliştirme, test ve üretim ortamları arasındaki boşluğu kapatarak DevOps kültürünün benimsenmesini hızlandırır. Geliştiricilerin daha hızlı kod yazmasına ve dağıtmasına olanak tanırken, operasyon ekiplerinin de uygulamaları daha güvenli ve tutarlı bir şekilde yönetmesini sağlar. İster küçük bir proje üzerinde çalışan bağımsız bir geliştirici olun, ister büyük ölçekli bir kurumsal uygulamayı yöneten bir ekip üyesi, Docker’ın sunduğu avantajlar yadsınamaz. İmaj boyutlarını optimize etmek için multi-stage build’ler kullanmak, güvenlik açıklarını azaltmak için root olmayan kullanıcılar çalıştırmak ve sistem kaynaklarını düzenli olarak temizlemek gibi en iyi uygulamaları benimsemek, Docker deneyiminizi daha da zenginleştirecektir.

Gelecekte, konteyner teknolojisinin ve özellikle Docker’ın önemi daha da artacak gibi görünüyor. Mikroservis mimarileri, bulut tabanlı dağıtımlar ve CI/CD otomasyonları gibi modern yazılım trendleri, konteynerlerin merkezi bir rol oynamasını gerektiriyor. Kubernetes gibi konteyner orkestrasyon araçları ile entegrasyonu sayesinde, Docker konteynerleri büyük ölçekli, dağıtık sistemlerin yönetiminde de kilit bir rol oynamaya devam edecektir. Bu nedenle, Docker’ı öğrenmek ve ustalaşmak, günümüz ve geleceğin yazılım dünyasında rekabetçi kalmak için kritik bir beceridir. Umarız bu rehber, Docker yolculuğunuzda size sağlam bir başlangıç noktası sunmuştur ve konteyner teknolojisinin sunduğu sınırsız potansiyeli keşfetmenize ilham vermiştir.

Sıkça Sorulan Sorular (SSS)

Docker ve konteyner teknolojisi hakkında sıkça karşılaşılan bazı sorular ve yanıtları:

Soru Cevap
Docker ücretsiz mi? Evet, Docker’ın topluluk sürümü (Docker Community Edition – Docker CE) açık kaynaklı ve ücretsizdir. İşletmeler için ek özellikler sunan ücretli sürümleri (Docker Desktop Business vb.) de bulunmaktadır.
Docker ile sanal makine arasındaki fark nedir? Sanal makineler (VM’ler), her biri kendi işletim sistemini içeren tam teşekküllü sanal donanım katmanları üzerinde çalışır. Docker konteynerleri ise ana bilgisayarın işletim sistemini paylaşır ve sadece uygulamanın çalışması için gereken bağımlılıkları içerir. Bu, konteynerleri VM’lerden çok daha hafif, hızlı ve verimli yapar.
Docker konteynerleri güvenli midir? Konteynerler, uygulamalar için bir izolasyon katmanı sağlar ve bu da güvenliği artırır. Ancak, imajlarınızı güvenilir kaynaklardan almak, root olmayan kullanıcılar kullanmak, en az ayrıcalık prensibini uygulamak ve imajları düzenli olarak güvenlik açıklarına karşı taramak gibi en iyi uygulamaları takip etmek önemlidir.
Konteynerleri nasıl yedeklerim? Konteynerlerin kendisi genellikle geçicidir. Önemli olan, konteynerlerinizin oluşturulduğu Docker imajlarını ve konteynerlerin kullandığı kalıcı verileri (Docker volume’ları) yedeklemektir. Docker Hub gibi kayıt defterlerine imajlarınızı yükleyebilir ve volume’lardaki verileri düzenli olarak ana bilgisayarınıza veya harici bir depolama çözümüne yedekleyebilirsiniz.
Docker Hub nedir? Docker Hub, Docker imajları için bulut tabanlı bir kayıt defteridir (registry). Geliştiricilerin imajları depolamasına, paylaşmasına ve bulmasına olanak tanır. Binlerce hazır imajı barındırır ve kendi özel imajlarınızı genel veya özel olarak depolayabilirsiniz.


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