Symfony, Docker, Kubernetes, Helm

Symfony Uygulamasının Dockerize Edilmesi, Docker Image ile Kubernetes Üzerine Deploy Edilmesi ve Helm ile Paketlenmesi

Samet Yılmaz
Wingie / Enuygun Tech
7 min readMar 15, 2021

--

Bu yazımda bir Symfony projesinin Dockerize edilmesini, dockerize edilen projenin Dockerfile ile Docker Image’a dönüştürülmesi, dönüştürülen bu image dosyasının Docker Hub’a gönderilmesi ve bu image kullanılarak projenin Kubernetes (K8s) üzerine deploy edilmesini adım adım anlatmaya çalışacağım. Bir de bunlara ek olarak Helm paket yöneticisine bir değineceğiz.

Neler yapacağımızı maddeleyecek olursak;

  • Basit bir Symfony projesini dockerize edeceğiz.
  • Dockerize ettiğimiz projeyi Dockerfile ile Docker Image’a dönüştüreceğiz.
  • Docker Image’ımızı Docker Hub’a yükleyeceğiz.
  • Docker Hub’a gönderdiğimiz image’ımızı Kubernetes Cluster’ımıza deploy edeceğiz.
  • Ek olarak, projemizin K8s deployumuzu helm ile paketleyeceğiz.

Öyleyse hadi başlayalımmm!! 🤩

Symfony Projemizi Dockerize Edelim:

Öncelikle uygulamamızın klasör yapısını oluşturalım. Çalışmamızı yürüteceğimiz klasörümüzü “symfony-docker-k8s” ismiyle oluşturuyoruz. İçerisine docker-compose ve Dockerfile içerisinde kullanacağımız configlerin olacağı “docker” klasörünü oluşturuyoruz.
Docker klasörünü oluşturduktan sonra aynı dizindeyken aşağıdaki komut ile “symfony” adında basit bir symfony projesini kuruyoruz.

Bu adımları uyguladıktan sonra klasör yapımız aşağıdaki gibi olacaktır.

Bu adımdan sonra hızlıca aşağıdaki gibi docker klasörümüzün içindeki yapıyı kurgulayalım.

docker klasörümüzün yapısı

Ve içlerini hızlıca dolduralım..

Nginx için iki farklı conf dosyası oluşturuyoruz. “-compose” olanı docker-compose için, “-k8s” olanı image oluşturmak için kullanacağız. Aralarındaki tek fark fastcgi_pass değerinin farklı olması.

nginx/default-compose.conf:

nginx/default-k8s.conf:

Php dockerfile dosyamızı oluşturalım.

php/Dockerfile:

Son olarak entrypoint.sh dosyamızı oluşturalım. Bu dosyadan kısaca bahsedecek olursam, bu dosyayı oluşturmamızdaki amacımız projeyi docker image haline getirdiğimizde, php image’ı üzerine nginx kurarak bunu gerçekleştireceğiz. Nginx’in bu container üzerinde çalışmasını sağlamak için .sh dosyası içerisinde gerekli bash commandini yazıyoruz.

entrypoint.sh:

“docker” klasörümüz üzerinde yapacaklarımız bu kadar.

Gelin şimdi docker-compose.yml dosyamızı oluşturalım ve projemizin çalıştığını görelim.

Compose dosyamızda Nginx’in stable-alpine image ını kullanıyoruz. Alpine versiyonu yaklaşık 5 mb boyuta sahip olması büyük avantaj. (~5 Mb).

Nginx containerımızın configlerine bakacak olursak, volumes altında projemizin yolunu ve nginx default conf dosyamızın yolunu vererek “8088” portunda yayına açılmasını talep ediyoruz.

Php tarafında ise farklı olarak hazırladığımız Dockerfile dosyamızı gösteriyoruz.

İşte bu kadar. 🤗

Şimdi docker-compose.yml dosyamızın olduğu dizine gelelim ve aşağıdaki komutu çalıştıralım.

