در پست قبلی در مورد معماری و نحوه نصب داکر صحبت کردیم.در این قسمت با نحوه کار و استفاده آن آشنا میشویم.
برای ساختن یک ایمیج، از فایل Dockerfile استفاده میکنید. این فایل شامل دستورات مورد نیاز برای ساخت ایمیج است. برای مثال، شما در این فایل میتوانید مشخص کنید که ابتدا سیستمعاملی (مثلاً Ubuntu) نصب شود، سپس وابستگیهای اپلیکیشن نصب شوند و در نهایت خود اپلیکیشن راهاندازی شود.
یک فایل متنی به نام Dockerfile ایجاد میکنید و دستورات ساخت ایمیج را در آن مینویسید. برای مثال:
FROM python:3.8-slim
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
دستور FROM:
اولین دستوری است که در هر Dockerfile استفاده میشود و مشخص میکند که ساخت ایمیج شما از چه پایهای شروع شود. این پایه میتواند یک سیستمعامل، یک زبان برنامهنویسی، یا حتی یک ایمیج سفارشی باشد.
FROM ubuntu:20.04
این دستور از نسخه ۲۰.۰۴ سیستمعامل Ubuntu به عنوان ایمیج پایه استفاده میکند.
FROM node:14
ایمیجی که از Node.js نسخه ۱۴ استفاده میکند.
FROM python:3.10-alpine
ایمیجی از پایتون نسخه ۳.۱۰ که بر پایهی سیستمعامل سبک Alpine ساخته شده است. ایمیجهای Alpine کمحجمتر هستند.
دستور COPY :
دستوری است که برای کپی کردن فایلها و دایرکتوریها از سیستم اصلی به داخل ایمیج و کانتینر استفاده میشود.
COPY . /app
تمام فایلها و دایرکتوریهای پروژه را از محل فعلی (نقطه .
) به داخل دایرکتوری /app
در کانتینر کپی میکند.
COPY myfile.txt / app/myfile.txt
در اینجا فقط یک فایل خاص به مسیر در داخل ایمیج کپی میشود.
COPY ./src /app/src
تمام محتوای دایرکتوری src
را به دایرکتوری /app/src
در داخل ایمیج کپی میکند.
دستور WORKDIR:
این دستور دایرکتوری کاری داخل ایمیج را تنظیم میکند. تمام دستورات بعدی در این دایرکتوری اجرا میشوند. این کار برای جلوگیری از نیاز به استفاده از مسیرهای مطلق مفید است.
WORKDIR /app
دایرکتوری کاری به /app
تغییر داده میشود. این به این معناست که هر دستور بعدی که اجرا شود، در مسیر /app
اتفاق میافتد.
دستور RUN
این دستور دستورات را در طول ساخت ایمیج اجرا میکند. این دستورات معمولاً برای نصب بستهها، بهروزرسانی سیستم، یا انجام تنظیمات استفاده میشود.
RUN apt-get update && apt-get install -y python3-pip
این دستور ابتدا سیستمعامل را بهروزرسانی کرده و سپس بستهی python3-pip
را نصب میکند.
RUN npm install
اگر از Node.js استفاده میکنید، این دستور تمامی بستههای مشخص شده در فایل package.json
را نصب میکند.
RUN pip install -r requirements.txt
این دستور نیازمندی ها را از فایل ذکر شده نصب میکند.
دستور CMD:
این دستور زمانی که کانتینر شروع به کار میکند، اجرا میشود. این دستور مشخص میکند که چه برنامهای به صورت پیشفرض در کانتینر اجرا شود.
CMD ["python", "app.py"]
این دستور زمانی که کانتینر اجرا میشود، اپلیکیشن app.py
را با پایتون اجرا میکند.
CMD ["node", "server.js"]
در اینجا، کانتینر در زمان اجرا فایل server.js
را با Node.js اجرا میکند.
یک نکته ای وجود دارد که فقط یک CMD
در Dockerfile میتواند وجود داشته باشد. اگر چندین CMD
تعریف کنید، فقط آخرین آنها اجرا خواهد شد.
دستور ENTRYPOINT:
به شما اجازه میدهد یک برنامه اصلی را برای اجرای کانتینر تعیین کنید که در هر صورت باید اجرا شود، حتی اگر آرگومانهایی به کانتینر ارسال شود.CMD
و ENTRYPOINT
شباهتهایی دارند، اما تفاوت این است که CMD
به راحتی با آرگومانهای جدید تغییر میکند، در حالی که ENTRYPOINT
به عنوان بخش جدانشدنی از اجرای کانتینر در نظر گرفته میشود.
ENTRYPOINT ["python", "app.py"]
در اینجا، کانتینر همیشه app.py
را با پایتون اجرا میکند، حتی اگر آرگومانهای دیگری به کانتینر داده شود.
دستور EXPOSE:
به Docker میگوید که کانتینر قرار است روی یک پورت خاص ارتباط برقرار کند. این دستور خودش به تنهایی پورت را باز نمیکند، اما به عنوان یک مستندسازی داخلی عمل میکند تا بگوید این پورت باید استفاده شود. در واقع به عنوان یک مستندات برای توسعهدهندگان و کاربران دیگر عمل میکند.
EXPOSE 5000
این دستور پورت ۵۰۰۰ را برای ارتباطات اپلیکیشن داخل کانتینر مستند میکند.
به خودی خود پورتها را باز نمیکند. برای دسترسی به پورتهای مشخص شده، باید هنگام اجرای کانتینر از گزینه -p
یا --publish
استفاده کنید.
EXPOSE 80
پورت 80 را برای ارتباط با کانتینر مستند میکند.
بعد از ساخت فایل داکرفایل ابتدا یک ایمیج ساخته میشود:
docker build -t image-1 .
و بعد پورت ۸۰ داخل کانتینر را به پورت ۸۰۸ روی میزبان متصل میکند:
docker run -p 8080:80 image-1
با دستور بالا ایمیج ساخته شده را اجرا میکنیم.
برای مشاهده ایمیجهای داکر و کانتینرهای در حال اجرا، میتوانید از دستورات زیر استفاده کنید:
مشاهده لیست ایمیجهای داکر:
docker images
مشاهده لیست کانتینرهای در حال اجرا:
docker ps
مشاهده لاگهای یک کانتینر:
docker logs <container_id>