Bloğa geri dön

Ubuntu 20.04 üzerinde Docker ile bir Flask Uygulaması Oluşturma ve Dağıtma

Ubuntu 20.04 üzerinde Docker ile bir Flask Uygulaması Oluşturma ve Dağıtma

Giriş

Docker açık kaynaklı bir konteyner platformudur. Yazılımın, fiziksel ana makinede çalışan diğer yazılımlardan yalıtılmış olarak çalışmasını sağlayan hafif, sanallaştırılmış, taşınabilir, yazılım tanımlı standartlaştırılmış bir ortamdır. Docker, sanal makinelere hafif bir alternatif sunar. Aynı zamanda uygulamaların taşınabilirliğini, performansını, çevikliğini ve ölçeklenebilirliğini sağlar. Kapsamlı bir Docker ekosistemi hakkında rehber için, Docker ile konteynerleştirmeye yönelik ayrıntılı genel bakışımıza göz atın.

Flask ile oluşturulmuş açık kaynaklı, minimal bir web çerçevesidir (framework). Python. Flask'in harika özelliklerinden bazıları hafif, esnek ve son derece yapılandırılmış olmasıdır. Ayrıca, çalışması için özel bir araç veya eklenti gerektirmez.

Flask ve Docker'ı birleştirmek size hafif, esnek ve ölçeklenebilir bir uygulama sunar. Dockerize edilmiş konteynerlerin taşınabilir yapısı sayesinde bunu birçok sunucuya ve altyapıya dağıtabilirsiniz. Bu eğitimin odak noktası, bir Flask uygulamasını Docker ile nasıl dağıtacağınızı göstermektir. Ayrıca uygulamanızın gelecekteki güncellemelerinin geçerli olmasını nasıl sağlayacağınızı da göstereceğiz.

Gereksinimler

Bu uygulamalı bir eğitim olacak ve takip etmenizi sağlayacak bir ortam oluşturmalısınız:

hakkındaki eğitimimizi takip edin. Şimdi başlayalım!

Adım 1: Flask Uygulamasını Hazırlayın

Flask uygulamamızı barındıracak bir dizin oluşturarak başlayacağız. İstediğiniz bir dizin adını seçebilirsiniz. Ancak bu eğitim için bunu flask_demo. Proje dosyalarını /var/www dizini içine kaydedeceğiz; bu dizin genellikle Ubuntu'nun varsayılan olarak genel internete erişime izin verdiği dizindir. İlk olarak, dizini oluşturmak ve içine girmek için aşağıdaki komutları çalıştırın:

Projemizin bu kök dizini içinde, bir Flask uygulamasının temel klasör yapısını oluşturacağız. Ardından, yol boyunca tüm üst klasörleri oluşturmak için -p bayrağını ekleyerek temel yapıyı oluşturmak için aşağıdaki komutu çalıştırın:

App klasörü, views ve blueprints dahil olmak üzere bir Flask uygulamasıyla ilgili tüm dosyaları barındırır. Views (Görünümler), uygulamanıza gelen isteklere yanıt vermek için yazdığınız kodu içerir. Blueprints (Taslaklar), uygulama bileşenlerinin oluşturulmasına yardımcı olur ve Flask uygulamalarındaki yaygın kalıpları destekler.

Uygun bir şekilde adlandırılmış olan static klasörü resimler, CSS ve JavaScript dosyaları gibi statik varlıkları barındırır. templates dizini ise proje için tüm HTML şablonlarını barındırır.

Artık bir Flask uygulamasını başlatmak için gereken dosyaları yazmaya başlayabiliriz. App dizini içinde __init__.py adında bir dosya oluşturarak başlayın; böylece Python yorumlayıcısına app dizininin bir paket olarak ele alınması gerektiğini bildirmiş olursunuz. Dosyayı nano düzenleyici ile açmak için terminalinizde aşağıdaki komutu çalıştırın:

