Flask Uygulamalarını Docker ile Deploy Etmek

Python dili ve Flask mikro-framework’ü ile yazdığınız Web uygulamalarını sunucu üzerine deploy etmek biraz zahmetli bir iştir. Docker kullanarak bu deploy işlemini hem kolaylaştırmak hem de eğlenceli hale getirmek mümkün. Bu yazıda basit bir Flask uygulamasını bir docker container’a deploy edeceğiz.

Flask Uygulamamız

Flask uygulamamızı barındıracak yeni bir klasör açalım.

    $ mkdir merhaba_dunya

Şimdi bu klasörün içinde app.py adlı bir dosya açıp basit uygulamamızı yazalım.

# merhaba_dunya/app.py
from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def merhaba_dunya():
    return 'Merhaba Dünya!'
 
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

Bu basit Flask web uygulamamızın bağımlılıklarını da normalde yaptığımız şekilde requirements.txt adlı bir metin dosyası içerisine yazalım. Bu basit bir uygulama olduğundan kurmamız gereken sadece Flask olacak.

Flask==1.0.2

ve docker sahneye çıkar…

Şu ana kadar normal, basit bir Flask web uygulaması yazdık. Şimdi Dockerfile dosyamızı oluşturalım. Dockerfile dosyası, oluşturacağımız docker imajının içeriğini ve üzerinde yapılacak işlemleri tarif ettiğimiz bir dosyadır. Bu dosyada yazdığımız komutlar kullanılarak uygulamamızı çalıştıracağımız ortam hazırlanır.Bu anlamda Dockerfile dosyasını bir çeşit yemek tarifine benzetebiliriz. Dockerfile’ın ilk satırda kullanmak istediğimiz temel Docker imajını belirtiyoruz. Bu örnekte biz Docker Hub’da bulunan python imajını kullanacağız. Ancak isterseniz başka bir Docker imajı da kullanabilirisiniz. Böylece Production sunucusu üzerindeki ortama uygun bir imaj seçip gerekli kurulumları yapabilirsiniz. Bu şekilde geliştirme ve production ortamlarını mümkün olduğunca aynı hale getirerek, uygulamanın production sunucusu üzerine taşınması aşamasının mümkün olduğunca sorun çıkmadan ve hızlı bir şekilde yapılmasını sağlarsınız.
Kullanabileceğiniz Docker imajları hakkında daha fazla bilgi almak isterseniz https://hub.docker.com/_/python/ adresini ziyaret edin.

FROM python:3.4.5-slim

Kullanacağımız Docker imajını belirttikten sonra yine Dockerfile içerisinde bu satırın altında uygulamamızı barındıracak klasörü açalım. Docker imajı içinde bir komut çalıştırmak için RUN komutunu kullanıyoruz.

RUN mkdir /merhaba_dunya

Burada RUN komutu ile mkdir komutunu docker imajı üzerinde çalıştırmak istediğimizi belirtiyoruz. Bu örnekte biz sunucunun kök dizini altında merhaba_dunya adlı bir klasör açtık.

WORKDIR /merhaba_dunya

Bu komutla docker’a bundan sonra Dockerfile içerisinde bahsi geçen kopyalama yada çalıştırma gibi komutların belirttiğimiz çalışma dizini baz alınarak yapılması gerektiğini söylüyoruz. Şimdi docker container içerisine requirements.txt dosyasını ekleyelim. Bildiğiniz gibi bu dosya uygulamamızın çalışması için kurulması gereken bağımlılıkları listelediğimiz bir metin dosyasıydı.

ADD requirements.txt .

Bu komutta . işaretinin daha önce WORKDIR ile belirttiğimiz çalışma dizinini ifade ediyor.
Artık requirement.txt dosyasını docker container içerisine kopyaladığımıza göre container içerisine Flask kurulumu yapabiliriz.

RUN pip install -r requirements.txt

Kurulumu yaptıktan sonra uygulamamıza ait olan ve yerel makinemizdeki klasörde olan bütün dosyaların docker container içinden erişilebilir olması çin başka bir ADD komutu kullanalım.

ADD . .

Burada ilk . işareti yerel makinemizdeki proje dizinimizi, ikinci . ise WORKDIR ile belirttiğimiz ve docker container içinde bulunan dizini ifade ediyor.
Flask uygulama sunucumuz normalde 5000 numaralı porttan hizmet verdiğinden container’ın bu portunun dış dünyaya açılması gerekiyor. Bunun için EXPOSE komutunu kullanıyoruz.

EXPOSE 5000

Dockerfile’ımız neredeyse tamamlandı. Artık uygulamamızı çalıştırmak için gerelik komutu yazabiliriz.

CMD ["python", "app.py", "host", "0.0.0.0"]

bu komuta verdiğimiz host 0.0.0.0 parametresi ile flask uygulamamızın bütün IP’lerden 5000 portuna gelen isteklere cevap vermesini sağlıyoruz.

Dockerfile dosyamızı böylece tamamladık. Şimdi hazırladığımız bu Dockerfile’a göre docker image’ımızı hazırlayalım. Bunun için yerel makinemizde terminalde hazırladığımız Dockerfile’ın bulunduğu dizindeyken

docker build -t merhaba-flask

komutunu verelim. Dockerfile’da belirttiğimiz işlemler yapılacak ve bu komutta -t parametresi ile merhaba-flask adını verdiğimiz docker imajımız oluşturulacak. İşlem bittiğinde docker imajımızın oluştuğunu görmek için

docker images

komutunu kullanabilirsiniz.

Docker imajımızı hazırladık. Artık uygulamamızı çalıştırabiliriz. Bunun için docker run komutunu kullanıyoruz.

docker run -p 5000:5000 --name merhaba-flask-server merhaba-flask

Bu komutta -p parametresi ile yerel makinemizin 5000 numaralı portunun, hazırladığımız docker container’ımızdaki 5000 portuna bağlı olduğunu belirtiyoruz. –name parametresi ile de çalıştıracağımız sunucu container’ına bir isim veriyoruz. Son olarak da bu container’in biraz önce docker build komutu ile hazırladığımız merhaba-flask imajı kullanılarak oluşturulacağını belirtiyoruz.
Bu komutu verdiğimizde docker container’ımız ve içindeki flask uygulamamız çalışacaktır.
Kontrol etmek için tarayıcımızı açıp localhost:5000 adresine gidelim.


uygulamayı CTRL+C ile durdurabilirsiniz.

Artık basit flask uygulamamızı içeren docker container’ımız hazır. Bu container’ı

docker start merhaba-flask-server
docker stop merhaba-flask-server

komutları ile çalıştırıp durdurabilirsiniz.

Bu yazıyla ilgili kodlara https://github.com/kaizen71/flask-docker adresinden ulaşabilirsiniz.