Docker Image olarak API servisi oluşturma [python flask]
Merhaba bu yazıda sizlerle python ile bir mikroservis oluşturup bunu dockerhub üzerine yükleyip daha sonra docker ile container olarak çalıştırmaktan bahsedeceğim.
Kodları github üzerinden paylaştım.
Dosyalar
APIGateway
— “__init__.py”
— “API.py”
run.py
requriment.txt
Dockerfile
APIGateway → API.py : Servis işlemlerini gerçekleştirdiğimiz yer.
from flask import render_template, jsonify, Blueprint, requestservice = Blueprint(‘Api’, __name__,)@service.route(‘/5bayt’, methods=[‘POST’])
def index(): #GET.
accessTokenGET = request.args.get(‘AccessToken’)
accessTokenSecretGET = request.args.get(‘AccessTokenSecret’)#POST
textPOST = request.values.get(‘Text’)if accessTokenGET == “Admin” and accessTokenSecretGET == “Admin”:
return jsonify(textPOST)
else:
return jsonify(‘KEY hatası’)
APIGateway → __init__.py : Klasörün modül olduğunu gösteren boş python doyası.
#__init__.py
run.py: Docker image oluşurduğumuzda servisi ayağa kaldıracak başlangıç dosyası.
Flask<1
requirement.txt: Servisi docker üzerine image olarak build ederken python projemizin hangi kütüphaneleri kullandığını tanımladığımız gereklilik dosyası. Host adresine 0.0.0.0 yazıyoruz. Port alanına hangi portta çalışacağını belirtiyoruz. from APIGateway.API import service bölümünden servisi referans veriyoruz. [flask mimarisinin kurallaru uygulanıyor]
from os import environfrom flask import Flask, render_templatefrom APIGateway.API import serviceapp = Flask(__name__) # Flask app tanımlandı.app.register_blueprint(service) #API modülü içinden çağrılacak tanımlandı.if __name__ == '__main__': app.run(host='0.0.0.0', port=9000, debug=True)
Dockerfile: Uzantısız olan, içeriğinde docker image oluştururken image özelliklerini tanımladığımız dosya.
Burada python versiyonu yazılıyor. Image’imizin app adında bir klasör içinde çalışacağını, ve teker teker requeriment.txt ve başlangıç dosyası run.py’nin app içine kopyalanmasını istiyoruz. Sonra requriment.txt in pip install şeklinde yüklenmesini istiyoruz. run.py nin başlatılmasını istiyoruz. EXPOSE olarak 9000 portunu belirttik burada tekrar.
FROM python:3.6RUN mkdir /appWORKDIR /appCOPY requirements.txt /appENV IN_DOCKER_CONTAINER YesCOPY run.py /appCOPY . /app/RUN pip install -r requirements.txtENTRYPOINT ["python"]CMD ["run.py"]EXPOSE 9000
DockerHUB üzerine image olarak build etmeden önce servisimizin çalışıp çalışmadığını kontrol ediyoruz.
VSCode üzerinden run.py dosyasını çalıştırıyoruz.
Daha sonra POSTMAN üzerinden API’ye sorgu yolluyoruz.
Servisden beklediğim sonuçları aldım. Geldik image oluşturma aşamasına.
Local’de docker kurmuştuk. Ve projemizi lokalde image haline getirelim. Termianlden projemizin olduğu dizine geliyoruz. docker build . komutu ile o dizindeki Dockerfile referans olarak alınacak ve image oluşturma işlemi başlayacak.
docker build .
Build işlemimizin sonucu, Dockerfile içinde belirttiğimiz süreç başarıyla gerçekleşti.
Şimdi aşağıdaki komutu vererek image olarak projemizi lokalde listeliyoruz.
docker image ls
Image’imizi Container olarak çalıştırmak için aşağıdaki komutu veriyoruz.
docker run -p 9000:9000 image_name:tag_name
Daha sonra container listelemeden containerı listeliyoruz.
docker container ls
Docker üzerinde servisimiz çalıştı.
DockerHub’a üye oluyoruz. Ve Create Repository seçeneğinden image yükleceğimiz repo oluşturuyoruz. Docker public olarak sınırsız, private olarak 1 tane repo veriyor.
Şimdi geriye tek kalan projemizi image olarak push işlemi ile DockerHub’a atmak.
docker push KULLANICIADI/IMAGEADINIZ:TAG
İnternet yavaşlığından dolayı örnek olarak gidiyorum. Servisimiz docker image olarak DockerHub’ a yüklendi.
Image’iniz aşağıdaki gibi bir sayfaya sahip olacak.
Daha sonra docker üzerinden aşağıdaki komutla çekebilirsiniz.
docker pull hello-world
Tekrar benzer aşamalarla başka bilgisayar/cloud üzerinde de birkaç komutla servisinizi kontrol edebilir ve ayağa kaldırabilirsiniz.
docker image lsdocker run -p 9000:9000 image_name:tag_namedocker container ls