Python'da modülleri mantıksal ad alanları veya hiyerarşiler halinde gruplamak için paketleri kullanırız. Modülerleştirme, kodun belirli işlevleri yerine getiren bağımsız ve yönetilebilir bloklara bölünmesini sağlar.

Bundan sonra, editörünüzde açık olan __init__.py dosyası içine, Flask örneğini başlatmak için aşağıdaki kod parçacığını ekleyin ve bir sonraki adımlarda oluşturacağınız views.py dosyasından mantığı içe aktarın:

İşiniz bittiğinde, Ctrl + O ve ENTER dosyayı kaydetmek, ardından Ctrl + X ile kapatın. Sonra, views.py dosyasını app dizini içinde oluşturalım. views.py dosyası, uygulama mantığının çoğunu içerecektir:

Dosyanın içine aşağıdaki kod parçacığını ekleyin. Bu kod, kullanıcılar web sitenizi ziyaret ettiğinde uygulamanızın çalıştığını göstermek için basit bir dize görüntüleyecektir:

Bu dosyada, Flask uygulama örneğini içe aktararak başlıyoruz. Ardından, rotayı tanımlamak için bir satır eklememiz gerekiyor: @app.route(/). @app.route(/) satırı, Flask'ta bir dekoratör olarak adlandırılır. Dekoratörleri, bir veya daha fazla fonksiyona ek işlevler enjekte etmek için kullanabilirsiniz. Bu durumda, rotaya bir çağrı iletiyoruz / home fonksiyonuna yönlendiriyoruz. Bir kullanıcı bu rotayı ziyaret ettiğinde şu metni görecektir: "Flask uygulamamız çalışıyor!".

Ardından, uygulama için uwsgi.ini dosyasını oluşturarak uWSGI yapılandırmalarını tutacaksınız. uWSGI Nginx için bir protokol ve uygulama sunucusu olarak hizmet veren bir dağıtım seçeneğidir. Projenin kök dizininde nano düzenleyici ile dosyayı oluşturmak için aşağıdaki komutu çalıştırın:

Açılan dosyanın içine aşağıdaki kod parçacığını ekleyin:

Bu dosya bazı yönergeler içerir. Amaçlarını aşağıda tanımlıyoruz:

  • module – Flask uygulamasının sunulacağı modülü tanımlar. Modülü, kök dizindeki main.py dosyasını referans alarak main olarak ayarladık. Bu dosyayı bir sonraki adımda oluşturacağız.
  • callableuWSGI uygulamasının, uygulamadan dışa aktarılan app örneğini kullanmasını söyler.
  • master – tüm uygulamanın yeniden yüklenmesi sırasında kesinti süresini en aza indirmek için uygulamanın çalışmaya devam etmesini sağlar.

İşiniz bittiğinde dosyayı kaydedip kapatın.

Şimdi, uygulamanızın giriş noktasını belirlemek için main.py dosyasını oluşturabilirsiniz. uWSGI uygulamayla nasıl etkileşime gireceğini bilmek için bu dosyayı okuyacaktır. Projenizin main.py  dosyasını nano ile kök dizini içinde oluşturmak için aşağıdaki komutu çalıştırın:

Dosyanın içine, uygulama paketinde oluşturulan Flask örneğini içe aktaracak aşağıdaki satırı ekleyin:

Bu adımda yapacağınız son şey, uygulamanın çalışması için gerekli bağımlılıkları tanımlamaktır. Bu bağımlılıkları dependencies.txt adlı bir dosya içinde tanımlayacağız. Docker, uygulamanızın imajını oluşturduğunda, bağımlılıkları yüklemek için bir pip (paket yöneticisi) komutu çalıştıracaktır. Kök dizindeki dosyayı aşağıdaki komutla açın:

Projemizde bu noktaya kadar sadece tek bir bağımlılık istiyoruz: Flask. Bu nedenle, projemiz için istediğimiz doğru Flask sürümüne referans vermek için aşağıdaki satırı ekleyebiliriz:

