اجرای برنامه 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.py2. درسیستم عامل ویندوز بر روی PowerShell:$env:FLASK_APP = &quothello.py&quot3. در سیستم عامل لینوکس ubuntu:export FLASK_APP=hello.pyپس از معرفی کردن فایل پایتون به flask حالا برنامه باید بدون خطا اجرا بشود:اجرای flask در اوبونتوحال flask در حال اجرا است و آدرس 127.0.0.1:5000 که مخصوص لوکال هاست می باشد به صورت اتومات برای برنامه flask در دسترس قرار گرفته است.با مروگر اینترنت آدرس 127.0.0.1:5000 را باز می کنیم و طبق کدی که در hello.py زدیم باید عبارت hello world برگرداند:برگرداندن عبارت hello world توسط flask به مرورگراجرای 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 است به مرورگر ما ارسال شود.برگرداندن عبارت hello world توسط flask داخل container به مرورگر