Birçok web sitesi statik olarak yani nginx ile doğrudan sunulabilecek şekilde oluşturuluyor. Böyle durumlarda yayına alma sürecinde yorucu olan; kurulumlar, port açma, konfigürasyon gibi süreçler başlıyor. Container teknolojileri ve Docker ile birkaç saniye içerisinde yeni bir container açmak mümkünken, web sitelerini bu ikiliden faydalanarak kurmak pratik bir yöntem haline geliyor. nginx’in Docker imajını kullanarak yayına almayı bu yazı içerisinde göreceğiz.

Web Sitesinin Dosyalarını Hazırlayalım

Yayına alacağımız web sitesini oluşturacak HTML, JavaScript, CSS, görsel, video ve diğer kullanacağınız dosyaları bir yerde toplayarak başlayabiliriz. Bu sayede nginx containerını oluştururken web sitesinin içeriği için nereye bakacağını söylememiz kolaylaşır. Bu örnekte çalıştığımız kullanıcının ev dizini içerisinde, yeni bir dizin oluşturup onu web sitesinin root dizini olarak kullanacağız. Siz de bu yöntemi kullanabilir, dosyalarınız zaten bir dizin içerisinde duruyorsa bu aşamayı pas geçebilirsiniz.

$ mkdir ~/websitesi
$ cd ~/websitesi

Bu komutların ardından, dosyalarımızı şu an oluşturduğumuz dizin içerisine kopyalayabiliriz. Biz bu yazıda, basit bir HTML dosyası oluşturup onu kullanacağız. Kısa ve basit olan bu içeriği index.html olarak kaydedebiliriz:

<html>
<body>
  <h1>Peptr Blog</h1>
</body>
</html>

Kendi dosyalarınız zaten hazırsa, index dosyanız da büyük ihtimalle içerisinde yer alacaktır. Böyle bir durumda tabii ki tekrar oluşturmaya gerek yok. Artık ön hazırlıklarımızı tamamlamış olduk.

Docker ile Nginx Containerı Oluşturma

Docker için üretilen nginx imajına Docker Hub üzerinden ulaşabiliriz. Bu imaj resmi olarak üretiliyor ve detaylarına burdan ulaşabilirsiniz. İmajı yoksa indirmek ve container oluşturmak, varsa da varolan imajdan bir container oluşturmak ve port yönlendirmesini yapmak için:

$ docker run -d -p 80:80 -p 443:443 --name web nginx

Bu komut ile birlikte nginx çalışan bir Docker containerı oluşacak. Containerın 80 ve 443 portları da, çalıştığı sunucunun 80 ve 443 portları olarak dışarıya açılacak. Son olarak da, containera web ismi verilecek.

Komutu çalıştırdıktan sonra, ilgili sunucuya web tarayıcımızdan bağlanabiliriz. Karşımıza böyle bir ekran çıkmalı:

<figcaption>Docker nginx containerı varsayılan sayfası</figcaption></figure>

Bu ekran nginx’in çalıştığını gösterse de, bizim asıl amacımızı sağlamıyor. Oluşturduğumuz index.html sayfasını bunun yerine istiyorduk. Bu konuda ise yardımımıza bind mount yetişecek.

Bind Mount ile Web Sitesi Yayınlamak

Docker’da containera bilgisayarımız veya sunucu üzerindeki bir dizini doğrudan bağlamak için bind mountları kullanabiliyoruz. Bunun için öncelikle, bir önceki başlıkta yer alan containerı açtıysak, silelim:

$ docker stop web
$ docker rm web

Şimdi, bulunduğumuz dizini (ilk kısımda ~/websitesi olarak ayarlamıştık) Nginx ile bir web sitesi olarak yayına alalım:

$ docker run -d -p 80:80 -p 443:443 --name web -v $PWD:/usr/share/nginx/html nginx

Artık içeriğe ulaşabiliriz:

</figure>

Sonuç ve İyileştirmeler

Bir web sitesini, bu bilgileri kullanarak son başlıkta yer alan komutla birkaç saniyede yayına alabiliriz. Docker’da imajları kullanırken, hangi sürümü istiyorsak onun etiketini kullanmamız önerilir. Yani yukarıdaki komutu, Nginx’in 1.17.6 sürümü için şöyle yazmamız önerilir:

docker run -d -p 80:80 -p 443:443 --name web -v $PWD:/usr/share/nginx/html nginx:1.17.6

Kullanabileceğimiz etiket (tag) listesine Docker Hub üzerinde Nginx reposundan ulaşabiliriz.

Sistemi yayına alma sürecinde birden fazla sunucu kullanma imkanı, kesintisiz güncelleme gibi kısımlarda Kubernetes, Docker Swarm, HashiCorp Nomad gibi seçenekleri kullanarak çok daha fazla imkan ve özelliğe sahip yayına alma senaryoları gerçekleştirebiliriz.