Docker Üzerinde HTTPS Trafiğini Yönlendirme

docker https nginx cpynet

Bu yazıda, Docker container’ımızı HTTPS trafiğini yönlendirecek şekilde nasıl yapılandıracağımızı öğreneceğiz. SSL terminasyonu ve geri kalan adımların hepsini Docker üzerinde reverse proxy ile gerçekleştireceğiz.

1. Dağıtım Mimarisi

Docker üzerinde HTTPS ile hizmet vermenin temel fikri, backend servisini bir Docker ağı içinde izole ederek çalıştırmak ve herhangi bir portu dışarıya açmamaktır. Bunun ardından, aynı Docker ağı içerisinde çalışan bir reverse proxy (ters proxy) kurarız. Reverse proxy, SSL terminasyonunu gerçekleştirir ve gelen istekleri backend servisine iletir. Burada önemli olan nokta, reverse proxy’nin yalnızca HTTPS isteklerini kabul edecek şekilde yapılandırılmasıdır.

Bu dağıtım mimarisinin avantajı, SSL terminasyon yükünü backend servisten alarak, bu işlemi yalnızca reverse proxy’de gerçekleştirmektir. Bu yöntem, özellikle birden fazla servisin aynı anda HTTPS isteklerine ihtiyaç duyduğu senaryolarda oldukça kullanışlıdır. SSL terminasyonunu backend servislere bırakmak yerine, tüm yükü reverse proxy üzerinde toplamak, backend’lerin iş yükünü hafifletir.

Örnek olarak, backend tarafında crccheck/hello-world Docker imajını kullanacağız. Bu imaj, HTTP isteklerine yanıt veren basit bir web sunucusu çalıştırmaktadır. Reverse proxy için ise, açık kaynak ve çok amaçlı bir web sunucusu olan Nginx‘i kullanacağız.

2. Dağıtımı Oluşturma

Yüksek seviyede adımlarımız şöyle olacak:

  1. Backend web servisimizi bir Docker container olarak başlatacağız.
  2. HTTPS için gerekli olan SSL sertifikasını oluşturacağız.
  3. Son olarak, SSL terminasyonu yapacak ve istekleri backend’e iletecek şekilde yapılandırdığımız Nginx container’ını çalıştıracağız.

2.1. Docker Ağı Oluşturma

İlk olarak, reverse proxy ve backend servisinin birbirleriyle haberleşebilmesi için bir Docker ağı oluşturacağız:

$ docker network create server-reverse-proxy-link

Bu ağ, iki container’ı barındırarak onların birbirleriyle ağ üzerinden iletişim kurmalarını sağlayacak.

2.2. Backend Servisini Başlatma

Şimdi, backend servis container’ını başlatalım:

$ docker run -d --network server-reverse-proxy-link --name backend-service crccheck/hello-world

Burada dikkat edilmesi gereken en önemli nokta, backend servisini dışarıya herhangi bir port açmadan çalıştırmamızdır. Bu sayede servis sadece reverse proxy üzerinden gelen HTTPS isteklerini kabul eder.

Container’ı başlatırken --network seçeneği ile servisi daha önce oluşturduğumuz server-reverse-proxy-link ağına dahil ettik.

2.3. TLS Sertifikası Oluşturma

Gösterim amaçlı, kendi kendine imzalanmış bir sertifika oluşturacağız. Bu tür sertifikalar, güvenilir bir sertifika otoritesi tarafından imzalanmadığı için tarayıcılar tarafından güvensiz olarak işaretlenir. Ancak test ve lokal kullanım için işimizi görecektir.

Öncelikle bir özel anahtar oluşturmak için şu komutu çalıştırıyoruz:

$ openssl genrsa -out server.key 2048

Ardından, bir sertifika imzalama isteği (CSR) oluşturuyoruz:

$ openssl req -key server.key -new -out server.csr

Son olarak, bu isteği kendi oluşturduğumuz anahtar ile imzalayarak sertifikamızı elde ediyoruz:

$ openssl x509 -signkey server.key -in server.csr -req -days 365 -out server.crt

Bu adımlardan sonra elimizde SSL terminasyonu için kullanacağımız bir sertifikamız olacak.

2.4. Nginx Yapılandırma Dosyasını Oluşturma

Nginx reverse proxy sunucumuzu başlatmadan önce, yapılandırma dosyasını yazmamız gerekiyor. Bu dosyada Nginx’in 443 numaralı port üzerinden HTTPS isteklerini dinleyip, bunları backend servisine iletmesini sağlayacağız.

İşte yapılandırma dosyamız:

events { }
http {
    server {
        listen 443 ssl;

        ssl_certificate /opt/certificates/server.crt;
        ssl_certificate_key /opt/certificates/server.key;

        location / {
            proxy_pass http://backend-service:8000;
        }
    }
}

Bu dosyada, server bloğu içinde 443 numaralı portta SSL modunda çalışan bir sunucu tanımladık. Sertifika ve anahtar dosyalarını Nginx’in erişebileceği şekilde belirttik. Ayrıca, gelen tüm istekleri proxy_pass ile backend servisine yönlendirdik.

2.5. Nginx Docker Container’ını Başlatma

Yapılandırma dosyasını ve SSL sertifikalarını kullanarak Nginx container’ını başlatabiliriz:

$ docker run -d 
  --name nginx-container 
  --network server-reverse-proxy-link 
  -p 443:443 
  -v /opt/certificates:/opt/certificates 
  -v /opt/nginx.conf:/etc/nginx/nginx.conf 
  nginx:latest

Burada -v seçeneği ile sertifika, anahtar ve yapılandırma dosyalarını container’a bağladık. Ayrıca --network ile container’ı yine aynı ağa dahil ettik.

2.6. Servisi Test Etme

Şimdi, servisi test edebiliriz. HTTPS protokolünü kullanarak curl komutunu çalıştırdığımızda:

$ curl https://localhost

Eğer kendi kendine imzalanmış sertifikayı kullanıyorsanız, curl komutu bir uyarı verecektir. Bu durumu atlamak için şu şekilde komutu tekrar çalıştırabilirsiniz:

$ curl --insecure https://localhost

Komutu çalıştırdığınızda, backend servisten gelen “Hello World” yanıtını göreceksiniz.

3. Sonuç

Bu rehberde, Docker üzerinde çalışan bir web servisine HTTPS desteği eklemeyi öğrendik. Nginx reverse proxy kullanarak SSL terminasyonu yaptık ve istekleri backend servise yönlendirdik. Bu yöntem, birden fazla servis ile HTTPS üzerinden çalışırken SSL yükünü azaltmanın etkili bir yolu olarak kullanılabilir.

Önceki Konu

phpMyAdmin Kurulumu

Sonraki Konu

Linux'ta Sistem Temizliği ve Performans Artırma Yolları

Bültenimize Abone Olun 📬

En son gönderilerimizin doğrudan e-posta kutunuza gelmesi için e-posta bültenimize abone olun.
Düşüncelerinizi özgür bırakın ✨