Takip et

Docker Nedir ve Neden Ubuntu’da Kullanmalısınız? Konteynerleşmenin Gücü

Ubuntu’ya Docker Kurulumu: Adım Adım Kapsamlı Rehber

Modern yazılım geliştirme ve dağıtım süreçlerinde devrim yaratan Docker, uygulamaları izole edilmiş, taşınabilir ve tutarlı ortamlarda çalıştırmanın anahtarıdır. Peki, bu güçlü aracı popüler işletim sistemi Ubuntu’nuza nasıl kurarsınız? Bu kapsamlı rehberde, Docker’ı Ubuntu sisteminize adım adım kurmayı, temel komutları öğrenmeyi ve hatta ileri düzey kullanım ipuçlarını keşfetmeyi öğreneceksiniz.

Docker Nedir ve Neden Ubuntu’da Kullanmalısınız? Konteynerleşmenin Gücü

Günümüzün hızla değişen teknoloji dünyasında, yazılım geliştiricilerin ve sistem yöneticilerinin karşılaştığı en büyük zorluklardan biri, uygulamaların farklı ortamlarda tutarlı bir şekilde çalışmasını sağlamaktır. “Benim makinemde çalışıyordu!” cümlesi, bu sorunun klasik bir ifadesidir. İşte tam bu noktada Docker devreye girer. Docker, uygulamaları bağımlılıklarıyla birlikte “konteyner” adı verilen hafif, taşınabilir ve izole edilmiş birimlerde paketlemeye yarayan açık kaynaklı bir platformdur. Geleneksel sanal makinelerin (VM) aksine, Docker konteynerleri ana işletim sisteminin çekirdeğini paylaşır. Bu sayede, VM’lere göre çok daha az kaynak tüketirler, daha hızlı başlarlar ve daha verimlidirler.

Peki, Docker’ı neden özellikle Ubuntu’da kullanmalısınız? Ubuntu, sunucu ortamlarında ve geliştirme iş istasyonlarında en yaygın kullanılan Linux dağıtımlarından biridir. Geniş topluluk desteği, güncel paket depoları ve güçlü komut satırı araçları sayesinde Docker ile mükemmel bir uyum içindedir. Birçok geliştirici ve DevOps mühendisi, Ubuntu’yu hem yerel geliştirme ortamı olarak hem de bulut sunucularında tercih eder. Bu durum, Docker’ın Ubuntu üzerinde kurulumunu ve yönetimini oldukça kolay ve sorunsuz hale getirir. Ayrıca, Docker’ın resmi dokümantasyonu ve topluluk kaynakları genellikle Ubuntu odaklı örnekler içerir, bu da sorun giderme ve öğrenme süreçlerini hızlandırır. Konteynerleşme sayesinde, geliştirme ortamınızda bir PHP uygulamasını, test ortamınızda bir Node.js uygulamasını ve üretimde bir Python mikroservisini aynı Ubuntu sunucusu üzerinde, birbirlerini etkilemeden çalıştırabilirsiniz. Bu esneklik, özellikle karmaşık ve çok dilli projelerde paha biçilmezdir.

Vaka Analizi: Mikroservis Mimarisine Geçiş

Bir e-ticaret şirketi, monolitik bir uygulamadan mikroservis mimarisine geçiş yapmaya karar verdi. Bu geçiş, farklı programlama dillerinde yazılmış birçok bağımsız servisin (ödeme, ürün kataloğu, kullanıcı yönetimi vb.) bir arada çalışmasını gerektiriyordu. Her servisin kendine özgü bağımlılıkları ve çalışma zamanı gereksinimleri vardı. Ubuntu sunucularında Docker’ı kullanarak, her mikroservisi kendi izole konteynerinde çalıştırdılar. Bu yaklaşım, her servisin bağımsız olarak geliştirilmesini, test edilmesini ve dağıtılmasını sağladı. Ayrıca, kaynakları daha verimli kullanabildiler ve bir servisteki hata diğerlerini etkilemeden izole edilebildi. Docker’ın Ubuntu üzerindeki tutarlı performansı ve kolay yönetilebilirliği, bu karmaşık geçişin başarıyla tamamlanmasında kritik bir rol oynadı.

Docker Kurulumuna Başlamadan Önce: Ön Hazırlıklar ve Sistem Gereksinimleri

