اجرای برنامه flask با استفاده از docker
فلسک (flask) یک میکرو وب فریم ورک سبک و سریع برای زبان برنامه نویسی پایتون (python) است. از flask بیشتر به عنوان یک api service استفاده می شود. از آنجایی که flask یک میکرو وب فریم ورک است بسیاری از قابلیت های نگاشت شی گرایی ، اعتبار سنجی فرم ها و دیگر ویژگی هایی که در فریم ورک های بزرگ تر مانند جنگو یافت می شوند را ندارد اما در عوض امکان توسعه و گسترش آن توسط افزونه های طرف سوم را دارد.
داکر (docker) امکانی را فراهم کرده است که برنامه ها به صورت مجزا در محیطی ایزوله به نام کانتینر (container) راه اندازی شوند. container این امکان را برای توسعه دهندگان فراهم می کند تا یک برنامه را با تمام کتابخانه های وابسته آن به صورت یک پکیج واحد در آورده تا آن را در هر پلتفرم و سیستم عاملی بدون مشکل و به صورت یکسان اجرا شود.
ساخت برنامه flask
یک فایل پایتون (فرمت .py) به نام hello.py می سازیم و کد زیر را در آن وارد می کنیم:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
- در خط اول ما کلاس Flask را import کردیم.
- در خط دوم ما یک instance از این کلاس ساخته ایم. نکته: خط اول و دوم باید در همه برنامه های flask باشه :)
- با استفاده از دستور route به flask می گوییم که با وارد شدن چه آدرس اینترنتی (URL) ، تابع hello_world اجرا بشود.
اکنون با وارد کردن دستور flask run باید برنامه flask اجرا شود.
اوه به خطا خوردیم. نگران نباشید :) قبل از دستور run باید به flask ، فایل پایتون خودمان را معرفی کنیم.
- در سیستم عامل ویندوز بر روی CMD:
set FLASK_APP=hello.py
2. درسیستم عامل ویندوز بر روی PowerShell:
$env:FLASK_APP = "hello.py"
3. در سیستم عامل لینوکس ubuntu:
export FLASK_APP=hello.py
پس از معرفی کردن فایل پایتون به flask حالا برنامه باید بدون خطا اجرا بشود:
حال flask در حال اجرا است و آدرس 127.0.0.1:5000 که مخصوص لوکال هاست می باشد به صورت اتومات برای برنامه flask در دسترس قرار گرفته است.
با مروگر اینترنت آدرس 127.0.0.1:5000 را باز می کنیم و طبق کدی که در hello.py زدیم باید عبارت hello world برگرداند:
اجرای flask با استفاده از docker
حال میخواهیم flask را در یک container داکر اجرا کنیم. در ابتدا باید یک container بسازیم. هر container از یک image ساخته می شود. در سایت رسمی داکر هاب می توانید انواع مختلف image ها را ببینید و با استفاده از دستور pull (مانند دستورات git) ، فایل image را در سیستم عامل خود دریافت کنید و با استفاده از آن container خود را بسازید.
از آنجایی که از flask استفاده می کنیم و flask نیز با زبان python نوشته شده است پس ما نیاز به image پایتون داریم. image رسمی پایتون در سایت داکر هاب موجود و شامل نسخه های بسیاری است.
هر نسخه از image python دارای یک tag می باشد. سه tag از image های پایتون بیشترین استفاده دارد.
- تگ latest: این tag آخرین نسخه از image پایتون را بدون هیچ کم و کاستی ارائه می دهد. از جمله مزایای این نسخه پایداری بالای آن است و از بزرگ ترین ایرادات آن حجم بالای این image (در حدود 900 مگابایت) است. از آنجایی که کد پایتون ما فقط به flask احتیاج دارد پس ما نیازی نداریم که از این tag پر حجم استفاده کنیم.
- تگ alpine: این tag بر خلاف tag بالا ، بسیار کم حجم تر (کمتر از 100 مگابایت) می باشد. اما این کم حجمی آن باعث شده که پایداری این image کاسته شود و در مواردی کد پایتون به درستی اجرا نمی شود! همچنین ساخت container از این image نیاز به زمان پردازش بالایی دارد. توسعه دهندگان بیشتر توصیه میکنند فقط در کد های پایتون بسیار ساده از این tag استفاده کنید.
- تگ slim-buster: این tag دارای حجم متوسط (حدود 170 مگابایت) می باشد اما در عوض پایداری بسیار خوب و سرعت مناسبی دارد. ما از این tag برای container خودمون استفاده می کنیم.
با استفاده از دستور زیر image پایتون نسخه slim-buster را دریافت می کنیم:
docker pull python:slim-buster
نکته: برای دریافت image ها نیاز به تغییر ip دارین. پیشنهاد من استفاده از شکن برای دور زدن تحریم ها است.
پس از دریافت image می توانید با دستور docker images آن را مشاهده کنید.
اما حتی این image هم نمی تواند برنامه flask ما را اجرا کند! چون نه کتابخانه flask را در خود دارد و نه می داند که برای اجرای flask باید چه دستوری وارد کند. پس ما باید یک image مخصوص برنامه ی flask خودمان بسازیم. برای اینکار از Dockerfile استفاده می کنند.
مستندات Dockerfile را می توانید در سایت داکر مشاهده کنید.
یک فایل Dockerfile می سازیم و کد های زیر را در آن وارد می کنیم:
FROM python:slim-buster
RUN pip install flask --upgrade
COPY hello.py .
CMD export FLASK_APP=hello.py && flask run --host 0.0.0.0
- در خط اول گفته ایم که از image پایتون نسخه slim-buster استفاده می کنیم.
- در خط دوم از pip خواستیم که آخرین نسخه flask را در این image نصب کند. نکته: در پروژه های بزرگ تر بهترین راه این است که ما برنامه پایتون را در یک virtualenv بسازیم و سپس از طریق pip فایل requirements.txt را به Dockerfile بدهیم تا همه پیشنیاز های مورد نیاز را نصب کند.
- در خط سوم فایل hello.py را وارد image می کند.
- در خط چهارم دستور معرفی کردن فایل hello.py به flask در ترمینال image اجرا می شود. همچنین دستور flask run اجرا می شود با این تفاوت که اینبار ما از flask خواستیم که در آدرس 0.0.0.0 برای ما برنامه را اجرا کند.
حال باید از داکر بخواهیم که یک image اختصاصی با توجه به Dockerfile ما برامون بسازه و اسم این image را flask-app بزاره:
docker build -t flask-app .
پس از ساخت image می توانید با دستور docker images آن را مشاهده کنید.
حال از داکر می خواهیم که بر اساس image اختصاصی خودمون یک container برای ما بسازه و پورت 5000 container را به سیستم عامل متصل کند.
docker run -p 5000:5000 -d flask-app
پس از ساخت container می توانید با دستور docker container ls آن را مشاهده کنید.
با مروگر اینترنت آدرس 127.0.0.1:5000 را باز می کنیم. این آدرس به container در آدرس 0.0.0.0:5000 متصل است و باعث می شود عبارت hello world از flask که در درون container است به مرورگر ما ارسال شود.
مطلبی دیگر از این انتشارات
شی گرایی به زبان ساده ( Part 1 )
مطلبی دیگر از این انتشارات
?چرا باید برنامه نویسی یاد بگیریم؟
مطلبی دیگر از این انتشارات
ماشین لرنینگ #2 : پیش بینی نژاد سگ