Docker'da Nginx'in Dağıtımı
Merhaba! Bu yazıda Docker'da Nginx servisini dağıtacağız ve bu işlem sırasında biraz işin mutfağına inerek, kullandığımız parametrelere kadar her şeyi detaylı olarak ele alacağız. Hadi başlayalım!

Adım 1.1: Proje Yapısı
Docker ve Nginx yapılandırmalarını (config) doğrudan konteynerın içine hapsetmeyelim, önce projemiz için temiz bir güvenli alan açalım:
mkdir nginx-docker
cd nginx-docker
Bu yazıda kullandığım ve temel için önerdiğim dosya yapısı ise aşağıdaki gibi:
tree nginx-docker/
nginx-docker/
├── nginx.conf
├── html/
│ └── index.html
Yapılandırma dosyaları çok önemli. Unutmayın, konteyner geçicidir. Fakat verileriniz ve ayarlarınız kalıcıdır.
Adım 2.1: Statik İçerik
Şimdi aşırı basit bir web sitesi oluşturacağız. Bu yazı, temelleri açıklamayı amaçlayan bir blog yazısı olduğundan arka planda onlarca sistem çalıştıran kompleks bir site kullanmayacağız tabii ki de.
mkdir html
cd html/
nano index.html
Aşağıdaki index.html örneğini yapıştırabilirsin şimdilik.
<!DOCTYPE html>
<html>
<body>
<h1>Nginx Docker</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</body>
</html>
Tabii gerçek sistemlerde; React, Vue, Angular vb. yapıları burada yer alır. Bizim yaptığımız şu an sadece temelleri anlamaya çalışmak.
Adım 3.1: Nginx Konfigürasyonu
Şimdi Nginx'in nasıl çalışacağını belirleyelim.
nano nginx.conf
Yapıştır:
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
Bilmelisin ki; root kısmındaki adres senin bilgisayarınla alakalı değil, Nginx'in konteyner içindeki adresi. Biz birazdan Docker ile "hosttaki şu klasörü, sendeki o adrese bağla" diyeceğiz.
Adım 3.2: Konfigürasyonu Anlamak
Hadi gelin şimdi de nginx.conf'un derinliklerine inelim.. Bazen de teknik. :-)
Adım 3.2.1: events {} Bloğu
events {
worker_connections 1024;
}
Burası site performansı ile alakalı. Kısaca Nginx'e diyorsun ki: "Aynı anda kaç kişiye cevap verebilirsin?"
Başlangıç için 1024 gayet yeterli. Şu anlık burayı kurcalamana gerek yok ama bu blok orada durmak zorunda yoksa Nginx çalışamaz.
Adım 3.2.2: http {} Bloğu
Web ile ilgili her şey burada bulunur. Eğer yaptığın iş HTTP protokolüyle alakalıysa, ki şu an öyle, gerekli her şeyi bu parantezlerin içine yazıyoruz.
Adım 3.2.3: server {} Bloğu
server {
listen 80;
}
Bu blok, bir web sitesini tanımlar. Mantığı şu: Bir Nginx içinde 10 tane farklı site bile barındırabilirsin. Fakat her biri için ayrı bir server bloğu açmalısın.
İleride, isterseniz birden fazla bağlantı noktası ve hizmet barındırabilirsiniz.
Adım 3.2.4: location / Bloğu
location / {
root /usr/share/nginx/html;
index index.html;
}
Kısaca Nginx'e diyorsun ki: "Eğer birisi gelip ana sayfayı (/) isterse, git şu adresteki dosyalara bak."
Tekrar hatırlatayım, burada bulunan dosya yolu ana makinenizin içinde değil konteynerın içindedir.
Adım 4.1: Docker'ı Çalıştırmak
Şimdi bütün parçaları birleştirme zamanı, Docker'ı çalıştırıyoruz. Aşağıdaki uzun komutu terminaline yapıştır:
docker run -d \
--name nginx-demo \
-p 8080:80 \
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
-v $(pwd)/html:/usr/share/nginx/html:ro \
nginx:latest
Windows için:
docker run -d `
--name nginx-demo `
-p 8080:80 `
-v "${PWD}/nginx.conf:/etc/nginx/nginx.conf:ro" `
-v "${PWD}/html:/usr/share/nginx/html:ro" `
nginx:1.25.2
Şimdi burada ne döndü? Karışık geldi değil mi.. :-)
Gelin inceleyelim.
Adım 4.2: Komutu Anlamak
-d: Konteyneri arka planda çalıştırır.--name nginx-demo: Konteynere, daha kolay günlük kaydı ve daha kolay çalıştırma için sabit bir ad verir.-p 8080:80: Tarayıcıyalocalhost:8080yazdığımız zaman Docker bunu içerideki Nginx'in 80 portuna yönlendirir.-v: En kritik yerlerden birisi burası. Kısaca, "Bendeki nginx.conf dosyasını al, konteynerın içindeki ayar dosyasıyla eşleştir." diyoruz.:ro: A.k.a read-only. Nginx sadece okusun, dosyalarımı kafasına göre değiştiremesin diye salt okunur ayarladık.
Adım 5.1: Kontroller
Konteyner artık çalışıyor! Ama bakalım her şey yolunda mı?
Konteyner durumunu kontrol edin:
docker ps
Aşağıdaki çıktıyı alıyorsan sıkıntı yok:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81e35a1907o5 nginx:latest "/docker-entrypoint.…" 19 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp nginx-demo
Logları kontrol edebilirsin:
docker logs nginx-demo
Ve tabii ki, tarayıcıda aç ve dene:
http://localhost:8080
Sayfanı görüyorsan her şey doğru şekilde bağlanmıştır. Rahat.
Adım 6.1: Kapatış ve Temizlik
Konteynerları çalıştırmak kadar, arkada çöp bırakmadan durdurmak da önemli. Şimdi, kullanabileceğin bazı temel komutları inceleyelim.
Adım 6.1.1: Konteynerı Durdurmak
docker stop nginx-demo
Tabii ki konteynerı docker start nginx-demo diyerek tekrar uyandırabilirsin.
Adım 6.1.2: Konteynerı Silmek
Eğer "Benim bu konteynerla işim bitti, yer kaplamasın boşuna." diyorsan:
docker rm -f nginx-demo
-f: Zorlamaktır. Konteyner o an çalışıyor olsa bile önce onu durdurur sonra kökten siler.
Unutma; dosyaların, HTML ve config, silinmez! Çünkü onlar hali hazırda senin bilgisayarında, biz sadece konteynerı sildik.
Adım 6.1.3: Konteynerları Süpürmek
Bazen arkada kullanılmayan "hayalet" konteynerlar kalır. Onları topluca temizlemek için aşağıdaki komutu kullanabilirsin.
docker container prune
Dikkat et, docker container prune komutu çalışmayan (stopped) tüm containerları ve onların kalıntılarını siler.
Sonuç
Bu kurduğumuz yapı, sadece bir başlangıç değil. İleride devasa sistemlere dönüştürebileceğin sağlam bir temel. Detaylara odaklandık. Artık Nginx'i Docker'da sadece "çalıştırmıyorsun", ona hükmediyorsun. :-)
Sonraki yazılarımda görüşmek üzere..