Herhangi bir yazılım kurulumuna başlamadan önce, sisteminizin gerekli ön koşulları karşıladığından emin olmak önemlidir. Bu, potansiyel sorunları önler ve kurulum sürecini çok daha pürüzsüz hale getirir. Ubuntu’ya Docker kurarken dikkat etmeniz gereken ilk ve en önemli adım, sisteminizi güncel tutmaktır. Güncel olmayan paketler veya eski çekirdek sürümleri, Docker’ın düzgün çalışmasını engelleyebilir veya güvenlik açıkları oluşturabilir. Bu nedenle, terminali açarak aşağıdaki komutları çalıştırmalısınız:


sudo apt update
sudo apt upgrade -y

Bu komutlar, sisteminizdeki paket listelerini günceller ve mevcut tüm yüklü paketleri en son sürümlerine yükseltir. sudo apt upgrade -y komutundaki -y bayrağı, tüm yükseltme onay sorularına otomatik olarak “evet” yanıtı vermenizi sağlar. Bu işlem biraz zaman alabilir, bu yüzden sabırlı olun. Yükseltme tamamlandıktan sonra, bazı durumlarda çekirdek güncellemeleri için sisteminizi yeniden başlatmanız gerekebilir. Eğer çekirdek güncellendiyse, sudo reboot komutu ile sisteminizi yeniden başlatmanız şiddetle tavsiye edilir.

Docker kurulumu için bir diğer önemli ön hazırlık, daha önce sisteminizde kurulu olabilecek eski Docker sürümlerini kaldırmaktır. Eğer daha önce Docker’ın test veya beta sürümlerini denediyseniz veya farklı bir kurulum yöntemi kullandıysanız, bu eski paketler yeni kurulumla çakışabilir. Eski Docker paketlerini kaldırmak için aşağıdaki komutları kullanabilirsiniz:


for pkg in docker.io docker-doc docker-compose docker-ce docker-ce-cli containerd.io docker-compose-plugin; do sudo apt remove $pkg; done
sudo apt autoremove -y

Bu komutlar, bilinen tüm Docker ile ilgili paketleri sisteminizden kaldırır ve ardından gereksiz bağımlılıkları temizler. Bu adımı atlamak, özellikle farklı kaynaklardan yüklenmiş Docker bileşenleri varsa, beklenmedik hatalara yol açabilir. Son olarak, Docker’ın resmi deposunu ekleyebilmek ve güvenli bir şekilde paketleri indirebilmek için bazı temel bağımlılık paketlerine ihtiyacımız var. Bu paketler genellikle modern Ubuntu sistemlerinde mevcut olsa da, her ihtimale karşı kurmakta fayda var:


sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

apt-transport-https paketi, APT’nin HTTPS üzerinden paket depolarına erişmesini sağlar. ca-certificates paketi, SSL/TLS sertifikalarını doğrulamak için gereklidir. curl, URL’lerden veri transferi için kullanılan güçlü bir araçtır ve gnupg ise GPG anahtarlarını yönetmek için kullanılır. lsb-release ise işletim sistemi dağıtım bilgilerini sorgulamak için kullanılır ve Docker deposunu doğru şekilde yapılandırmak için gereklidir. Tüm bu ön hazırlık adımlarını tamamladıktan sonra, Docker Engine’in Ubuntu sisteminize sorunsuz bir şekilde kurulmasına hazırsınız demektir.

Uzman İpucu: Sisteminizin güncel olması ve eski Docker bileşenlerinin temizlenmesi, olası uyumluluk sorunlarının önüne geçmenin ve güvenli bir kurulum sağlamanın ilk ve en kritik adımıdır. Bu adımları atlamak, ileride zaman kaybettirici sorunlara yol açabilir.

Ubuntu’ya Docker Engine Nasıl Kurulur? Resmi Yöntem Adım Adım

Docker’ı Ubuntu’ya kurmanın en güvenli ve önerilen yolu, Docker’ın resmi deposunu kullanmaktır. Bu yöntem, her zaman en güncel ve kararlı Docker sürümünü almanızı sağlar. İşte adım adım kurulum süreci:

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

Güvenlik nedeniyle, indirilen paketlerin orijinalliğini doğrulamak için Docker’ın resmi GPG anahtarını sisteminize eklemeniz gerekir. Bu, indirdiğiniz paketlerin gerçekten Docker tarafından yayınlandığını ve değiştirilmediğini garanti eder.


curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Bu komut, curl kullanarak Docker’ın GPG anahtarını indirir ve gpg --dearmor ile anahtarı uygun bir formata dönüştürerek /usr/share/keyrings/docker-archive-keyring.gpg konumuna kaydeder. sudo kullanmamızın nedeni, bu dizinin kök kullanıcı yetkileri gerektirmesidir. Bu anahtar, daha sonra ekleyeceğimiz Docker deposundan gelen paketlerin doğrulanmasında kullanılacaktır.

