Ufuk'un Blogu

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!

Banner

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

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

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..