اجرای برنامه flask با استفاده از docker

فلسک (flask) یک میکرو وب فریم ورک سبک و سریع برای زبان برنامه نویسی پایتون (python) است. از flask بیشتر به عنوان یک api service استفاده می شود. از آنجایی که flask یک میکرو وب فریم ورک است بسیاری از قابلیت های نگاشت شی گرایی ، اعتبار سنجی فرم ها و دیگر ویژگی هایی که در فریم ورک های بزرگ تر مانند جنگو یافت می شوند را ندارد اما در عوض امکان توسعه و گسترش آن توسط افزونه های طرف سوم را دارد.

داکر (docker) امکانی را فراهم کرده است که برنامه ها به صورت مجزا در محیطی ایزوله به نام کانتینر (container) راه اندازی شوند. container این امکان را برای توسعه دهندگان فراهم می کند تا یک برنامه را با تمام کتابخانه های وابسته آن به صورت یک پکیج واحد در آورده تا آن را در هر پلتفرم و سیستم عاملی بدون مشکل و به صورت یکسان اجرا شود.

ساخت برنامه flask

یک فایل پایتون (فرمت .py) به نام hello.py می سازیم و کد زیر را در آن وارد می کنیم:

123456from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'
  1. در خط اول ما کلاس Flask را import کردیم.
  2. در خط دوم ما یک instance از این کلاس ساخته ایم. نکته: خط اول و دوم باید در همه برنامه های flask باشه 🙂
  3. با استفاده از دستور route به flask می گوییم که با وارد شدن چه آدرس اینترنتی (URL) ، تابع hello_world اجرا بشود.

اکنون با وارد کردن دستور flask run باید برنامه flask اجرا شود.

خطای نمایش داده شده در ویندوز
خطای نمایش داده شده در ویندوز
خطای نمایش داده شده در اوبونتو
خطای نمایش داده شده در اوبونتو

اوه به خطا خوردیم. نگران نباشید 🙂 قبل از دستور run باید به flask ، فایل پایتون خودمان را معرفی کنیم.

  1. در سیستم عامل ویندوز بر روی CMD:
1set FLASK_APP=hello.py

2. درسیستم عامل ویندوز بر روی PowerShell:

1$env:FLASK_APP = "hello.py"

3. در سیستم عامل لینوکس ubuntu:

1export FLASK_APP=hello.py

پس از معرفی کردن فایل پایتون به flask حالا برنامه باید بدون خطا اجرا بشود:

اجرای flask در اوبونتو
اجرای flask در اوبونتو

حال flask در حال اجرا است و آدرس 127.0.0.1:5000 که مخصوص لوکال هاست می باشد به صورت اتومات برای برنامه flask در دسترس قرار گرفته است.

با مروگر اینترنت آدرس 127.0.0.1:5000 را باز می کنیم و طبق کدی که در hello.py زدیم باید عبارت hello world برگرداند:

برگرداندن عبارت hello world توسط flask به مرورگر
برگرداندن عبارت 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 های پایتون بیشترین استفاده دارد.

  1. تگ latest: این tag آخرین نسخه از image پایتون را بدون هیچ کم و کاستی ارائه می دهد. از جمله مزایای این نسخه پایداری بالای آن است و از بزرگ ترین ایرادات آن حجم بالای این image (در حدود 900 مگابایت) است. از آنجایی که کد پایتون ما فقط به flask احتیاج دارد پس ما نیازی نداریم که از این tag پر حجم استفاده کنیم.
  2. تگ alpine: این tag بر خلاف tag بالا ، بسیار کم حجم تر (کمتر از 100 مگابایت) می باشد. اما این کم حجمی آن باعث شده که پایداری این image کاسته شود و در مواردی کد پایتون به درستی اجرا نمی شود! همچنین ساخت container از این image نیاز به زمان پردازش بالایی دارد. توسعه دهندگان بیشتر توصیه میکنند فقط در کد های پایتون بسیار ساده از این tag استفاده کنید.
  3. تگ slim-buster: این tag دارای حجم متوسط (حدود 170 مگابایت) می باشد اما در عوض پایداری بسیار خوب و سرعت مناسبی دارد. ما از این tag برای container خودمون استفاده می کنیم.

با استفاده از دستور زیر image پایتون نسخه slim-buster را دریافت می کنیم:

1docker pull python:slim-buster

نکته: برای دریافت image ها نیاز به تغییر ip دارین. پیشنهاد من استفاده از شکن برای دور زدن تحریم ها است.

پس از دریافت image می توانید با دستور docker images آن را مشاهده کنید.

اما حتی این image هم نمی تواند برنامه flask ما را اجرا کند! چون نه کتابخانه flask را در خود دارد و نه می داند که برای اجرای flask باید چه دستوری وارد کند. پس ما باید یک image مخصوص برنامه ی flask خودمان بسازیم. برای اینکار از Dockerfile استفاده می کنند.

مستندات Dockerfile را می توانید در سایت داکر مشاهده کنید.

یک فایل Dockerfile می سازیم و کد های زیر را در آن وارد می کنیم:

1234FROM python:slim-buster
RUN pip install flask --upgrade
COPY hello.py .
CMD export FLASK_APP=hello.py && flask run --host 0.0.0.0
  1. در خط اول گفته ایم که از image پایتون نسخه slim-buster استفاده می کنیم.
  2. در خط دوم از pip خواستیم که آخرین نسخه flask را در این image نصب کند. نکته: در پروژه های بزرگ تر بهترین راه این است که ما برنامه پایتون را در یک virtualenv بسازیم و سپس از طریق pip فایل requirements.txt را به Dockerfile بدهیم تا همه پیشنیاز های مورد نیاز را نصب کند.
  3. در خط سوم فایل hello.py را وارد image می کند.
  4. در خط چهارم دستور معرفی کردن فایل hello.py به flask در ترمینال image اجرا می شود. همچنین دستور flask run اجرا می شود با این تفاوت که اینبار ما از flask خواستیم که در آدرس 0.0.0.0 برای ما برنامه را اجرا کند.

حال باید از داکر بخواهیم که یک image اختصاصی با توجه به Dockerfile ما برامون بسازه و اسم این image را flask-app بزاره:

1docker build -t flask-app .

پس از ساخت image می توانید با دستور docker images آن را مشاهده کنید.

حال از داکر می خواهیم که بر اساس image اختصاصی خودمون یک container برای ما بسازه و پورت 5000 container را به سیستم عامل متصل کند.

1docker 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 به مرورگر
برگرداندن عبارت hello world توسط flask داخل container به مرورگر

نویسنده مطلب: Reza Seyed Abdollahi

منبع مطلب

به فکر سرمایه‌گذاری هستی؟

با هر سطحی از دانش در سریع‌ترین زمان با آموزش گام به گام، سرمایه گذاری را تجربه کن. همین الان میتونی با لینک زیر ثبت نام کنی و ۱۰ درصد تخفیف در کارمزد معاملاتی داشته باشی

ثبت نام و دریافت جایزه
ممکن است شما بپسندید
نظر شما درباره این مطلب

آدرس ایمیل شما منتشر نخواهد شد.