Bağımlılık olarak Flask sürümünü 2.0.1 seçiyoruz. Bu kılavuzun yazıldığı sırada en son sürümdür. Çeşitli sürümler hakkında daha fazla bilgiyi Flask Değişiklikleri (Flask Changes) sayfasından edinebilirsiniz. Bu, Flask uygulaması kurulumunu tamamlar. Şimdi dağıtım için Docker yapılandırmalarını hazırlayalım.

Adım 2: Docker'ı Yapılandırma

Bir Docker dağıtımı kurmak için iki dosya oluşturacağız: Dockerfile ve start.sh. Dockerfile bir Docker imajını oluşturan bildirimsel satırlar içerir. start.sh ise imajı oluşturmak ve konteyneri Dockerfile üzerinden başlatmak için temel bir kabuk (shell) betiğidir. Projenin kök dizinindeyken, Dockerfile:

Bu dosya, bir Docker imajı için gerekli yapılandırmaları barındırır. Ardından, bağımlılıkları ve imajın nasıl oluşturulacağını belirtmek için aşağıdaki kod parçacığını ekleyin:

Bir Dockerfile içindeki ilk satır, imajımızı oluşturduğumuz temel imajı tanımlar. Bu durumda, tiangolo/uwsgi-nginx-flask, şu adresten edinilebilir: DockerHub. Birçok Python sürümünü desteklediği için özellikle bu imajı seçtik.

Ayrıca imajı güncellemek istediğimizi de belirtiyoruz. Ardından, bash komut processo , nano metin editörünü ve git istemcisini for pulling and pushing source code from version control repositories such as GitHub,, Bitbucket, veya Gitlab gibi sürüm kontrol depolarından kaynak kodunu çekmek ve göndermek için eklememiz gerekiyor. ENV içeren satırlar, konteyner içinde kullanılacak ortam değişkenlerini belirtir.

The COPY komutu, bağımlılıkları konteynerin içine kopyalar. RUN komutu, pip paket yöneticisini to parse the dependencies.txt dosyasını çözümlemek ve bağımlılıkları yüklemek için çağırır. Düzenlemeyi bitirdiğinizde dosyayı kaydedip kapatın.

Sırada, start.sh betiğini oluşturacaksınız. Bu betik, imajı derlemek ve çalıştırmak için Docker komutlarını içerecektir. Bu komutları terminalde sırayla çalıştırabilseniz de, bunları bir kabuk betiğine eklemenin ve terminalden tek bir komutla çağırmanın daha temiz olacağını düşündük.

Bu dosyanın içeriğini tanımlamadan önce, diğer hizmetlerin kullanmadığı boş bir port belirlemeliyiz. Biz 45644 portunu kullanacağız. Ancak farklı bir port da seçebilirsiniz. Portun boş olup olmadığını kontrol etmek için aşağıdaki satırı çalıştırın:

Seçtiğiniz porta bağlı olarak, yukarıdaki komutun çıktısı 1 ise, port boştur. Aksi takdirde, başka bir port seçip komutu tekrar denemeniz gerekebilir:

Flask application Port Check

Boş bir port belirlediğimize göre, artık aşağıdaki komutu çalıştırarak projenin kök dizininde nano ile dosyayı oluşturabiliriz:

Bu dosyanın içine aşağıdaki kod parçacığını ekleyin:

İlk satır, shebang olarak adlandırılır ve bunun bir bash dosyası olduğunu ve komut olarak yürütülmesi gerektiğini belirtir. İkinci satır, app_name adında bir değişken tanımlar. Bu değişkeni imaj ve konteyner adlarını ayarlamak için kullanırız. Üçüncü satır, Docker'a imajı build etmesini söyler. Bu işlem, geçerli dizindeki Dockerfile tanımına dayanır. İmaj, değişkene göre docker-flask-demo olarak adlandırılacaktır.

