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.
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.
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,amd64veyaarm64) 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,focalveyajammy) otomatik olarak algılar. Bu, doğru depoyu hedeflememizi sağlar.stable: Kararlı (stable) Docker sürümünü kullanacağımızı belirtir. İsterseniztestveyanightlygibi başka kanalları da kullanabilirsiniz, ancak genelliklestabletercih edilir.sudo tee /etc/apt/sources.list.d/docker.list: Bu satırı/etc/apt/sources.list.d/docker.listdosyasına yazar. Bu dosya, APT’nin ek paket depolarını tanımladığı yerdir.> /dev/null:teekomutunun çı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 (-aappend,-Ggroup).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.
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.ymldosyası, 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 runkomutunda 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:
Dockerfilekomutları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:
alpinegibi daha küçük temel imajları tercih edin. - Gereksiz Dosyaları Hariç Tutma (.dockerignore):
.dockerignoredosyası kullanaraknode_modules,.gitgibi 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_ADMINgibi ö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 -pile 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.
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ı
sudokullanmak zorunda mıyım?
Hayır, kurulumdan sonra kullanıcınızıdockergrubuna ekleyereksudokullanmadan Docker komutlarını çalıştırabilirsiniz. Bunun içinsudo usermod -aG docker $USERkomutunu çalıştırıp oturumu kapatıp açmanız veyanewgrp dockerkomutunu 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!