از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
داکر کردن برنامه های پایتون
سرفصلهای مطلب
معرفی
داکر یک ابزار به طور گسترده پذیرفته شده و مورد استفاده شرکت های پیشرو فناوری اطلاعات برای ساخت، مدیریت و ایمن سازی برنامه های خود است.
کانتینرها مانند Docker به توسعه دهندگان اجازه می دهند چندین برنامه را ایزوله کرده و اجرا کنند روی یک سیستم عامل واحد، به جای اختصاص یک ماشین مجازی برای هر برنامه روی سرور. استفاده از این ظروف سبک تر منجر به هزینه های کمتر، استفاده بهتر از منابع و عملکرد بالاتر می شود.
اگر به خواندن بیشتر علاقه دارید، باید نگاهی به Docker: A High Level Introduction بیندازید.
در این مقاله، ما یک برنامه وب ساده پایتون را با استفاده از Flask می نویسیم و آن را برای “dockerizing” آماده می کنیم و سپس یک برنامه ایجاد می کنیم. تصویر داکر، و استقرار آن در محیط آزمایش و تولید.
توجه داشته باشید: این آموزش فرض می کند که Docker را در دستگاه خود نصب کرده اید. اگر نه، می توانید رسمی را دنبال کنید راهنمای نصب داکر.
داکر چیست؟
Docker ابزاری است که به توسعهدهندگان امکان میدهد برنامههای خود را (همراه با کتابخانهها و سایر وابستگیها) ارسال کنند و اطمینان حاصل کند که بدون توجه به محیطی که در آن مستقر هستند، میتوانند دقیقاً با همان پیکربندی اجرا شوند.
این کار با جداسازی برنامهها در کانتینرهای جداگانه انجام میشود، که اگرچه توسط کانتینرها از هم جدا شدهاند، اما سیستم عامل و کتابخانههای کافی را به اشتراک میگذارند.
Docker را می توان به موارد زیر تقسیم کرد:
- موتور داکر – یک ابزار بسته بندی نرم افزاری که برای کانتینری کردن برنامه ها استفاده می شود.
- داکر هاب – ابزاری برای مدیریت شما container برنامه های کاربردی در فضای ابری
چرا کانتینر؟
درک اهمیت و مفید بودن ظروف بسیار مهم است. اگرچه ممکن است با یک برنامه کاربردی واحد یا در پروژه های خانگی تفاوت چندانی ایجاد نکنند، اما کانتینرها می توانند در مورد برنامه های کاربردی قوی و با منابع سنگین، نجات دهنده باشند، به خصوص اگر سرور یکسانی را به اشتراک بگذارند، یا در بسیاری از محیط های مختلف مستقر هستند.
این ابتدا با ماشین های مجازی حل شد VMWare و هایپروایزرها، اگرچه ثابت کرده اند که از نظر کارایی، سرعت و قابلیت حمل بهینه نیستند.
کانتینرهای داکر جایگزینهای سبکی برای ماشینهای مجازی هستند – برخلاف ماشینهای مجازی، ما نیازی به تخصیص RAM، CPU یا منابع دیگر برای آنها نداریم و از زمانی که در حال کار با آن هستیم، نیازی به راهاندازی یک VM جدید برای هر برنامه نداریم. فقط یک سیستم عامل
توسعه دهندگان نیازی ندارند که خود را با ارسال نسخه های ویژه نرم افزار برای محیط های مختلف بار کنند و می توانند تمرکز کنند روی ایجاد منطق اصلی کسب و کار در پشت برنامه
راه اندازی پروژه
فلاسک یک میکرو فریمورک پایتون است که برای ایجاد برنامه های کاربردی وب ساده و پیشرفته استفاده می شود. با توجه به سهولت استفاده و راه اندازی آن، ما از آن برای برنامه آزمایشی خود استفاده خواهیم کرد.
اگر فلاسک را قبلاً نصب نکردهاید، انجام این کار با یک دستور ساده است:
$ pip install flask
پس از نصب Flask، یک پوشه پروژه با نام ایجاد کنید FlaskApp
برای مثال در این پوشه، یک فایل پایه با نام چیزی شبیه به آن ایجاد کنید app.py
.
در داخل app.py
import را Flask
ماژول و با استفاده از موارد زیر یک برنامه وب ایجاد کنید:
from flask import Flask
app = Flask(__name__)`
بعد، اجازه دهید مسیر اصلی را تعریف کنیم /
و کنترل کننده درخواست مربوطه:
@app.route("/")
def index():
return """
<h1>Python Flask in Docker!</h1>
<p>A sample web-app for running Flask inside Docker.</p>
"""
در نهایت، اگر اسکریپت به عنوان برنامه اصلی فراخوانی می شود، برنامه را راه اندازی می کنیم:
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')
$ python3 app.py
مرورگر خود را به http://localhost:5000/
. باید با پیام “Dockerizing Python using Flask” از شما خواسته شود!
داکر کردن برنامه
برای اجرای یک برنامه با داکر، باید a را بسازیم container با تمام وابستگی های استفاده شده در آن – که در مورد ما فقط Flask است. برای انجام این کار، یک را اضافه می کنیم requirements.txt
فایل حاوی وابستگی های مورد نیاز و ایجاد یک Dockerfile که متکی است روی فایل برای ساخت تصویر
همچنین، هنگامی که ما راه اندازی می کنیم container، باید به پورت های HTTP دسترسی داشته باشیم روی که برنامه در حال اجراست
آماده سازی اپلیکیشن
از جمله وابستگی ها در requirements.txt
فایل بسیار آسان است ما فقط باید نام و نسخه وابستگی را وارد کنیم:
Flask==1.0.2
در مرحله بعد، ما باید مطمئن شویم که تمام فایل های پایتون لازم برای اجرای برنامه ما در داخل یک پوشه سطح بالا قرار دارند، به عنوان مثال، به نام app
.
همچنین توصیه می شود که نقطه ورودی اصلی نامگذاری شود app.py
به عنوان تمرین خوبی است که شی Flask ایجاد شده در اسکریپت را به عنوان نامگذاری کنید app
تا استقرار آسان تر شود.
docker-flask-tutorial
├── requirements.txt
├── Dockerfile
└── app
└── app.py
└── <other .py files>
ایجاد یک Dockerfile
آ Dockerfile اساساً یک فایل متنی با دستورالعمل های کاملاً مشخص است روی چگونه یک تصویر داکر برای پروژه خود بسازیم.
در مرحله بعد یک تصویر Docker ایجاد می کنیم روی اوبونتو 16.04 و پایتون 3.X:
FROM ubuntu:16.04
MAINTAINER Madhuri Koushik "(email protected)"
RUN apt-get update -y && \
apt-get install -y python3-pip python3-dev
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip3 install -r requirements.txt
COPY . /
ENTRYPOINT ( "python3" )
CMD ( "app/app.py" )
در اینجا چند دستور وجود دارد که شایسته توضیح مناسب است:
- از جانب – هر Dockerfile با یک شروع می شود
FROM
کلمه کلیدی. برای تعیین تصویر پایه ای که تصویر از آن ساخته شده است استفاده می شود. خط زیر متادیتا را در مورد نگهدارنده تصویر ارائه می دهد. - اجرا کن – می توانیم با اجرای وظایف نصب و ذخیره نتایج این دستورات، محتوای اضافی به تصویر اضافه کنیم. در اینجا، ما به سادگی اطلاعات بسته را به روز می کنیم، نصب می کنیم
python3
وpip
. ما استفاده می کنیمpip
در دومRUN
دستور نصب تمام بسته ها درrequirements.txt
فایل. - کپی 🀄 –
COPY
دستور برای کپی کردن فایل ها/دایرکتوری ها از host ماشین به container در طول ساخت process. در این مورد، ما در حال کپی کردن فایل های برنامه از جملهrequirements.txt
. - WORKDIR – دایرکتوری کاری را در container که توسط RUN، COPY و غیره استفاده می شود.
- نقطه ورود – نقطه ورود برنامه را مشخص می کند
- CMD – اجرا می کند
app.py
فایل درapp
فهرست راهنما.
روش ساخت تصاویر داکر
تصاویر داکر با استفاده از docker build
فرمان هنگام ساخت یک تصویر، داکر به اصطلاح “لایه” ایجاد می کند. هر لایه تغییرات حاصل از یک دستور را در Dockerfile و وضعیت تصویر را پس از اجرای دستور ثبت می کند.
داکر این لایهها را به صورت داخلی ذخیره میکند تا در هنگام ساخت مجدد تصاویر، تنها لایههایی را که تغییر کردهاند، دوباره ایجاد کند. به عنوان مثال، هنگامی که تصویر پایه را برای بارگذاری می کند ubuntu:16.04
، تمام ساخت های بعدی یکسان هستند container می توانید دوباره از آن استفاده کنید زیرا این تغییر نمی کند. با این حال، در طول هر بازسازی، محتویات دایرکتوری برنامه به احتمال زیاد متفاوت خواهد بود و بنابراین این لایه هر بار بازسازی می شود.
هر زمان که لایهای دوباره ساخته شود، تمام لایههایی که به دنبال آن در Dockerfile هستند نیز باید بازسازی شوند. مهم است که این واقعیت را در هنگام ایجاد Dockerfiles در نظر داشته باشید. مثلا ما COPY
را requirements.txt
ابتدا فایل و وابستگی ها را نصب کنید COPY
بقیه برنامه را اجرا کنید این منجر به یک لایه Docker می شود که شامل تمام وابستگی ها می شود. این لایه نیازی به بازسازی ندارد حتی اگر فایل های دیگر در برنامه تغییر کنند تا زمانی که وابستگی جدیدی وجود نداشته باشد.
بنابراین ما ساخت را بهینه می کنیم process برای ما container با جدا کردن pip install
از استقرار بقیه برنامه ما.
ساختن تصویر داکر
اکنون که Dockerfile ما آماده است و روش ساخت را درک می کنیم process کار می کند، بیایید جلو برویم و تصویر Docker را برای برنامه خود ایجاد کنیم:
$ docker build -t docker-flask:latest .
اجرای برنامه در حالت Debug با راه اندازی مجدد خودکار
با توجه به مزایای کانتینریسازی که قبلاً توضیح داده شد، توسعه برنامههایی که در کانتینرهایی در container خود این تضمین می کند که از ابتدا، محیطی که برنامه در آن ساخته شده است تمیز است و در نتیجه غافلگیری در هنگام تحویل را از بین می برد.
با این حال، در حین توسعه یک برنامه، داشتن چرخه های بازسازی و آزمایش سریع برای بررسی هر مرحله میانی در طول توسعه مهم است. برای این منظور، توسعه دهندگان وب برنامه وابسته هستند روی امکانات راه اندازی مجدد خودکار توسط فریمورک هایی مانند Flask ارائه شده است. امکان استفاده از این امر از درون وجود دارد container همچنین.
برای فعال کردن راه اندازی مجدد خودکار، Docker را راه اندازی می کنیم container نگاشت دایرکتوری توسعه ما به دایرکتوری برنامه در داخل container. این به این معنی است که Flask فایلهای موجود را تماشا میکند host (از طریق این نقشه برداری) برای هر گونه تغییر و راه اندازی مجدد برنامه به طور خودکار زمانی که آن را تشخیص هر گونه تغییر.
علاوه بر این، ما همچنین باید پورت های برنامه را از طریق فوروارد کنیم container به host. این برای فعال کردن مرورگر در حال اجرا است روی را host برای دسترسی به برنامه
برای رسیدن به این هدف، Docker را راه اندازی می کنیم container با حجم نگاشت و پورت حمل و نقل گزینه ها:
$ docker run --name flaskapp -v$PWD/app:/app -p5000:5000 docker-flask:latest
این کار زیر را انجام می دهد:
- شروع می کند a container مستقر روی را
docker-flask
تصویری که قبلا ساختیم - این containerنام تنظیم شده است
flaskapp
. بدون--name
گزینه، داکر یک نام دلخواه (و بسیار جالب) برای آن انتخاب می کند container. مشخص کردن نام به صراحت به ما در یافتن مکان کمک می کند container (برای توقف و غیره،.) - این
-v
گزینه پوشه برنامه را مانت می کند روی را host به container. - این
-p
گزینه پورت را نقشه میکشد روی را container به host.
اکنون برنامه قابل دسترسی است http://localhost:5000
یا http://0.0.0.0:5000/
:
اگر تغییراتی را در برنامه زمانی که container در حال اجرا است و فایل را ذخیره می کند، Flask تغییرات را شناسایی کرده و برنامه را مجددا راه اندازی می کند:
برای متوقف کردن container، مطبوعات Ctrl–سی و حذف کنید container با دویدن docker rm flaskapp
.
اجرای برنامه در حالت تولید
در حالی که اجرای مستقیم برنامه با Flask برای توسعه به اندازه کافی خوب است، ما باید از روش استقرار قوی تری برای تولید استفاده کنیم.
به طور معمول، یک برنامه وب Flask در حال تولید ممکن است نیاز به چندین اتصال موازی داشته باشد و بنابراین معمولاً روی یک وب سرور سازگار با WSGI مستقر می شود.
یک جایگزین محبوب Nginx + uWSGI است و در این بخش روش راه اندازی وب برنامه خود را برای تولید خواهیم دید. Nginx یک وب سرور منبع باز است و uWSGI یک برنامه کاربردی سریع و خوددرمان شونده است container سرور”.
ابتدا یک نما ایجاد می کنیم که برنامه ما را در حالت توسعه یا تولید و بسته به آن شروع می کند روی حالتی که برای اجرای مستقیم nginx یا Python انتخاب می کند.
ما این فایل را فراخوانی می کنیم launch.sh
و یک اسکریپت ساده پوسته خواهد بود. این فایل مبتنی است روی نقطه ورود.ش:
#!/bin/bash
if ( ! -f /debug0 ); then
touch /debug0
while getopts 'hd:' flag; do
case "${flag}" in
h)
echo "options:"
echo "-h show brief help"
echo "-d debug mode, no nginx or uwsgi, direct start with 'python3 app/app.py'"
exit 0
;;
d)
touch /debug1
;;
*)
break
;;
esac
done
fi
if ( -e /debug1 ); then
echo "Running app in debug mode!"
python3 app/app.py
else
echo "Running app in production mode!"
nginx && uwsgi --ini /app.ini
fi
بعد، ما یک را ایجاد می کنیم فایل پیکربندی uWSGI برای برنامه ما و یک پیکربندی nginx.
اساساً، این فایل نقطه ورود برنامه ما به uWSGI/nginx را توصیف می کند:
(uwsgi)
plugins = /usr/lib/uwsgi/plugins/python3
chdir = /app
module = app:app
uid = nginx
gid = nginx
socket = /run/uwsgiApp.sock
pidfile = /run/.pid
processes = 4
threads = 2
در نهایت، Dockerfile خود را طوری تغییر می دهیم که شامل nginx و uWSGI باشد. علاوه بر نصب nginx، uWSGI، و افزونه uWSGI Python3، اکنون این افزونه را نیز کپی می کند. nginx.conf
به مکان مناسب و تنظیم مجوزهای کاربر مورد نیاز برای اجرای nginx.
همچنین Dockerfile ENTRYPOINT
روی پوسته اسکریپت تنظیم شده است که به ما در اجرای آن کمک می کند container در حالت اشکال زدایی یا تولید:
FROM ubuntu:16.04
MAINTAINER Madhuri Koushik "(email protected)"
RUN apt-get update -y && \
apt-get install -y python3-pip python3-dev && \
apt-get install -y nginx uwsgi uwsgi-plugin-python3
COPY ./requirements.txt /requirements.txt
COPY ./nginx.conf /etc/nginx/nginx.conf
WORKDIR /
RUN pip3 install -r requirements.txt
COPY . /
RUN adduser --disabled-password --gecos '' nginx\
&& chown -R nginx:nginx /app \
&& chmod 777 /run/ -R \
&& chmod 777 /root/ -R
ENTRYPOINT ( "/bin/bash", "/launcher.sh")
اکنون میتوانیم تصویر را بازسازی کنیم:
$ docker build -t docker-flask:latest .
و برنامه را با استفاده از nginx اجرا کنید:
$ docker run -d --name flaskapp --restart=always -p 80:80 docker-flask:latest
این تصویر مستقل است و فقط نیاز به نگاشت پورت دارد تا در حین استقرار مشخص شود. این دستور را در پس زمینه شروع کرده و اجرا می کند. برای متوقف کردن و حذف این container، دستور زیر را اجرا کنید:
$ docker stop flaskapp && docker rm flaskapp
همچنین، اگر نیاز به اشکال زدایی یا اضافه کردن ویژگی ها داشته باشیم، می توانیم به راحتی آن را اجرا کنیم container در حالت اشکال زدایی که نسخه خودمان از درخت منبع را نصب می کنیم:
$ docker run -it --name flaskapp -p 5000:5000 -v$PWD/app:/app docker-flask:latest -d
مدیریت وابستگی های خارجی
هنگام ارسال برنامه ها به عنوان کانتینر، یک مورد کلیدی که باید به خاطر بسپارید این است که مسئولیت های توسعه دهنده در قبال مدیریت وابستگی ها افزایش می یابد. علاوه بر شناسایی و تعیین وابستگی ها و نسخه های مناسب، مسئولیت نصب و راه اندازی این وابستگی ها را نیز بر عهده دارند. container محیط.
خوشبختانه، requirements.txt
مکانیزمی آسان برای تعیین وابستگی ها است. هر بسته ای که از طریق pip
می توان به آن اضافه کرد.
اما دوباره، در هر زمان requirements.txt
فایل اصلاح شده است، تصویر داکر نیاز به بازسازی دارد.
نصب Dependencies در راه اندازی
گاهی اوقات، ممکن است نیاز به نصب وابستگی های اضافی در زمان راه اندازی باشد. بگویید، شما در حین توسعه یک بسته جدید را امتحان می کنید و نمی خواهید هر بار تصویر Docker را دوباره بسازید یا می خواهید از آخرین نسخه موجود در زمان راه اندازی استفاده کنید. دستیابی به این هدف با تغییر لانچر برای اجرا امکان پذیر است pip
در شروع راه اندازی برنامه
همچنین میتوانیم بستههای وابستگی اضافی در سطح سیستمعامل را نیز نصب کنیم. بیایید اصلاح کنیم launcher.sh
:
#!/bin/bash
if ( ! -f /debug0 ); then
touch /debug0
if ( -e requirements_os.txt ); then
apt-get install -y $(cat requirements_os.txt)
fi
if ( -e requirements.txt ); then
pip3 install -r requirements.txt
fi
while getopts 'hd' flag; do
case "${flag}" in
h)
echo "options:"
echo "-h show brief help"
echo "-d debug mode, no nginx or uwsgi, direct start with 'python3 app/app.py'"
exit 0
;;
d)
echo "Debug!"
touch /debug1
;;
esac
done
fi
if ( -e /debug1 ); then
echo "Running app in debug mode!"
python3 app/app.py
else
echo "Running app in production mode!"
nginx && uwsgi --ini /app.ini
fi
در حال حاضر، در requirements_os.txt
، می توانیم لیستی از نام بسته های جدا شده با فاصله را به صورت یک خطی و اینها به همراه بسته های موجود در requirements.txt
قبل از راه اندازی برنامه نصب خواهد شد.
اگرچه این به عنوان یک راحتی در طول توسعه ارائه می شود، نصب وابستگی ها در زمان راه اندازی به چند دلیل عمل خوبی نیست:
- یکی از اهداف کانتینریسازی که رفع و آزمایش در برابر وابستگیهایی است که به دلیل تغییر محیط استقرار تغییر نمیکنند، شکست میخورد.
- سربار اضافی در شروع برنامه اضافه می کند که زمان راه اندازی را برای برنامه افزایش می دهد container.
- کشیدن وابستگی ها هر بار که برنامه شروع می شود استفاده ضعیف از منابع شبکه است.
نتیجه
در این مقاله، ما به Docker، یک ابزار کانتینریسازی پرکاربرد، پرداختیم. ما یک برنامه وب ساده با Flask ایجاد کردیم، یک تصویر سفارشی Docker روی اوبونتو برای اجرای برنامه وب ما در حالت توسعه و تولید.
در نهایت، ما استقرار برنامه وب خود را با استفاده از nginx و uWSGI در داکر تنظیم کردیم. container و روش های نصب وابستگی های خارجی را بررسی کرد.
Containerization یک فناوری قدرتمند است که توسعه و استقرار سریع برنامه ها را در فضای ابری امکان پذیر می کند و ما امیدواریم که بتوانید آنچه را که در اینجا آموخته اید در برنامه های خود اعمال کنید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-25 06:23:04