Son satır, tanımladığımız değişkene göre docker-flask-demo adında bir konteyner oluşturur. -d bayrağı, komutun yürütülmesi bittikten sonra konteynerin arka planda ayrılmış (detached) bir durumda çalışmaya devam etmesini sağlar. -p bayrağı, sunucudaki bir portu konteynerdeki belirli bir porta bağlar. Bu durumda, ana makinedeki 45644 portunu, Docker'ın konteynerde dışa açacağı 80 portuna bağlıyoruz.

We use the -v bayrağını, konteynere bağlanacak bir Docker birimi (volume) belirtmek için kullanırız. $PWD değişkeni, belirli bir anda bulunduğunuz geçerli dizinin yolunu tutan varsayılan bir Linux değişkenidir:

Flask application pwd

Bizim durumumuzda, tüm proje dizinini konteynerin /var/www dizinine bağlıyoruz. Docker yapılandırması artık hazır. Aşağıdaki komutu çalıştırarak imajı derleyebilir ve derlenen imaja dayalı olarak konteyneri başlatabilirsiniz:

Betikin çalışmasının bitmesini bekleyin, ardından çalışan tüm konteynerleri listelemek için aşağıdaki Docker komutunu çalıştırın:

Çıktı, çalışan konteynerleri gösterecektir:

Demo Docker

Çalışan konteynerler listesinde şu isme sahip konteynerimizi görmelisiniz: docker-flask-demo çalışan konteynerler listesinde. Sunucunuzun genel IP adresini bulun ve tarayıcınızda belirtilen porttan erişin: http://your-server-public-ip:45644.

Benzer bir çıktı görmelisiniz:

Flask App Running

Tarayıcınızda yukarıdakini görüyorsanız, bir Flask uygulamasını başarıyla dağıtmışsınız demektir. Sırada, dosyaları değiştireceğiz ve şablonlar aracılığıyla kullanıcılara içerik sunacağız.

Adım 3: Şablon Dosyaları Aracılığıyla İçerik Sunma

Flask'ta, Şablonlar web sitesi ziyaretçilerine statik ve dinamik içerik göstermek için kullanılır. Size nasıl bir HTML şablonu oluşturacağınızı ve kullanıcılar belirli bir rotayı ziyaret ettiğinde bunu onlara nasıl sunacağınızı göstereceğiz. Örneğin, bu bir Ana sayfa veya Hakkında sayfası olabilir.

Terminalinizde aşağıdaki komutu çalıştırarak index.html dosyasını app/templates dizininde oluşturun:

Ardından, dosyaya aşağıdaki kod parçacığını ekleyin:

İşiniz bittiğinde dosyayı kaydedip kapatın. Ayrıca, aşağıdaki komutla Hakkında sayfası olarak adlandıracağımız başka bir sayfa oluşturun:

Dosyaya aşağıdaki kod parçacığını ekleyin:

İşiniz bittiğinde dosyayı kaydedip kapatın. Sırada, gerçek sayfaların rotalarının yanı sıra şablonlara da başvurmak için app/views.py dosyasını düzenleyin:

Dosyayı şu şekilde görünecek şekilde düzenleyin:

İşiniz bittiğinde dosyayı kaydedip kapatın. Yaptığınız değişiklikler, konteyneri durdurup yeniden başlatana kadar geçerli olmayacaktır. Konteyneri durdurmak ve başlatmak için aşağıdaki Docker komutlarını çalıştırın. Daha önce tanımladığımız konteyner adını not edin:

Konteyner çalışmaya başladıktan sonra, yeni içeriklerden bazılarını görmek için Ana sayfayı ve Hakkında sayfasını ziyaret edin:

Flask application Index

 Flask application 1

Şu ana kadar, web sitenizin ziyaretçilerine içerik sunabilen bir Flask uygulaması oluşturdunuz. İşte projenin dosya yapısı:

File Structure

Yeni değişiklikleri algılaması için Docker konteynerini yeniden başlatmamız gerektiğini muhtemelen fark etmişsinizdir. Bir sonraki adımda, daha az kesinti süresi sağlamak için bunu otomatikleştireceğiz.