2. Docker Deposunu APT Kaynaklarına Ekleme

GPG anahtarını ekledikten sonra, APT paket yöneticinizin Docker paketlerini nereden indireceğini bilmesi için Docker deposunu sisteminize eklemelisiniz. Bu adım, Ubuntu sürümünüze ve sistem mimarinize uygun Docker paketlerini almanızı sağlar.


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

Bu karmaşık görünen komut aslında oldukça basittir:

  • $(dpkg --print-architecture): Sisteminizin mimarisini (örneğin, amd64 veya arm64) otomatik olarak algılar.
  • signed-by=/usr/share/keyrings/docker-archive-keyring.gpg: Depodan indirilecek paketlerin, daha önce eklediğimiz GPG anahtarı ile imzalanmış olması gerektiğini belirtir.
  • https://download.docker.com/linux/ubuntu: Docker’ın Ubuntu için resmi deposunun URL’sidir.
  • $(lsb_release -cs): Ubuntu sürümünüzün kod adını (örneğin, focal veya jammy) otomatik olarak algılar. Bu, doğru depoyu hedeflememizi sağlar.
  • stable: Kararlı (stable) Docker sürümünü kullanacağımızı belirtir. İsterseniz test veya nightly gibi başka kanalları da kullanabilirsiniz, ancak genellikle stable tercih edilir.
  • sudo tee /etc/apt/sources.list.d/docker.list: Bu satırı /etc/apt/sources.list.d/docker.list dosyasına yazar. Bu dosya, APT’nin ek paket depolarını tanımladığı yerdir.
  • > /dev/null: tee komutunun çıktısını terminalde göstermemesini sağlar.

3. APT Paket Listesini Güncelleme

Yeni depoyu ekledikten sonra, APT’nin bu depoyu tanıması ve paket listesini güncellemesi gerekir:


sudo apt update

Bu komut, yeni eklediğiniz Docker deposundaki paket bilgilerini de indirir ve yerel paket önbelleğinizi günceller.

4. Docker Engine’i Kurma

Artık Docker Engine’i ve ilgili bileşenleri kurmaya hazırsınız. Aşağıdaki komut, Docker Engine, CLI (Komut Satırı Arayüzü), containerd (konteyner çalışma zamanı) ve Docker Compose eklentisini kuracaktır:


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

Bu komut, Docker ekosisteminin temel bileşenlerini sisteminize kurar. docker-ce Docker Engine’in kendisidir (Community Edition), docker-ce-cli Docker komutlarını çalıştırmak için kullanılan komut satırı arayüzüdür, containerd.io konteynerleri yöneten düşük seviyeli bir çalışma zamanıdır ve docker-compose-plugin ise Docker Compose’un yeni nesil versiyonudur.

5. Kurulumu Doğrulama

Kurulumun başarılı olup olmadığını kontrol etmek için Docker servisinin durumunu kontrol edebilir ve bir test konteyneri çalıştırabilirsiniz:


sudo systemctl status docker

Bu komut, Docker servisinin aktif (running) olup olmadığını gösterir. Çıktıda Active: active (running) ifadesini görmelisiniz. Ardından, Docker’ın doğru şekilde çalıştığını test etmek için “hello-world” imajını çalıştıralım:


sudo docker run hello-world

Eğer her şey yolundaysa, bu komut Docker’ın “hello-world” imajını indirir (eğer yoksa) ve bir konteyner içinde çalıştırır. Terminalde “Hello from Docker!” mesajını içeren bir çıktı görmelisiniz. Bu mesaj, Docker kurulumunuzun başarıyla tamamlandığını gösterir. Artık Ubuntu sisteminizde Docker’ı kullanmaya hazırsınız!

Kullanıcıyı Docker Grubuna Ekleme: sudo Kullanmadan Docker Çalıştırma

Yukarıdaki adımları tamamladıktan sonra Docker komutlarını çalıştırmak için her seferinde sudo kullanmak zorunda kalacaksınız. Bu, geliştirme süreçlerinde veya sık kullanılan komutlarda pratik olmayabilir. sudo kullanmadan Docker komutlarını çalıştırabilmek için, mevcut kullanıcınızı docker grubuna eklemeniz gerekir. Docker kurulumu sırasında otomatik olarak docker adında bir Unix grubu oluşturulur ve bu gruba ait kullanıcılar, Docker daemon’u ile doğrudan etkileşime girebilir.

Kullanıcınızı docker grubuna eklemek için aşağıdaki komutu çalıştırın:


