Docker Image olarak API servisi oluşturma [python flask]

Talha Tarık Küçük
5bayt
Published in
3 min readMay 20, 2019

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

--

--