Adım 4: Uygulama Dosyaları Güncellemelerini Otomatik Olarak Yeniden Yüklenecek Şekilde Yapılandırın

Mantığı, kullanıcı arayüzlerini geliştirmek veya bazı bağımlılıklar eklemek için neredeyse her gün bir uygulamada değişiklikler yaparız. Bu tür değişikliklerin geçerli olması için Docker konteynerini yeniden başlatmanız gerekebilir. Neyse ki, uWSGI konteyneri yeniden başlatmadan bir Python betiğini yeniden yüklemek için touch-reload adında bir özelliğe sahiptir.

Python, kutudan çıktığı haliyle, değişiklikler için tüm dosya sistemini izleyen ve bir değişiklik olduğunda uygulamayı yenileyen bir auto-reloading özelliğine sahiptir. Otomatik yeniden yükleme, kesinti sürelerini en aza indirmek için iyi olsa da, kaynak yoğun olabilir. Bu nedenle, üretim ortamları için önerilmez.

Belirli bir dosyadaki değişiklikleri izlemek ve değişiklik olduğunda uygulamayı yeniden yüklemek için touch-reload özelliğini nasıl kullanabileceğinizi görelim. uwsgi.ini dosyasını nano düzenleyici ile düzenleyin:

Vurgulanan satırı şu şekilde görünecek şekilde ekleyin:

İşiniz bittiğinde dosyayı kaydedip kapatın. Eklenen satır, uygulamanın yeniden yüklenmesini tetiklemek için değiştirilecek bir dosya belirtmiştir. Ancak, bu koşulun gelecekteki değişiklikler için etkinleştirilmesi için önce konteyneri yeniden başlatmalısınız:

Otomatik yeniden yüklemenin nasıl çalıştığını göstermek için şimdi app/views.py dosyasını değiştirebilirsiniz:

Home fonksiyonu tarafından döndürülen dizeyi vurgulandığı gibi değiştirin:

İşlem bittiğinde dosyayı kaydedip kapatın.

Tarayıcıda uygulamanızın ana sayfasını açın: http://your-server-public-ip:45644.

Henüz herhangi bir değişiklik görmeyeceksiniz. Bunun nedeni, touch-reload koşulunun uwsgi.ini dosyasındaki bir değişikliği algılamasıdır. Koşulu etkinleştirmek ve dolayısıyla aşağıdaki komutla tüm uygulamayı yeniden yüklemek için touch kullanabilirsiniz:

Şimdi, ana sayfayı yeniden yüklerseniz, yeni değişikliklerin görüntülendiğini göreceksiniz:

Touch Reload

Gelecekte, herhangi bir değişiklik yaparsanız, yalnızca şu komutu çalıştırmanız yeterlidir: sudo touch uwsgi.ini ve tüm uygulama daha az kesinti süresiyle yeniden yüklenecektir. Bu da bizi bu eğitimin sonuna getiriyor.

Sonuç

Bu eğitimde, Docker imajları ve konteynerleri ile bir Flask uygulamasını hayata geçirdiniz ve dağıttınız. Konteyneri yeniden başlatma ihtiyacından kaçınarak kesinti süresini en aza indirmek için, touch-reload seçeneğini belirli bir dosyadaki değişiklikleri dinleyecek ve tüm uygulamayı otomatik olarak yeniden yükleyecek şekilde yapılandırdınız. Son olarak, çalıştığından emin olmak için tüm bunları tarayıcıda test ettiniz.

Docker daha hızlı dağıtımlar sağlar ve uygulamaların kolayca ölçeklendirilmesine olanak tanır. Çeşitli Docker komutları hakkında daha fazla bilgi edinmek isterseniz, lütfen şu kılavuza göz atın: Ubuntu üzerinde Docker nasıl kurulur ve kullanılır.

Docker hakkında daha fazla kaynak için blogumuza göz atabilir, aşağıdakileri inceleyebilirsiniz:

Keyifli Bilişimler!

author

Pranay Kapgate

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.