sudo usermod -aG docker $USER

Burada:

  • sudo usermod: Bir kullanıcının özelliklerini değiştirmek için kullanılan komuttur.
  • -aG: Kullanıcıyı belirtilen gruba ekler (-a append, -G group).
  • docker: Kullanıcının ekleneceği grubun adıdır.
  • $USER: Mevcut oturum açmış kullanıcınızın adını otomatik olarak alır.

Bu komutu çalıştırdıktan sonra, değişikliğin etkili olması için oturumu kapatıp tekrar açmanız veya aşağıdaki komutu kullanarak grup üyeliğinizi yenilemeniz gerekir:


newgrp docker

Artık sudo kullanmadan Docker komutlarını çalıştırabilmelisiniz. Bunu test etmek için tekrar hello-world konteynerini çalıştırabilirsiniz:


docker run hello-world

Eğer hala sudo hatası alıyorsanız, sisteminizi tamamen yeniden başlatmanız gerekebilir. Bu adım, Docker ile daha rahat ve verimli bir çalışma deneyimi için oldukça önemlidir.

Docker ile Çalışmaya Başlama: Temel Komutlar ve İlk Konteyneriniz

Docker’ı başarıyla kurduğunuza göre, artık konteyner dünyasına ilk adımlarınızı atabilirsiniz. Docker ile etkileşim kurmak için kullanılan temel komutlar, imajları indirme, konteynerleri çalıştırma, listeleme, durdurma ve silme gibi işlemleri kapsar. Bu bölümde, Docker’ın temel komutlarını ve nasıl kullanılacaklarını pratik örneklerle öğreneceğiz.

1. Docker İmajlarını Çekme (Pull)

Bir konteyner çalıştırmadan önce, ona temel oluşturacak bir “imaj”a ihtiyacınız vardır. Docker imajları, bir uygulamanın çalışması için gerekli tüm kod, çalışma zamanı, sistem araçları, kütüphaneler ve ayarları içeren salt okunur şablonlardır. İmajları genellikle Docker Hub gibi herkese açık depolardan çekeriz.


docker pull ubuntu:latest

Bu komut, Docker Hub’dan en son Ubuntu işletim sistemi imajını indirir. :latest etiketi, imajın en güncel sürümünü ifade eder. Farklı bir sürüm çekmek isterseniz, örneğin ubuntu:20.04 gibi bir etiket belirtebilirsiniz. İmaj indirme işlemi, internet hızınıza bağlı olarak biraz zaman alabilir.

2. Konteyner Çalıştırma (Run)

Bir imajı indirdikten sonra, bu imajdan bir veya daha fazla “konteyner” oluşturup çalıştırabilirsiniz. Konteyner, imajın çalıştırılabilir bir örneğidir. Aşağıdaki komut, indirdiğimiz Ubuntu imajından bir konteyner başlatır ve içinde interaktif bir kabuk (shell) açar:


docker run -it ubuntu /bin/bash

Bu komuttaki parametreleri inceleyelim:

  • -i: İnteraktif (interactive) modu etkinleştirir, böylece konteynerin standart girişini açık tutar.
  • -t: Bir sahte TTY (terminal) tahsis eder. Bu iki parametre (-it), konteyner içinde bir kabuk açıp komutları girmenizi sağlar.
  • ubuntu: Çalıştırılacak imajın adıdır.
  • /bin/bash: Konteyner başlatıldığında çalıştırılacak komuttur. Bu durumda, Ubuntu konteynerinin içinde bir Bash kabuğu açar.