❗️❗️ Projeyi github repodan çektiyseniz symfony klasörüne gidip composer install çalıştırmayı unutmayın 😊

Herhangi bir hata almadıysak, “localhost:8088” adresine gittiğimizde projemizin açıldığını göreceğiz.

localhost:8088–127.0.0.1:8088

Dockerfile ile Docker Image Oluşturalım:

Projemizi başarıyla dockerize ettiğimize göre şimdi projeyi nasıl docker image haline getirip Docker Hub’a göndereceğimize bakalım.

Bunun için ana dizine Dockerfile adında bir dosya oluşturalım ve içerisini aşağıdaki gibi dolduralım.

Burada php 7.2 versiyonunu kullandık. Php image’ı üzerine nginx kuruyoruz. Sonrasında yukarıda da farkından bahsettiğim üzere nginx conf dosyası olarak -k8s.conf dosyamızı ilgili path altına kopyalıyoruz. Projemizi de ilgili yere aktardıktan sonra gerekli izinleri veriyoruz ve .sh dosyamızı tetikliyoruz. Böylece nginx start olacaktır.

Bu işlem de bu kadar. Artık projemiz genel bir Dockerfile’a sahip olmuş oldu. Bu dockerfile üzerinden image oluşturabilir veya bu dosya kullanılarak compose üzerinden de proje ayağa kaldırılabilir. Ancak biz bu dosya ile image oluşturup kubernetes üzerinde ayağa kaldıracağız.

Dockerfile dosyamız hazır olduğuna göre docker image haline getirmek için aşağıdaki komutu çalıştıralım.

❗ Dockerfile içerisinde varolan proje gösterilmek yerine “git clone …” komutu ile proje repodan çekilip, composer install tetikletecek yapı kurulabilirdi.❗

Docker image dosyamızı “dockerize-symfony-5.2.5” adıyla build ediyoruz. Herhangi bir hata yapmadıysak image dosyamız başarıyla oluşacaktır. Hemen kontrol edelim.

Docker image’ımız başarıyla oluşturulmuş.

Şimdi bu image’ı Docker Hub üzerine gönderelim.

Eğer image’ınızda tag problemi yoksa doğrudan docker hub a gönderilmeye başlanacaktır. (DockerHubUserName alanını kendinize göre doldurmayı unutmayın.)

Artık Docker Hub üzerinde symfony image ımız hazır. Bu image ile kolayca nginx üzerinde koşan bir symfony projesini pull edebilir veya kubernetes üzerine deploy edebiliriz.

Kubernetes’e Projemizi Deploy Edelim:

Local ortamda kubernetes için kubectl ve minikube kurulu olmalıdır. Kısa bir internet araştırmasıyla bunları kurabilirsiniz. Dilerseniz bu uygulamaya Google Cloud, AWS, Digital Ocean gibi ortamlarda devam edebilirsiniz. Bu araçların local ortamınızda kurulu olduğunu varsayarak doğrudan işlemlere geçiyorum.

Hızlıca minikube’ü çalıştıralım ve dashboardumuzu açalım.

Kubernetes Dashboard

Kubernetes klasör yapısı gibi bir yapıyı kendi üzerinde barındırmaktadır. Bu özellik “Namespace” olarak adlandırılmaktadır. Hemen hızlıca projemizi deploy edeceğimiz bir namespace oluşturalım ve “symfony” namespace’imize geçelim.

symfony namespace

Bir deployment nesnesi oluşturalım.

Burada image olarak kendi image dosyamızı veriyoruz. Replicas değeri olarak 1 veriyoruz. Böylece projemiz 1 pod üzerinde koşacak.

Herhangi bir hata almadıysak deploy işlemimiz tamamlandı ve tanımladığımız gibi bir pod üzerinde projemiz çalışmaya başladı. Sıra bu projemizi dışarıya açacak service nesnemizi oluşturmaya geldi.

Herhangi bir hata ile karşılaşmadıysak servisimiz LoadBalancer tipinde “8087” portunda yayın yapmaya başladı bile.. 😎

