Azure Kubernetes Service : NGINX ile Docker Containerization Pratikleri

Merhaba, Azure Cloud platformunun sunduğu Kubernetes Service başlıklı bir seri yapmak niyetindeyim, başlangıç olarak bu yazımda docker hub kullanımını ve nginx ile web uygulamalardaki containerization pratiklerini birlikte deneyimleyelim istiyorum.

Bunun için ihtiyacımız olacak toollar:

  • Docker Desktop
  • Microsoft VS Code
  • Chocolatey
  • nginx

Installation işlemleri için hem kütüphanesindeki paket zenginliği hem de kullanım kolaylığı açısından ben Chocolatey kullanıyorum. İhtiyacınız olan herhangi bir toolu indirmek için ‘choco install’ komutu yeterli oluyor ve mevcut ise saniyeler içerisinde indirme işlemini tamamlıyor.

choco install docker

Henüz lokalinizde yok ise Docker Desktop kurarak başlayabilirsiniz. Mevcut kullandığınız işletim sisteminize göre Docker Desktop Installer ı aşağıdaki official sayfasından edinebilirsiniz.

Benim ortamım Windows olduğu için şu andaki en güncel sürüm olan v4.28.0 için olan Docker Desktop Installer.exe yi indirip direkt kurdum.

Installation sonrası sizi aşağıdaki ekran karşılayacak. Herhangi bir sorunla karşılaşırsanız çok muhtemelen Hyper-V ayarı ile ilgili olabilir ilk olarak bunu ortamınızda aktive etiğinizden emin olun.

İlk olarak basit container bir web uygulaması yazıp bunu docker hub a deploy edeceğiz. Web uygulamasını baştan oluşturma ve build aşamaları için dockerfile ihtiyacımız var. Visual Studio Code IDE içerisinde latest versiyon debian image ı baz alan custom bir image oluşturup içerikteki paketleri update eden ve hiç stop a geçmeyecek şekilde bir container tanımladığım dockerfile ı oluşturup kaydediyorum.

Oluşturduğum dockerfile ın olduğu dizine giderek bunu derliyorum.

docker build -t playground-image .

Image oluşturma adımı tamamlandığında docker images command i ile oluşturduğunuz custom image ı grepleyerek listeleyebilirsiniz.

docker images | grep <custom_image_name>

Debian tabanlı custom imagedan yeni bir container oluşturuyorum. Beraberinde ‘sleep infinity’ parametresi vermemin sebebi container ın ben müdahale etmediğim sürece stop moda geçmemesi için.

docker run -d --name <container_name> <image_name> sleep infinity

Container içerisine girmek istediğimizde exec komutu kullanıyoruz.

docker exec -it <container_name> bash

ls komutu ile mevcut dosyaları listeledim. Çalışır durumdaki bir container a dosya transferi yapmak istediğiniz farklı bir powershell penceresinden docker cp komutu kullanabilirsiniz.

docker cp C:\Users\<file_path> <container_name_or_id>:/

Kopyalama işlemini root directoryde yapmak için :/ yeterli, spesifik bir directoryye kopyalayacaksanız da buraya path i vermeniz yeterli. Çalışır durumdaki container oturumunu stop komutu ile sonlandırabiliriz.

docker stop <container_name_or_id>

İlgili container ı tamamen silmek için :

docker rm <container_name_or_id>

Çalışır durumdaki container ı bu komutla silmeye çalışırsanız hata alırsınız. Containerdan tamamen kurtulmak için 2 opsiyon bulunuyor. Ya container ı stop moda getirirsiniz yada force silme işlemi için yukarıdaki komuta -f parametresi vererek ilgili container ı kalıcı olarak silebilirsiniz.

Bu pratikler sonrası artık nginx:alpine image tabanlı bir container içerisinde bir websitesi ayağa kaldırıp bunu docker hub a upload etmeyi deneyelim.

Nginx açık kaynak kodlu bir web sunucusudur, internet üzerinden gelen erişim isteklerini yöneterek veri transferi sağlar aynı zamanda yüksek trafik çeken web siteleri için de performans iyileştirmesi ve hızlı veri transferi için kullanılmaktadır. Statik bir web sitesi oluşturacağımız için nginx image tercih ettim.

İlk olarak docker hubta hazır bulunan nginx:alpine imajdan container ı oluşturuyorum.

docker run -d nginx:alpine

docker ps komutu ile yine ne var ne yok listeliyorum. exec komutu ile de container içerisine yönlendiriyorum.

nginx/html directorysine gidip buradaki index.html içeriğine bakarsak hazır bir template olduğunu görüyoruz.

cd /usr/share/nginx/html
cat index.html

Mevcut template ile ilerlemek istemezseniz aşağıdaki formatta bir index.html içeriğini dilediğiniz gibi özelleştirebilirsiniz.

Aşağıdaki docker file ı build edip kodda verilen image ı derliyorum.

docker build -t <docker_image_name>

Sıfırdan bir container yaratırken isimlendirme yapmazsanız otomatik olarak random ve eğlenceli isimlendirmelerle karşılaşabilirsiniz. :)

Hali hazırda var olan bir container ı yeniden isimlendirmek istersek :

docker rename <container_name_or_id> <new_container_name>

Image ı taglemek için :

docker tag my-playground-website <your_docker_hub_user>/playground-website:v1

Henüz Docker Hub a kaydolmadıysanız burada kendinize bir hesap açıp docker desktoptan sign in olmalısınız, ben github hesabım ile eşleştirdim.

Sonrasında bunu docker hub a pushluyorum.

docker push <your_docker_hub_user>/playground-website:v1

Bu işlem sonrası Docker hub web sitesinden public olarak ilgili image a erişebilir bunu lokale çekip container yaratabilirsiniz.

Son olarak docker run komutu ile web sitesini 80 portundan ayağa kaldırıyoruz ve erişime açıyoruz.

docker run -p 80:80 <your_docker_hub_user>/playground-website:v1

Tarayıcıdan http://localhost/ adresinden az önceki default nginx base image ile gelen index.html içeriğinin geldiğini görebilirsiniz.

Aktaracaklarım bu günlük bu kadar.

23 Nisan Ulusal Egemenlik ve Çocuk Bayramımız kutlu olsun. ❤

--

--