Bu komutu çalıştırdığınızda, terminaliniz konteynerin kabuğuna geçecek ve komut istemi değişecektir (örneğin, root@:/#). Artık bu konteyner içinde Ubuntu’ya özgü komutları çalıştırabilirsiniz. Konteynerden çıkmak için exit yazıp Enter tuşuna basmanız yeterlidir. Konteynerden çıktığınızda, konteyner otomatik olarak durdurulur.

3. Çalışan ve Durmuş Konteynerleri Listeleme (ps)

Hangi konteynerlerin çalıştığını veya daha önce çalıştırıldığını görmek için docker ps komutunu kullanabilirsiniz:


docker ps          # Sadece çalışan konteynerleri listeler
docker ps -a       # Tüm konteynerleri (çalışan ve durmuş) listeler

docker ps -a çıktısında, her konteynerin ID’si, kullandığı imaj, çalıştırdığı komut, oluşturulma zamanı, durumu ve rastgele atanan bir adı gibi bilgiler yer alır.

4. Konteynerleri Durdurma (Stop)

Çalışan bir konteyneri durdurmak için konteyner ID’sini veya adını kullanabilirsiniz:


docker stop 

Örneğin, docker ps çıktısında upbeat_shannon adında bir konteyneriniz varsa, docker stop upbeat_shannon komutunu kullanabilirsiniz.

5. Konteynerleri Silme (Remove)

Durdurulmuş bir konteyneri sisteminizden kaldırmak için docker rm komutunu kullanın:


docker rm 

Eğer çalışan bir konteyneri silmeye çalışırsanız, Docker size hata verecektir. Önce konteyneri durdurmanız veya -f (force) bayrağını kullanarak zorla silmeniz gerekir (ancak bu genellikle önerilmez): docker rm -f .

6. İmajları Silme (Rmi)

İhtiyaç duymadığınız imajları sisteminizden kaldırmak için docker rmi komutunu kullanabilirsiniz:


docker rmi ubuntu:latest

Bir imajı silmeden önce, o imajdan oluşturulmuş hiçbir konteynerin çalışmadığından veya var olmadığından emin olmalısınız. Aksi takdirde, Docker imajı silmenize izin vermeyecektir.

Uzman İpucu: Docker komutlarını öğrenirken, her komutun ne işe yaradığını ve hangi parametreleri aldığını anlamak için docker --help komutunu kullanmaktan çekinmeyin. Örneğin, docker run --help size run komutu hakkında detaylı bilgi verecektir. Bu, öğrenme sürecinizi hızlandıracaktır.

Docker Compose ile Çoklu Konteyner Uygulamalarını Yönetme

Gerçek dünya uygulamaları genellikle tek bir konteynerden oluşmaz; bir web sunucusu, bir veritabanı, bir önbellek servisi ve belki de bir mesaj kuyruğu gibi birden fazla servisin bir araya gelmesiyle çalışır. Bu tür çoklu konteyner uygulamalarını manuel olarak yönetmek (her bir konteyneri ayrı ayrı başlatmak, ağlarını yapılandırmak vb.) oldukça zahmetli ve hataya açık bir süreçtir. İşte bu noktada Docker Compose devreye girer. Docker Compose, birden fazla Docker konteynerini içeren uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. Tek bir YAML dosyası (docker-compose.yml) kullanarak uygulamanızın tüm servislerini, ağlarını ve volume’lerini yapılandırabilir ve tek bir komutla (docker compose up) tüm uygulamayı başlatabilirsiniz.

Docker Compose’un temel avantajları şunlardır:

  • Kolay Tanımlama: Tüm uygulama yığınınızı tek bir YAML dosyasında tanımlayarak karmaşıklığı azaltır.
  • Tek Komutla Başlatma: Tüm servisleri tek bir komutla başlatabilir, durdurabilir ve yeniden oluşturabilirsiniz.
  • İzole Ortamlar: Her servis kendi konteynerinde çalışır ve varsayılan olarak birbirleriyle iletişim kurabilirler.
  • Taşınabilirlik: docker-compose.yml dosyası, uygulamanızın farklı ortamlarda (geliştirme, test, üretim) tutarlı bir şekilde çalışmasını sağlar.

Şimdi, basit bir Nginx web sunucusu ve PostgreSQL veritabanından oluşan bir uygulamayı Docker Compose ile nasıl yöneteceğimize dair bir örnek oluşturalım. İlk olarak, projeniz için bir dizin oluşturun ve içine docker-compose.yml adında bir dosya yaratın:


mkdir my_web_app
cd my_web_app
touch docker-compose.yml

Ardından, docker-compose.yml dosyasını favori metin düzenleyicinizle açın ve aşağıdaki içeriği yapıştırın:


# docker-compose.yml örneği
version: '3.8' # Docker Compose dosya formatının versiyonu

services: # Uygulamamızdaki servisleri tanımladığımız bölüm
  web: # Nginx web sunucusu servisi
    image: nginx:latest # Kullanılacak Nginx imajı
    ports:
      - "80:80" # Ana makinenin 80. portunu konteynerin 80. portuna yönlendir
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf # Ana makinedeki nginx.conf dosyasını konteyner içine bağla
    depends_on: # Bu servisin başlamadan önce db servisinin başlamasını bekle
      - db

  db: # PostgreSQL veritabanı servisi
    image: postgres:13 # Kullanılacak PostgreSQL imajı (versiyon 13)
    environment: # Konteyner için ortam değişkenleri
      POSTGRES_DB: mydatabase # Veritabanı adı
      POSTGRES_USER: user # Veritabanı kullanıcı adı
      POSTGRES_PASSWORD: password # Veritabanı parolası
    volumes:
      - db_data:/var/lib/postgresql/data # Veritabanı verilerini kalıcı olarak depolamak için volume kullan
    healthcheck: # Veritabanı servisinin hazır olup olmadığını kontrol et
      test: ["CMD-SHELL", "pg_isready -U user -d mydatabase"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes: # Tanımlanan volume'leri belirt
  db_data: # db_data adında bir volume oluşturulacak

Bu docker-compose.yml dosyası iki servisi tanımlar: web (Nginx) ve db (PostgreSQL). web servisi, ana makinenin 80. portunu konteynerin 80. portuna bağlar ve bir Nginx yapılandırma dosyasını konteyner içine mount eder. db servisi ise veritabanı adını, kullanıcı adını ve parolasını ortam değişkenleri olarak ayarlar ve veritabanı verileri için kalıcı bir volume kullanır. depends_on anahtar kelimesi, web servisinin db servisi başlamadan önce başlatılmamasını sağlar. Ayrıca healthcheck ile veritabanının gerçekten kullanıma hazır olup olmadığını kontrol ediyoruz.

Nginx için özel bir yapılandırma dosyası da oluşturalım. my_web_app dizininin içine nginx.conf adında bir dosya oluşturun ve içine basit bir Nginx yapılandırması ekleyin:


# nginx.conf örneği
events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        location / {
            return 200 "Merhaba Docker Compose!\n";
            add_header Content-Type text/plain;
        }
    }
}

