چگونه یک اپلیکشن ساده تحت وب را در داکر قرار دهیم؟

در این پست قصد دارم که چگونگی قرار دادن یک اپلیکشن تحت وب که با فلسک نوشته است رو در داکر توضیح بدم. این مطلب برای شروع یادگیری داکر نوشته شده است و مخاطب این مطلب کسانی اند که با مفاهیم داکر آشنا هستند و با محیط دستوری گنو/لینوکس آشنایی دارند. در ابتدا توضیحاتی درباره محیط اجرای اپلیکشن وب فلسک داده خواهد شد و بعد از آن به انتقال و اجرای آن در محیط داکر میپردازم.


فلسک یک فرمورک تحت وب هست که برای زبان برنامه نویسی پایتون ساخته شده است و قاعدتا برای اجرای یک اپلیکشن تحت وب فلسک نیازمند نصب پایتون هستید، بعد از نصب پایتون روی سیستم عامل با استفاده از پکیج منجر پایتون (pip) بایستی فلسک نصب شود.

با توضیحات داده شده مشخص شد که برای اجرای اپلیکشن تحت وب بایستی چه محیط و نیازمندی (dependency) نصب باشد. بسته به توزیع لینوکسی که قرار هست در آن وب اولیکشن اجرا شود دستورات متفاوت خواهد بود. برای مثال برای نصب نیازمندی ها در سیستم عامل های که از پایه دبین (Debian Based) ساخته شده اند مثل اوبونتو باید از دستور زیر استفاده کرد:

sudo apt update && apt install python3
python3 install pip

اما برای کوچکتر و بهینه تر شدن در داکر بهتر هست از Alpine استفاده شود. Alpine یک توزیع لینوکس بسیار کوچیک شده هست که استفاده از اون برای ایجاد یک داکر ایمیج بسیار رایج هست. تفاوتی که استفاده از این توزیع وجود دارد در پکیج منیجر آن هست که apk هست. برای مثال برای نصب نیازمندی های قبلی از دستورات زیر استفاده میشود:

apk update && apk add py-pip
pip install flask 

در نهایت وب اپلیکشنی که قرار هست که اجرا شود با نام hello.py در مسیر اصلی پروژه قرار دارد و به این صورت هست:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def hello_world():
              return render_template('index.html')

if __name__ == '__main__':
              app.run(debug=True,host='0.0.0.0')

در مسیر اصلی پروژه یک پوشه به نام templates قرار دارد که پس از اجرای این کد صفحه ساده ای که در آن قرار دارد به کاربر نمایش داده میشود. برای دسترسی به پروژه از دستورات زیر استفاده کنید:

git clone https://github.com/amirhne/dockerized-hello-world-flask-app.git
cd dockerized-hello-world-flask-app/project

برای اجرای این اپلیکشین در مسیری که فایل hello.py در آن قرار دارد، دستور زیر را بزنید:

python3 hello.py

و بعد از آن پروژه بر روی سیستم شما با پورت ۵۰۰۰ در دسترس خواهد بود و با وارد کردن ادرس http://127.0.0.1:5000 پروژه اجرا خواهد شد.



تا اینجای کار این پروژه بر روی سیستم شما اجرا شده است و در این قسمت قرار هست که این وب اپلیکشین در محیط داکر اجرا شود. اپلیکشین ما قرار هست در داخل یک کانتینر اجرا شود و عمکرد داکر به گونه است که برای اجرای هر کانتینر به یک ایمیج نیازمندیم. هر ایمیج به صورت لایه ای و از یک ایمیج قبلی ساخته میشود و کانترینر که قرار هست اپلیکشین ما را اجرا کند خودش یک پراسس (process) هست که از رو ایمیج ساخت شده است.

برای ساخت یک ایمیج از یک ایمیج قبلی و اضافه کردن نیازمندی هایمان نیازمند که دستور العمل هستیم، دقیقا مانند یه دستور العمل آشپزی که مرحله به مرحله قرار هست یه چیز به مواد خام اضافه شود. به این دستور العمل داکر فایل گفته میشود.

داکر فایلی که قرار هست که ما برای ساخت ایمیج از آن استفاده کنیم به شکل زیر هست:

FROM alpine:latest
MAINTAINER AmirHosein Nematzadeh <me@amirhne.me>
EXPOSE 5000
RUN mkdir /home/hello_world
WORKDIR /home/hello_world/
COPY project /home/hello_world
RUN apk update && apk add py-pip && pip install flask 
CMD python3 /home/hello_world/hello.py

این داکر فایل دستور العمل ساخت ایمیج مورد نظر ماست که به صورت خط به خط آن رو توضیح میدم

۱. در خط اول گفته میشود که از چه ایمیجی پایه ای، ایمج ما ساخته شود

۲.در خط دوم نام و اطلاعات فردی که سازنده ایمیج هست ذکر شده است

۳. در خط سوم گفته شده است که پورت ۵۰۰۰ از بیرون کانترینر در دسترس قرار داشته باشد.

۴. در خط چهارم دستور ساخت یه مسیر داده شده است

۵. در خط پنجم مسیر کار سیستم عامل مشخص شده است

۶. در خط ششم گفته شده است که محتویات پوشه project که در کنار داکر فایل قرار دارد در مسیر پوشه ای که در خط چهارم در داخل ایمیج ساخته شده است، ریخته شود.

۷. در خط هفتم دستورات نصب نیازمندی های ما برای اجرای اپلیکیشن داده شده است.

۸. در آخرین خط گفته میشود که در صورتی که کانترینر از روی ایمیج ساخته شد،‌ در لحظه اجرا این دستورات هم اجرا شود.

برای دسترسی این داکرفایل از گیت هاب و ساخت ایمیج از روی آن از دستورات زیر استفاده کنید:

git clone https://github.com/amirhne/dockerized-hello-world-flask-app.git
cd dockerized-hello-world-flask-app
docker build -t hello_world_flask_app .

همیچنین برای دانلود ایمیج از قبل ساخته شده با داشتن اتصال وی پی ان یا استفاده از شکن از دستور زیر میتونید استفاده کنید:

docker pull amirhne/hello_world_flask_app


حالا همه چیز آماده هست که کانترینر شما از روی این ایمیج ایجاد بشه و از بیرون به اون دسترسی داشته باشید. برای اجرای کانتینر باید از دستور زیر استفاده کنید:

docker run -d -p 80:5000 --name hello_world hello_world_flask_app

در اینجا گفته میشود که کانتیر در پس زمینه (-d) و با نام هلو ورلد (--name) از روی ایمیج hello_world_flask_app ساخته شود و پورت ۵۰۰۰ کانتیرنر ایجاد شده به پورت ۸۰ ماشین (-p)فوروارد شود.


برای اینکه از راه اندازی و اجرای کانتینر اطمینان حاصل کنی از دستور زیر استفاده کنید:

docker ps

خروجی باشد شبیه زیر باشد:

CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                    PORTS                  NAMES
6cdf53855fcf        hello_world_flask_app   &quot/bin/sh -c 'python3…&quot   5 seconds ago       Up 3 seconds              0.0.0.0:80->5000/tcp   hello_world


الان شما بایستی وب اپلیکشن که در داخل کانتینر اجرا شده را روی سیستم با پورت ۸۰ داشته باشید و با زدن http://127.0.0.1 در مرورگر به آن دسترسی داشته باشید.

امیدوارم این مطلب برای شما مفید بوده باشد.