Debian 9 Üzerine Docker Kurulumu ve Kullanımı: Kapsamlı Bir Rehber
Debian 9 (“Stretch”) her ne kadar artık eski bir sürüm olsa da, belirli legacy sistemlerde veya özel gereksinimleri olan ortamlarda hala kullanılabilmektedir. Bu makale, Debian 9 işletim sistemi üzerine Docker’ı nasıl kuracağınızı ve temelden ileri seviyeye doğru nasıl kullanacağınızı adım adım açıklamaktadır. Docker, uygulamaları ve bağımlılıklarını izole edilmiş, taşınabilir konteynerler içinde paketlemeye olanak tanıyan güçlü bir platformdur. Bu sayede, “benim makinemde çalışıyordu” sorununu ortadan kaldırarak geliştirme, test ve üretim ortamları arasında tutarlılık sağlar.
Giriş: Docker Nedir ve Neden Kullanmalıyız?
Docker, uygulamaları ve onların tüm bağımlılıklarını (kütüphaneler, ayarlar, diğer yazılımlar vb.) hafif, taşınabilir ve kendi kendine yeten birimler olan “konteynerler” içinde paketlemeyi sağlayan açık kaynaklı bir platformdur. Sanal makinelerin aksine, Docker konteynerleri işletim sistemini sanallaştırmaz; bunun yerine, ana bilgisayarın Linux çekirdeğini paylaşır. Bu durum, konteynerlerin çok daha hızlı başlamasını ve çok daha az kaynak tüketmesini sağlar.
Docker Kullanmanın Başlıca Faydaları:
* Tutarlılık: Geliştirme, test ve üretim ortamları arasında tutarlılık sağlar. Bir uygulamanın her yerde aynı şekilde çalışacağını garanti eder.
* İzolasyon: Konteynerler birbirinden izole çalışır. Bir konteynerdeki sorunlar diğerlerini veya ana sistemi etkilemez.
* Taşınabilirlik: Bir konteyner imajı oluşturulduğunda, bu imaj herhangi bir Docker yüklü sistemde sorunsuz bir şekilde çalıştırılabilir.
* Hız: Konteynerler saniyeler içinde başlar, bu da geliştirme ve dağıtım süreçlerini hızlandırır.
* Verimlilik: Sanal makinelere göre daha az kaynak tüketirler, bu da sunucu kaynaklarının daha verimli kullanılmasına olanak tanır.
* Kolay Dağıtım: Uygulamaların dağıtımını basitleştirir ve karmaşık bağımlılık yönetimini ortadan kaldırır.
Bu rehberde, Debian 9 sisteminizde Docker’ı kuracak, temel komutlarını öğrenecek, kendi imajlarınızı oluşturacak, Docker Compose ile çoklu konteyner uygulamalarını yönetecek ve veri yönetimi ile ağ yapılandırması gibi konulara değineceğiz.
Ön Gereksinimler
Docker kurulumuna başlamadan önce aşağıdaki gereksinimlerin karşılandığından emin olun:
* Debian 9 (Stretch) İşletim Sistemi: Makale özellikle Debian 9’u hedeflemektedir. Güncel Debian sürümleri için kurulum adımları benzer olsa da, bazı paket isimleri veya depo URL’leri farklılık gösterebilir.
* Sudo Yetkileri: Kurulum ve yönetim işlemleri için sudo yetkilerine sahip bir kullanıcıya ihtiyacınız olacaktır.
* İnternet Bağlantısı: Docker paketlerini ve imajlarını indirmek için aktif bir internet bağlantısı gereklidir.
* Temel Linux Komut Satırı Bilgisi: Terminalde komut çalıştırma konusunda temel bilgi sahibi olmanız beklenir.
Docker Kurulumu
Debian 9 üzerine Docker’ı kurmanın en güvenli ve önerilen yolu, Docker’ın resmi deposunu kullanmaktır. Bu sayede her zaman en güncel ve kararlı sürümü alırsınız.
Mevcut Docker Sürümlerini Kaldırma (Opsiyonel)
Eğer sisteminizde daha önce Docker’ın eski veya farklı bir sürümü kuruluysa, yeni bir kurulumdan önce bunları kaldırmak iyi bir uygulamadır. Bu adım, potansiyel çakışmaları önler.
sudo apt-get remove docker docker-engine docker.io containerd runc
Bu komut, Docker’ın bilinen tüm eski paketlerini sisteminizden kaldıracaktır. Konteynerler, imajlar, volümler veya ağ yapılandırmaları gibi verileriniz bu işlemle otomatik olarak silinmez.
Gerekli Paketleri Yükleme
Docker deposunu kullanabilmek için bazı temel paketlere ihtiyacımız var. Bu paketler, HTTPS üzerinden güvenli bağlantı kurmayı ve GPG anahtarlarını yönetmeyi sağlar.
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
* apt-transport-https: APT’nin HTTPS üzerinden depoları kullanmasını sağlar.
* ca-certificates: SSL/TLS bağlantıları için gerekli CA sertifikalarını içerir.
* curl: URL’lerden veri transferi için bir komut satırı aracıdır. GPG anahtarını indirmek için kullanacağız.
* gnupg2: GPG anahtarlarını yönetmek için kullanılır.
* software-properties-common: Depo eklemek için kullanılan add-apt-repository komutunu sağlar.
Docker GPG Anahtarını Ekleme
Docker’ın resmi deposundan indirilen paketlerin güvenilirliğini doğrulamak için Docker’ın GPG anahtarını sistemimize eklememiz gerekir.
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
Bu komut, Docker’ın resmi GPG anahtarını indirir ve apt-key add komutuyla sisteminize ekler. Anahtar başarıyla eklendiğinde OK çıktısını görmelisiniz.
Docker Deposu Ekleme
Şimdi, Docker’ın kararlı (stable) deposunu APT kaynak listemize eklememiz gerekiyor. Debian 9 için doğru depo URL’sini kullandığınızdan emin olun.
echo "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable" | sudo tee /etc/apt/sources.list.d/docker.list
* deb [arch=amd64]: Bu depo sadece 64-bit (amd64) mimarisi için paketler içerir.
* https://download.docker.com/linux/debian: Docker’ın Debian için resmi depo URL’si.
* stretch: Debian 9’un kod adıdır. Doğru sürüm kod adını kullanmak önemlidir.
* stable: Kararlı (stable) sürüm deposunu kullanacağımızı belirtir.
Depoyu ekledikten sonra, yeni paket kaynaklarını tanımak için APT paket indeksini güncellemelisiniz:
sudo apt-get update
Docker Engine’i Kurma
Artık Docker Engine’i ve ilgili bileşenleri kurmaya hazırız.
sudo apt-get install docker-ce docker-ce-cli containerd.io
* docker-ce: Docker Engine’in topluluk sürümü.
* docker-ce-cli: Docker komut satırı arayüzü.
* containerd.io: Konteynerlerin yaşam döngüsünü yöneten bir konteyner çalışma zamanı.
Kurulum tamamlandığında, Docker servisi otomatik olarak başlayacak ve sistem başlangıcında da çalışacak şekilde ayarlanacaktır. Servisin durumunu kontrol edebilirsiniz:
sudo systemctl status docker
Çıktıda active (running) ibaresini görmelisiniz.
Kurulumu Doğrulama
Docker’ın doğru bir şekilde kurulup kurulmadığını test etmek için hello-world imajını çalıştırabilirsiniz:
sudo docker run hello-world
Bu komut, Docker’ın hello-world imajını indirir (eğer yerel olarak yoksa), bu imajdan bir konteyner oluşturur, çalıştırır ve çıktıyı terminale yazdırır. Başarılı bir kurulumda, aşağıdaki gibi bir mesaj görmelisiniz:
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Docker’ı Sudo Olmadan Kullanma
Varsayılan olarak, Docker komutlarını çalıştırmak için sudo kullanmanız gerekir. Bu, güvenlik nedenleriyle böyledir. Ancak, Docker’ı sık kullanacak bir kullanıcı için her komutun başına sudo yazmak zahmetli olabilir. Kullanıcınızı docker grubuna ekleyerek bu kısıtlamayı kaldırabilirsiniz.
sudo usermod -aG docker $USER
* usermod: Kullanıcı özelliklerini değiştirmek için kullanılır.
* -aG: Kullanıcıyı belirtilen gruba ekler (-a eklemek, -G grup belirtmek).
* docker: Eklenilecek grup adı.
* $USER: Mevcut oturum açmış kullanıcının kullanıcı adı.
Bu değişikliğin etkili olması için oturumunuzu kapatıp tekrar açmanız veya sisteminizi yeniden başlatmanız gerekir. Alternatif olarak, aşağıdaki komutu kullanarak yeni grup üyeliğini uygulayabilirsiniz (ancak oturumu kapatıp açmak en garantili yoldur):
newgrp docker
Oturumunuzu yeniden başlattıktan sonra, sudo kullanmadan docker run hello-world komutunu tekrar deneyin.
docker run hello-world
Eğer komut sorunsuz çalışırsa, Docker’ı artık sudo olmadan kullanabilirsiniz.
Docker Temelleri: İlk Adımlar
Docker’ı kurduğunuza ve kullanmaya hazır olduğunuza göre, temel Docker kavramlarını ve komutlarını inceleyelim.
Docker İmajları
Docker imajları, bir uygulamanın ve onun bağımlılıklarının anlık görüntüsüdür. Bir imaj, bir konteyneri çalıştırmak için gereken her şeyi içerir: kod, çalışma zamanı, sistem araçları, sistem kütüphaneleri ve ayarlar. İmajlar sabittir ve değişmez.
İmaj Arama
Docker Hub’da (Docker’ın resmi imaj deposu) veya diğer özel depolarda imaj arayabilirsiniz.
docker search ubuntu
Bu komut, “ubuntu” anahtar kelimesini içeren tüm Docker imajlarını listeler.
İmaj İndirme
Bir imajı yerel makinenize indirmek için docker pull komutunu kullanırsınız. Eğer bir etiket (tag) belirtmezseniz, varsayılan olarak latest etiketi indirilir.
docker pull ubuntu:18.04 # Ubuntu 18.04 imajını indir
docker pull nginx # Nginx'in en son (latest) imajını indir
İmajları Listeleme
Yerel sisteminizde bulunan tüm imajları görmek için:
docker images
Çıktıda imaj adı, etiketi, imaj ID’si, oluşturulma tarihi ve boyutu gibi bilgiler yer alır.
İmaj Silme
Artık ihtiyacınız olmayan bir imajı silmek için docker rmi komutunu kullanın. Önce o imajdan çalışan tüm konteynerleri durdurup silmeniz gerekebilir.
docker rmi ubuntu:18.04
Docker Konteynerleri
Konteynerler, bir Docker imajının çalıştırılabilir örnekleridir. Bir imajdan birden fazla konteyner çalıştırabilirsiniz. Her konteyner birbirinden izole edilmiş, kendi dosya sistemi, ağ arayüzü ve işlem alanı olan bir ortamdır.
Konteyner Çalıştırma
Bir imajdan konteyner çalıştırmak için docker run komutunu kullanırız.
docker run -it ubuntu:18.04 bash
* -it: Etkileşimli bir terminal (-i) ayırır ve sahte bir TTY (-t) bağlar. Bu, konteyner içinde komut çalıştırmanıza olanak tanır.
* ubuntu:18.04: Çalıştırılacak imaj.
* bash: Konteyner başlatıldığında çalıştırılacak komut. Bu örnekte, Ubuntu konteyneri içinde bir Bash kabuğu açarız.
Konteynerden çıkmak için exit yazıp Enter tuşuna basın. Konteyner duracaktır.
Arka Planda Konteyner Çalıştırma (Detached Mode)
Bir konteyneri arka planda, yani detached modda çalıştırmak için -d bayrağını kullanın.
docker run -d --name benim-nginx -p 8080:80 nginx
* -d: Konteyneri arka planda çalıştırır ve konteyner ID’sini döndürür.
* --name benim-nginx: Konteynere benim-nginx adını verir. Konteynerleri isimleriyle yönetmek daha kolaydır.
* -p 8080:80: Ana makinenin 8080 portunu konteynerin 80 portuna eşler. Böylece ana makineden http://localhost:8080 adresine erişerek Nginx sunucusuna ulaşabilirsiniz.
* nginx: Çalıştırılacak Nginx imajı.
Çalışan Konteynerleri Listeleme
Şu anda çalışan tüm konteynerleri görmek için:
docker ps
Durdurulmuş dahil tüm konteynerleri görmek için:
docker ps -a
Konteyner Durdurma, Başlatma ve Yeniden Başlatma
Bir konteyneri durdurmak, başlatmak veya yeniden başlatmak için konteyner ID’sini veya adını kullanabilirsiniz.
docker stop benim-nginx # Konteyneri durdur
docker start benim-nginx # Durdurulmuş konteyneri başlat
docker restart benim-nginx # Konteyneri yeniden başlat
Konteyner Silme
Durdurulmuş bir konteyneri silmek için docker rm komutunu kullanın. Çalışan bir konteyneri silmek için -f (force) bayrağını eklemeniz gerekir, ancak önce durdurmak daha iyi bir yaklaşımdır.
docker rm benim-nginx
Konteyner İçine Girme
Çalışan bir konteynerin içine girip komut çalıştırmak için docker exec komutunu kullanın.
docker exec -it benim-nginx bash
Bu komut, benim-nginx konteyneri içinde yeni bir Bash kabuğu başlatır ve sizi o kabuğa bağlar.
Konteyner Loglarını Görüntüleme
Bir konteynerin standart çıktı ve standart hata akışlarını (loglarını) görmek için:
docker logs benim-nginx
Gerçek zamanlı logları takip etmek için -f (follow) bayrağını kullanabilirsiniz:
docker logs -f benim-nginx
Docker Compose Kullanımı
Gerçek dünya uygulamaları genellikle birden fazla servisten oluşur (örneğin, bir web sunucusu, bir veritabanı, bir önbellek servisi). Docker Compose, çoklu konteyner Docker uygulamalarını tanımlamak ve çalıştırmak için bir araçtır. Tek bir YAML dosyası kullanarak tüm uygulama servislerinizi yapılandırabilir ve tek bir komutla hepsini başlatabilir veya durdurabilirsiniz.
Docker Compose Kurulumu
Debian 9’da Docker Compose’u kurmanın birkaç yolu vardır. En kolay yol, APT deposundan kurmaktır:
sudo apt-get install docker-compose
Eğer bu komut en güncel sürümü kurmazsa veya belirli bir sürümü istiyorsanız, Docker’ın GitHub deposundan manuel olarak indirebilirsiniz:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Not: 1.29.2 yerine Docker Compose’un en son kararlı sürümünü kullanmanız önerilir. En son sürümü GitHub sayfasından kontrol edebilirsiniz.
Kurulumu doğrulayın:
docker-compose --version
Basit Bir Docker Compose Uygulaması
Aşağıda, bir Nginx web sunucusu ve basit bir Python Flask uygulamasından oluşan bir docker-compose.yml dosyası örneği verilmiştir.
Önce, proje dizinimizi oluşturalım:
mkdir my_flask_nginx_app
cd my_flask_nginx_app
Şimdi bir Flask uygulaması oluşturalım: app.py
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Merhaba, Docker Compose ile Flask ve Nginx!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Bu Flask uygulamasının bağımlılıklarını içeren requirements.txt dosyası:
Flask
Flask uygulamamız için bir Dockerfile: Dockerfile
# Dockerfile
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Ve son olarak, docker-compose.yml dosyamız:
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
networks:
- app_network
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- web
networks:
- app_network
networks:
app_network:
driver: bridge
Bu docker-compose.yml dosyası iki servis tanımlar:
* web: Dockerfile‘dan oluşturulan Flask uygulaması. 5000 portunu dışarıya açar.
* nginx: Nginx’in resmi imajını kullanır. Kendi nginx.conf dosyamızı bağlar ve 80 portunu dışarıya açar. depends_on: web Nginx’in web servisi başladıktan sonra başlamasını sağlar.
Nginx için özel bir yapılandırma dosyası: nginx.conf
# nginx.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web:5000; # 'web' servisine yönlendirme
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Tüm bu dosyaları oluşturduktan sonra, proje dizininizdeyken uygulamayı başlatmak için:
docker-compose up -d
* -d: Tüm servisleri arka planda (detached mode) başlatır.
Uygulama çalışmaya başladığında, web tarayıcınızdan http://localhost adresine giderek Flask uygulamanızın Nginx üzerinden çalıştığını görebilirsiniz.
Uygulamayı durdurmak ve tüm konteynerleri kaldırmak için:
docker-compose down
Docker Ağ Yapılandırması
Docker, konteynerler arasında ve konteynerler ile ana bilgisayar arasında iletişimi sağlamak için gelişmiş ağ yetenekleri sunar.
Varsayılan Ağlar
Docker Engine, varsayılan olarak üç ağ sürücüsü ile gelir:
* Bridge (Köprü): Varsayılan ağ sürücüsüdür. Konteynerler için özel bir dahili ağ oluşturur ve ana bilgisayarın ağ arayüzüne bağlanır. Konteynerler kendi aralarında ve dış dünyayla bu köprü üzerinden iletişim kurabilir.
* Host (Ana Bilgisayar): Konteyner, ana bilgisayarın ağ yığınını doğrudan kullanır. Bu, konteynerin ana bilgisayarın ağ arayüzlerine doğrudan erişebileceği anlamına gelir. İzolasyon seviyesi düşüktür.
* None (Yok): Konteyner ağ arayüzüne sahip olmaz. Genellikle özel ağ yapılandırmaları için veya ağ erişimine ihtiyacı olmayan konteynerler için kullanılır.
Mevcut ağları listeleyin:
docker network ls
Özel Ağ Oluşturma
Uygulamalarınız için özel köprü ağları oluşturmak iyi bir uygulamadır. Bu, konteynerlerin birbirini isimleriyle bulmasını sağlar ve daha iyi izolasyon sunar.
docker network create --driver bridge benim-ozel-agim
* --driver bridge: Köprü ağ sürücüsünü kullanır.
Bir konteyneri özel bir ağa bağlamak için docker run komutunda --network bayrağını kullanın:
docker run -d --name webserver --network benim-ozel-agim nginx
Mevcut bir konteyneri bir ağa bağlamak veya ağdan çıkarmak için:
docker network connect benim-ozel-agim baska-konteyner
docker network disconnect benim-ozel-agim baska-konteyner
Özel ağlarda, aynı ağdaki konteynerler birbirlerini isimleriyle çözümleyebilir (DNS). Örneğin, webserver konteynerinden baskaservis adlı başka bir konteynere http://baskaservis şeklinde erişebilirsiniz.
Docker Veri Yönetimi
Konteynerler geçicidir; bir konteyneri sildiğinizde, içindeki tüm veriler de kaybolur. Kalıcı veri depolama için Docker iki ana yöntem sunar: Volumes (Volümler) ve Bind Mounts (Bağlı Bağlantılar).
Volumes (Volümler)
Volümler, Docker tarafından yönetilen özel bir dosya sistemi alanıdır. Konteynerlerin yaşam döngüsünden bağımsızdır ve verilerin kalıcı olarak saklanması için en iyi yoldur.
Volüm Oluşturma
docker volume create benim-veritabani-verileri
Konteynere Volüm Bağlama
Bir konteyner çalıştırırken -v bayrağını kullanarak bir volümü bağlayabilirsiniz:
docker run -d \
--name postgres-db \
-e POSTGRES_PASSWORD=mysecretpassword \
-v benim-veritabani-verileri:/var/lib/postgresql/data \
postgres
Bu örnek, benim-veritabani-verileri adlı volümü postgres-db konteynerinin /var/lib/postgresql/data dizinine bağlar. PostgreSQL verileri bu volümde kalıcı olarak saklanacaktır.
Volümleri Listeleme ve Silme
docker volume ls # Tüm volümleri listele
docker volume rm benim-veritabani-verileri # Volümü sil (kullanılmıyorsa)
docker volume prune # Kullanılmayan tüm volümleri sil
Bind Mounts (Bağlı Bağlantılar)
Bind mount’lar, ana bilgisayarın dosya sistemindeki bir dizini veya dosyayı doğrudan konteynerin içine bağlamanıza olanak tanır. Bu, geliştirme sırasında kodunuzu doğrudan konteynere bağlamak veya yapılandırma dosyalarını yönetmek için kullanışlıdır.
Konteynere Bind Mount Bağlama
docker run -d \
--name my-apache \
-p 80:80 \
-v /home/$USER/my_apache_site:/usr/local/apache2/htdocs/ \
httpd
Bu komut, ana bilgisayarınızdaki /home/$USER/my_apache_site dizinini my-apache konteynerinin /usr/local/apache2/htdocs/ dizinine bağlar. Ana bilgisayardaki bu dizinde yaptığınız değişiklikler anında konteyner içinde de görünür olacaktır.
Dockerfile ile Kendi İmajınızı Oluşturma
Docker Hub’daki mevcut imajlar birçok senaryo için yeterli olsa da, kendi özel uygulamalarınız için kendi Docker imajlarınızı oluşturmanız gerekebilir. Bu, bir Dockerfile kullanarak yapılır. Dockerfile, bir imajın nasıl oluşturulacağını adım adım açıklayan bir metin dosyasıdır.
Temel Dockerfile Komutları
* FROM: İmajın hangi temel imajdan türetileceğini belirtir (örn. FROM ubuntu:18.04). Her Dockerfile bu komutla başlamalıdır.
* RUN: İmaj oluşturma sırasında çalıştırılacak komutları belirtir. Genellikle paket kurulumu, uygulama bağımlılıklarının yüklenmesi gibi işlemler için kullanılır (örn. RUN apt-get update && apt-get install -y nginx).
* COPY: Ana bilgisayardaki dosya veya dizinleri imaj içine kopyalar (örn. COPY . /app).
* ADD: COPY gibi çalışır, ancak URL’lerden dosya indirme veya sıkıştırılmış arşivleri otomatik olarak açma gibi ek yeteneklere sahiptir.
* WORKDIR: Sonraki RUN, CMD, ENTRYPOINT, COPY, ADD komutları için çalışma dizinini ayarlar (örn. WORKDIR /app).
* EXPOSE: Konteynerin belirli bir portu dinlediğini belgelendirir. Ağ yapılandırması yapmaz, sadece bir belgeleme ipucudur (örn. EXPOSE 80).
* CMD: Konteyner başlatıldığında çalıştırılacak varsayılan komutu veya argümanları sağlar. Bir Dockerfile’da yalnızca bir CMD komutu olabilir.
* ENTRYPOINT: Konteyner başlatıldığında çalıştırılacak ana komutu ayarlar. CMD ile birlikte kullanıldığında, CMD argümanları ENTRYPOINT komutuna geçirilir.
Basit Bir Nginx Dockerfile Örneği
Bir Nginx web sunucusu imajı oluşturmak istediğimizi varsayalım. Proje dizinimizde Dockerfile ve index.html adında iki dosya oluşturalım.
index.html:
Merhaba Docker!
Bu sayfa, kendi Dockerfile'ımızdan oluşturulan bir imajdan servis ediliyor.
Dockerfile:
# Temel Nginx imajını kullan
FROM nginx:latest
Çalışma dizinini ayarla
WORKDIR /usr/share/nginx/html
index.html dosyasını imajın içine kopyala
COPY index.html .
Konteynerin 80 portunu dışarıya açtığını belirt
EXPOSE 80
Nginx sunucusunu başlat
CMD ["nginx", "-g", "daemon off;"]
İmajı oluşturmak için, Dockerfile ve index.html dosyalarının bulunduğu dizinde aşağıdaki komutu çalıştırın:
docker build -t benim-nginx-web .
* -t benim-nginx-web: Oluşturulan imaja benim-nginx-web adını ve latest etiketini verir.
* .: Dockerfile’ın mevcut dizinde olduğunu belirtir.
İmaj oluşturulduktan sonra, onu çalıştırabilirsiniz:
docker run -d -p 80:80 --name benim-webserver benim-nginx-web
Şimdi tarayıcınızdan http://localhost adresine giderek kendi Nginx sunucunuzu görebilirsiniz.
Docker İmajlarını Docker Hub’a Yükleme
Oluşturduğunuz özel imajları başkalarıyla paylaşmak veya farklı sunucularınızda kullanmak için Docker Hub gibi bir konteyner kayıt defterine (registry) yükleyebilirsiniz.
1. Docker Hub Hesabı Oluşturma: Eğer bir Docker Hub hesabınız yoksa, hub.docker.com adresinden ücretsiz bir hesap oluşturun.
2. Docker’a Giriş Yapma: Terminalden Docker Hub hesabınıza giriş yapın:
docker login
Kullanıcı adınızı ve şifrenizi girmeniz istenecektir.
3. İmajı Etiketleme (Tagging): İmajınızı Docker Hub kullanıcı adınızla etiketlemeniz gerekir. Format kullanici_adi/imaj_adi:etiket şeklindedir.
docker tag benim-nginx-web:latest kullanici_adiniz/benim-nginx-web:v1.0
kullanici_adiniz yerine kendi Docker Hub kullanıcı adınızı yazın.
4. İmajı Yükleme (Pushing): Etiketlediğiniz imajı Docker Hub’a yükleyin:
docker push kullanici_adiniz/benim-nginx-web:v1.0
İmajınız Docker Hub’a yüklendikten sonra, herhangi bir Docker yüklü sistemden docker pull kullanici_adiniz/benim-nginx-web:v1.0 komutuyla çekilebilir.
Sık Karşılaşılan Sorunlar ve Çözümler
Docker kullanırken karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:
* Got permission denied while trying to connect to the Docker daemon socket: Bu hata, Docker komutlarını sudo olmadan çalıştırmaya çalıştığınızda ve kullanıcınızın docker grubunda olmadığı zaman ortaya çıkar.
* Çözüm: Kullanıcınızı docker grubuna ekleyin: sudo usermod -aG docker $USER. Ardından oturumu kapatıp tekrar açın veya newgrp docker komutunu çalıştırın.
* Cannot connect to the Docker daemon. Is the docker daemon running on this host?: Docker servisi çalışmıyorsa bu hatayı alırsınız.
* Çözüm: Docker servisini başlatın: sudo systemctl start docker. Servisin durumunu kontrol edin: sudo systemctl status docker.
* E: The repository 'https://download.docker.com/linux/debian stretch Release' does not have a Release file.: Depo ekleme sırasında yanlış URL, yanlış Debian sürüm adı veya GPG anahtarı eklenmemiş olması nedeniyle bu hatayı alabilirsiniz.
* Çözüm: Depo URL’sinin ve Debian sürüm adının (stretch olduğundan emin olun) doğru olduğundan emin olun. GPG anahtarının eklendiğini doğrulayın. sudo apt-get update komutunu tekrar çalıştırın.
* Error response from daemon: driver failed programming external connectivity on endpoint ... bind: address already in use: Bu hata, bir konteyneri başlatmaya çalıştığınızda ve ana bilgisayarınızda veya başka bir konteynerde zaten kullanılan bir portu eşlemeye çalıştığınızda meydana gelir.
* Çözüm: Çakışan portu kullanan başka bir uygulamayı/konteyneri durdurun veya konteyner için farklı bir ana bilgisayar portu kullanın (örn. -p 8081:80).
* Disk Alanı Tükenmesi: Docker imajları, konteynerler ve volümler zamanla disk alanını doldurabilir.
* Çözüm: Kullanılmayan Docker nesnelerini temizlemek için düzenli olarak docker system prune komutunu çalıştırın. Bu komut durdurulmuş konteynerleri, kullanılmayan ağları, dangle imajları ve build cache’leri siler. Volümleri silmek için docker system prune -a veya docker volume prune kullanın.
Sonuç
Bu kapsamlı rehberde, Debian 9 işletim sistemi üzerine Docker’ı nasıl kuracağınızı, temel Docker komutlarını kullanarak imaj ve konteynerleri nasıl yöneteceğinizi, Docker Compose ile çoklu konteyner uygulamalarını nasıl tanımlayacağınızı, ağ ve veri yönetimi stratejilerini, kendi Docker imajlarınızı nasıl oluşturacağınızı ve Docker Hub’a nasıl yükleyeceğinizi öğrendiniz.
Docker, modern uygulama geliştirme ve dağıtım süreçlerinde devrim yaratan güçlü bir araçtır. Uygulamalarınızın taşınabilirliğini, tutarlılığını ve ölçeklenebilirliğini artırarak geliştirici ve operasyon ekiplerinin işini büyük ölçüde kolaylaştırır. Debian 9 gibi daha eski sistemlerde bile Docker’ın sunduğu bu avantajlardan faydalanmak mümkündür.
Artık Docker’ın temellerine hakim olduğunuza göre, daha ileri konuları keşfetmeye hazırsınız. Docker Swarm veya Kubernetes gibi konteyner orkestrasyon araçları, CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) boru hatlarıyla entegrasyon ve daha karmaşık ağ yapılandırmaları gibi konuları inceleyerek Docker bilginizi daha da ileri taşıyabilirsiniz. Unutmayın, pratik yapmak ve farklı senaryolar denemek, Docker’da ustalaşmanın en iyi yoludur.