Bu Nginx yapılandırması, gelen tüm istekleri “Merhaba Docker Compose!” metniyle yanıtlayacaktır.

Şimdi, bu uygulamayı başlatmak için my_web_app dizininde aşağıdaki komutu çalıştırın:


docker compose up -d

Buradaki -d bayrağı, konteynerleri arka planda (detached mode) çalıştırmanızı sağlar, böylece terminaliniz serbest kalır. Docker Compose, gerekli imajları indirecek (eğer yoksa), servisleri oluşturacak ve başlatacaktır. Servislerin durumunu görmek için docker compose ps komutunu kullanabilirsiniz. Uygulamanızın çalıştığını doğrulamak için web tarayıcınızdan http://localhost adresine gidin. “Merhaba Docker Compose!” mesajını görmelisiniz.

Uygulamayı durdurmak ve tüm servis konteynerlerini kaldırmak için (volume’lar hariç):


docker compose down

Eğer volume’ları da kaldırmak isterseniz: docker compose down --volumes. Docker Compose, karmaşık uygulamaları yönetmeyi inanılmaz derecede kolaylaştıran güçlü bir araçtır ve modern geliştirme iş akışlarının vazgeçilmez bir parçasıdır.

İleri Seviye Docker Kullanımı ve İpuçları: Performans ve Güvenlik

Docker’ı kurup temel komutları öğrendikten sonra, daha verimli ve güvenli bir şekilde kullanmak için bazı ileri seviye konulara ve ipuçlarına değinmek faydalı olacaktır. Bu bölümde, kalıcı veri depolama, ağ yapılandırması, Dockerfile en iyi uygulamaları ve güvenlik konularını ele alacağız.

1. Kalıcı Veri Depolama (Volumes ve Bind Mounts)

Varsayılan olarak, bir Docker konteyneri silindiğinde, içinde oluşturduğu tüm veriler de kaybolur. Bu durum, veritabanları veya kullanıcı tarafından yüklenen dosyalar gibi kalıcı olması gereken veriler için bir sorun teşkil eder. Docker, bu sorunu çözmek için iki ana mekanizma sunar: Volumes ve Bind Mounts.

  • Volumes: Docker tarafından yönetilen, ana makine üzerinde özel bir alanda depolanan veri birimleridir. Konteynerler arasında kolayca taşınabilir, yedeklenebilir ve yönetilebilirler. Genellikle veritabanı verileri gibi kritik veriler için tercih edilirler.
  • Bind Mounts: Ana makine üzerindeki belirli bir dizini doğrudan konteyner içine bağlar. Bu, geliştirme sırasında kod dosyalarını konteynere aktarmak veya yapılandırma dosyalarını yönetmek için kullanışlıdır.

Bir volume oluşturmak ve kullanmak için:


docker volume create my_data_volume
docker run -d --name my_db_container -v my_data_volume:/var/lib/mysql mysql:latest

Bu örnekte, my_data_volume adında bir volume oluşturulur ve my_db_container adlı MySQL konteynerinin /var/lib/mysql dizinine bağlanır. Böylece konteyner silinse bile veritabanı verileri my_data_volume içinde kalıcı olarak saklanır.