Projemizi dockerize ettik, docker image haline getirdik, docker hub üzerinde paylaşıma açtık ve bu image’ı kullanarak kendi kubernetes clusterımız üzerine deploy ettik, yayına açtık.

Görüldüğü üzere bu kubernetes yapılandırma dosyalarını manuel olarak tek tek çalıştırdık. Daha kolay bir yöntem yok muydu? Tabii ki var.

Tüm kubernetes yapılandırma dosyalarını tek bir klasör altına alalım.

Tüm yapılandırma dosyaları tek bir yerde olduğunda aşağıdaki komutu çalıştırarak herbirinin tek tek kubernetes cluster üzerine uygulanmasını ve projemizin hem deploy edilip hem de yayına açılmasını sağlatabiliriz.

Ardından tek yapmanız gereken aşağıdaki bağlantıya tıklamak.

Hepsi bu kadar 😇

Peki, her şey güzel. Ama… Docker image mantığında tüm bu kubernetes yapılandırmaları paket halinde olsa, tek bir dosya ve tek bir komut olsa nasıl olurdu? Hatta Docker Hub gibi bir bulut üzerinde bu kubernetes paketimizi saklayabilsek? 🤔

Burada yardımımıza kubernetes paket yöneticisi olan “Helm” yetişiyor. 😍

Helm Kullanarak Deploy Paketi Oluşturalım:

Helm paket yöneticisi tüm yapılandırma dosyalarını tek bir dosya üzerinden yönetilmesini sağlayan bir araçtır. Docker Hub gibi helm paketlerini barındırabileceğimiz bazı ortamlar da bulunmaktadır. Örneğin,

Hazırsak kubernetes yapılandırma dosyalarımızı helm ile paketleyelim.

Yine kubectl ve minikube’de olduğu gibi helm’in de sisteminizde kurulu olduğunu varsayıyorum. Hemen projemizin olduğu dizine gidelim (/symfony-docker-k8s) ve aşağıdaki komut ile initial helm dosyalarımızı oluşturalım.

Burada birçok örnek yapılandırma dosyaları oluşturuldu. “templates” klasörü içindeki tüm dosyaları ve birkaç gereksiz dosyayı temizleyelim. Ardından kendi oluşturduğumuz üç adet yapılandırma dosyamızı buraya ekleyelim. Klasörümüzün son hali aşağıdaki gibi olacaktır.

Ardından “kubernetes-helm” klasörümüze gidelim ve aşağıdaki komut ile her şey yolunda mı bir bakalım.

Herhangi bir sorun yok ise artık paketlemeye hazırız. Bir üst dizine çıkalım ve aşağıdaki komutu çalıştıralım.

Bu komutun ardından projemiz klasörüne bir adet .tgz uzantılı helm paketi oluşacaktır. İşte bu! 😍

Artık bu paket ile tüm deployment sürecimiz elimizde. İster bir hub üzerinden çekin isterseniz de aşağıdaki gibi bir komut ile kolayca deploy edin.

Ardından aşağıdaki adrese giderek projenizin yayında olduğunu görebilirsiniz.

Evet, birkaç farklı yoldan deploy yöntemlerini inceledik. Umarım faydalı olmuştur.

Bu makaledeki tüm kodlara github repom üzerinden erişebilirsiniz. Sizler de projelerinizde bu adımları uygulayarak hem docker üzerinde projenizi çalıştırabilir hem de kubernetes üzerine kolayca deploy edebilirsiniz.

Yazım biraz uzun oldu, zaman ayırıp okuduğunuz için teşekkür ederim 😊

Wingie / Enuygun’un büyüyen ekibinin bir parçası olmak ister misin? Açık pozisyonlarımızı LinkedIn sayfamızda bulabilirsin. Tech ekibimize başvurmak için CV’ni kariyer@enuygun.com’a iletebilirsin.

Bir sonraki yazıda görüşmek dileğiyle..

--

--