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:
- Backend web servisimizi bir Docker container olarak başlatacağız.
- HTTPS için gerekli olan SSL sertifikasını oluşturacağız.
- 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.