2. Ağ Yapılandırması (Networking)

Docker, konteynerler arasında ve konteynerler ile ana makine arasında iletişimi sağlamak için güçlü ağ özelliklerine sahiptir. Varsayılan olarak, Docker üç ana ağ sürücüsü sunar:

  • Bridge: Konteynerler için özel, dahili bir ağ oluşturur ve konteynerlerin birbirleriyle ve ana makineyle iletişim kurmasını sağlar. (docker run komutunda varsayılan ağdır.)
  • Host: Konteynerin ağ yığınını doğrudan ana makinenin ağ yığınıyla paylaşmasını sağlar. Bu, en iyi performansı sunar ancak izolasyonu azaltır.
  • None: Konteynerin hiçbir ağ arayüzüne sahip olmamasını sağlar.

Kendi özel ağlarınızı oluşturarak konteynerlerinizi daha iyi izole edebilir ve yönetebilirsiniz:


docker network create my_custom_network
docker run -d --name web_server --network my_custom_network nginx:latest
docker run -d --name app_server --network my_custom_network my_app_image

Bu sayede web_server ve app_server konteynerleri my_custom_network ağı üzerinden birbirleriyle isimleriyle iletişim kurabilirler (örneğin, app_server konteynerinden web_server‘a ping web_server yapabilirsiniz).

3. Dockerfile En İyi Uygulamaları

Kendi özel imajlarınızı oluşturmak için Dockerfile’lar kullanırsınız. Verimli, güvenli ve küçük imajlar oluşturmak için bazı en iyi uygulamalar şunlardır:

  • Çok Aşamalı Yapılandırmalar (Multi-stage builds): Geliştirme bağımlılıklarını ve ara dosyaları nihai imajdan ayırarak imaj boyutunu küçültün.
  • Önbellekleme Katmanlarını Kullanma: Dockerfile komutlarını değiştirme olasılığı en düşük olandan en yükseğe doğru sıralayın (örneğin, bağımlılıkları yüklemeden önce uygulama kodunu kopyalayın).
  • En Az Yetki Prensibi: Konteyner içinde root kullanıcısı yerine özel, yetkisiz bir kullanıcı oluşturun ve uygulamayı bu kullanıcıyla çalıştırın.
  • Küçük Temel İmajlar: alpine gibi daha küçük temel imajları tercih edin.
  • Gereksiz Dosyaları Hariç Tutma (.dockerignore): .dockerignore dosyası kullanarak node_modules, .git gibi gereksiz dosyaların imaja kopyalanmasını engelleyin.

# Çok aşamalı Dockerfile örneği
# Aşama 1: Uygulamayı oluştur
FROM node:18-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# Aşama 2: Sadece çalışan uygulamayı içeren nihai imajı oluştur
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/build ./build
COPY --from=builder /app/node_modules ./node_modules
COPY package.json ./
CMD ["node", "build/index.js"]

4. Güvenlik İpuçları

Docker ortamınızı güvende tutmak için dikkat etmeniz gerekenler:

  • İmaj Kaynakları: Yalnızca güvenilir ve doğrulanmış imajları kullanın. Bilinmeyen kaynaklardan imaj çekmekten kaçının.
  • En Az Yetki: Konteynerleri mümkün olan en az yetkiyle çalıştırın. CAP_NET_ADMIN gibi özel yetkileri yalnızca gerçekten gerekliyse verin.
  • Portları Kısıtla: Yalnızca uygulamanızın ihtiyaç duyduğu portları açın. docker run -p ile port yönlendirmelerini dikkatlice yapılandırın.
  • Güvenlik Tarayıcıları: Docker imajlarını ve çalışan konteynerleri güvenlik açıkları için düzenli olarak tarayın.
  • Sistem Temizliği: Kullanılmayan imajları, konteynerleri ve volume’leri düzenli olarak temizleyin. Bu, hem disk alanını boşaltır hem de potansiyel güvenlik risklerini azaltır.

docker system prune -a --volumes

Bu komut, durmuş tüm konteynerleri, kullanılmayan ağları, dangling (etiketsiz) imajları ve isteğe bağlı olarak kullanılmayan volume’leri temizler. Bu, Docker ortamınızı düzenli ve güvenli tutmak için harika bir yoldur.

Uzman İpucu: Konteynerlerinizi her zaman en az yetki prensibiyle çalıştırın. Kök kullanıcı yerine özel bir kullanıcı oluşturmak, güvenlik risklerini önemli ölçüde azaltır. Ayrıca, gereksiz portları açmaktan kaçının ve docker system prune komutunu düzenli olarak kullanarak sisteminizi temiz tutun.

Sıkça Sorulan Sorular (SSS)

  • Docker nedir ve neden kullanmalıyım?
    Docker, uygulamaları bağımlılıklarıyla birlikte “konteyner” adı verilen izole ortamlarda paketlemeye yarayan bir platformdur. Geliştirme, test ve dağıtım süreçlerini standartlaştırır, “benim makinemde çalışıyordu” sorununu ortadan kaldırır ve kaynak kullanımını optimize eder. Geliştiriciler için tutarlı ortamlar sağlarken, operasyon ekipleri için dağıtımı ve yönetimi kolaylaştırır.
  • Docker ve sanal makineler (VM) arasındaki fark nedir?
    Sanal makineler (VM’ler), ana donanım üzerinde çalışan bir hipervizör aracılığıyla her VM için tam bir işletim sistemi (çekirdek dahil) sanallaştırır. Docker konteynerleri ise ana işletim sisteminin çekirdeğini paylaşır ve sadece uygulama ile bağımlılıklarını paketler. Bu, konteynerlerin VM’lere göre çok daha hafif, hızlı, kaynak dostu olmasını ve daha az başlatma süresine sahip olmasını sağlar.
  • Docker kurulumu sonrası sudo kullanmak zorunda mıyım?
    Hayır, kurulumdan sonra kullanıcınızı docker grubuna ekleyerek sudo kullanmadan Docker komutlarını çalıştırabilirsiniz. Bunun için sudo usermod -aG docker $USER komutunu çalıştırıp oturumu kapatıp açmanız veya newgrp docker komutunu kullanmanız yeterlidir. Bu, günlük kullanımda büyük kolaylık sağlar.
  • Docker konteynerleri kalıcı veri depolayabilir mi?
    Evet, Docker konteynerleri varsayılan olarak kalıcı değildir (silindiklerinde içindeki veriler de gider). Ancak, “volume” veya “bind mount” kullanarak ana makinedeki dizinleri konteynerlere bağlayarak veya Docker tarafından yönetilen volume’lar oluşturarak kalıcı veri depolama sağlayabilirsiniz. Bu yöntemler, veritabanları veya kullanıcı dosyaları gibi önemli verilerin korunmasını sağlar.
  • Docker Compose ne işe yarar?
    Docker Compose, birden fazla Docker konteynerini içeren karmaşık uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. Bir YAML dosyası (docker-compose.yml) ile uygulamanızın tüm servislerini (web sunucusu, veritabanı, önbellek vb.), ağlarını ve volume’lerini tek bir komutla (docker compose up) yönetmenizi sağlar. Bu, çoklu servisli uygulamaların kurulumunu ve yönetimini büyük ölçüde basitleştirir.

Sonuç: Ubuntu’da Docker ile Güçlü Bir Başlangıç

Bu kapsamlı rehberde, Ubuntu sisteminize Docker’ı adım adım nasıl kuracağınızı, temel Docker komutlarını kullanarak konteynerlerle nasıl etkileşim kuracağınızı ve hatta Docker Compose ile çoklu konteyner uygulamalarını nasıl yöneteceğinizi öğrendiniz. Ayrıca, Docker kullanımınızı daha verimli ve güvenli hale getirecek ileri seviye ipuçlarına da değindik. Konteynerleşme, modern yazılım geliştirme ve dağıtım süreçlerinin vazgeçilmez bir parçası haline gelmiştir ve Docker bu alandaki en popüler araçlardan biridir. Ubuntu gibi güçlü ve esnek bir işletim sistemi üzerinde Docker kullanmak, size uygulamalarınızı geliştirme, test etme ve dağıtma konusunda eşsiz bir kontrol ve esneklik sunar.

Artık Docker’ın temel prensiplerine ve kurulumuna hakimsiniz. Bu bilgilerle, kendi konteynerlerinizi oluşturmaya, mevcut imajları kullanmaya ve hatta karmaşık çoklu servis uygulamalarını Docker Compose ile yönetmeye başlayabilirsiniz. Unutmayın, Docker ekosistemi sürekli gelişmektedir ve en güncel bilgilere ulaşmak için Docker’ın resmi dokümantasyonunu ve topluluk kaynaklarını düzenli olarak takip etmek önemlidir. Ubuntu’da Docker ile yapabileceklerinizin sınırı neredeyse yok. Bu güçlü aracı keşfetmeye devam edin ve geliştirme iş akışlarınızı bir üst seviyeye taşıyın!

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