داکر پلتفرمی برای ساخت و اجرای برنامهها در کانتاینرها است. کانتاینرها واحدهای نرم افزاری سبک، قابل حمل و مستقلی هستند که می توانند به طور قابل اعتماد و پیوسته در محیط های مختلف اجرا شوند. Docker راهی برای بسته بندی یک برنامه کاربردی و وابستگی های آن در یک کانتاینر فراهم می کند که به راحتی قابل استقرار و مدیریت است.
با Docker، توسعهدهندگان میتوانند برنامههای کاربردی را به صورت محلی روی ماشین توسعه خود بسازند و آزمایش کنند، و سپس آنها را در کانتاینرهایی بسته بندی کنند که میتوانند در هر محیط تولیدی مستقر شوند. این امر جابجایی برنامه ها را بین محیط های توسعه، آزمایش و تولید آسان می کند، بدون نگرانی در مورد مسائل سازگاری یا تفاوت در زیرساخت های اساسی.
برخی از مزایای استفاده از Docker عبارتند از:
به طور کلی، Docker یک ابزار قدرتمند برای ساخت و استقرار برنامهها به روشی سازگار، کارآمد و قابل حمل است.
ماشینهای مجازی و داکر دو فناوری هستند که برای ایجاد محیطهای ایزوله برای اجرای برنامهها استفاده میشوند، اما از چند جهت با هم تفاوت دارند:
1- استفاده از منابع: ماشین های مجازی نیاز به یک سیستم عامل کامل دارند که می تواند منابع بسیاری را استفاده کنند . از سوی دیگر، کانتاینرهای Docker، هسته سیستم عامل میزبان را به اشتراک می گذارند، که در نتیجه مصرف منابع کمتر و زمان راه اندازی سریعتر است.
2- ایزوله: ماشین های مجازی ایزوله کامل بین سیستم عامل مهمان و سیستم عامل میزبان را فراهم می کنند، در حالی که کانتاینرهای داکر ایزوله سبک تری را بین کانتاینر و سیستم میزبان ایجاد می کنند.
3- قابلیت حمل: ماشین های مجازی را می توان بین هایپروایزر یا ارائه دهندگان ابری مختلف جابجا کرد، اما این می تواند پیچیده و زمان بر باشد. کانتاینرهای Docker بسیار قابل حمل هستند و به راحتی بین هاست ها، ابرها یا سیستم عامل های مختلف جابه جا می شوند.
4- استقرار: ماشین های مجازی معمولاً به صورت واحدهای مستقل با سیستم عامل و برنامه های کاربردی خاص خود مستقر می شوند. کانتاینرهای Docker از ایمیج ها ساخته میشوند که میتوان آنها را به اشتراک گذاشت و نسخهسازی کرد، که باعث انعطافپذیری بیشتر و مدیریت آسانتر آنها میشود.
5- تعمیر و نگهداری: ماشین های مجازی نسبت به کانتاینرهای Docker نیاز به تعمیر و نگهداری بیشتری دارند، زیرا مانند هر سیستم عامل دیگری نیاز به روز رسانی و مدیریت دارند. کانتاینرهای Docker را می توان به راحتی بدون نیاز به به روز رسانی کل سیستم عامل با نسخه های جدیدتر به روز کرد یا جایگزین کرد.
به طور کلی، تفاوت اصلی بین ماشینهای مجازی و داکر این است که ماشینهای مجازی ایزوله کامل را ارائه میکنند و به منابع بیشتری نیاز دارند، در حالی که داکر ایزوله سبکتر را ارائه میکند و به منابع کمتری نیاز دارد. Docker همچنین قابلیت حمل بیشتر و مدیریت آسانتری را ارائه میدهد و آن را به یک انتخاب محبوب برای توسعه و استقرار برنامههای کاربردی مدرن تبدیل میکند
یک ایمیج یک بسته سبک، مستقل و قابل اجرا است که شامل همه چیزهایی است که برای اجرای یک برنامه نیاز است، مانند کد، وابستگی ها و پیکربندی. آن را به عنوان یک ایمیج فوری از محیط یک برنامه در یک زمان خاص در نظر بگیرید. ایمیج Docker از یک Dockerfile ساخته میشوند که حاوی دستورالعملهایی برای نحوه ساخت ایمیج است.
یک کانتاینر یک نمونه زمان اجرا از یک ایمیج است که از سیستم میزبان و سایر کانتاینرهای روی همان سیستم جدا شده است. هر کانتاینر سیستم فایل، شبکه و فضای پردازش مخصوص به خود را دارد که اجرای چندین برنامه را به صورت مجزا در یک میزبان ممکن می سازد. کانتاینرها با استفاده از دستور docker run از ایمیج شروع می شوند و می توان آنها را با استفاده از Docker CLI یا API مدیریت و نظارت کرد.
داکرفایل یک اسکریپت است که شامل مجموعه ای از دستورالعمل ها برای ساختن یک ایمیج Docker است. در اینجا دلایلی وجود دارد که چرا باید از Dockerfile استفاده کنید:
تکرارپذیری: با استفاده از Dockerfile، می توانید محیط دقیقی را که برنامه شما برای اجرا نیاز دارد، تعریف کنید. این کار بازتولید محیط یکسان را در ماشینها و پلتفرمهای مختلف آسان میکند، که میتواند به کاهش باگها و اطمینان از ثبات کمک کند.
کنترل نسخه: Dockerfiles را می توان در سیستم های کنترل نسخه مانند Git ذخیره کرد، که به شما امکان می دهد تغییرات محیط را ردیابی کنید و در صورت لزوم به نسخه های قبلی برگردید.
اتوماسیون: Dockerfiles را می توان با استفاده از ابزارهای Continuous Integration و Continuous Deployment (CI/CD) مانند Jenkins یا Travis CI خودکار کرد. این امر ساخت، آزمایش و استقرار تصاویر Docker را به روشی قابل تکرار و مقیاس پذیر آسان می کند.
ماژولاریت: Dockerfiles به شما این امکان را می دهد که برنامه خود را به اجزای کوچکتر و قابل استفاده مجدد تقسیم کنید، که می توان آنها را به اشتراک گذاشت و با سایر تصاویر Docker ترکیب کرد تا برنامه های پیچیده تر ایجاد کند.
امنیت: Dockerfiles شما را قادر میسازد تا نرمافزار و وابستگیهای خاصی را که برنامه شما به آن نیاز دارد تعریف و جدا کنید، سطح حمله را کاهش داده و امنیت را بهبود میبخشد.
دستورات زیادی در Dockerfile وجود دارد که می توان از آنها برای ساخت یک ایمیج Docker استفاده کرد. در اینجا برخی از متداول ترین دستورات مورد استفاده آورده شده است:
FROM: ایمیج پایه ای را که برای ساخت ایمیج جدید استفاده می شود را مشخص می کند.
RUN: دستوری را در داخل کانتینر در طول فرآیند ساخت اجرا می کند. به عنوان مثال، نصب وابستگی ها یا به روز رسانی سیستم.
COPY: فایل ها را از دستگاه میزبان در کانتینر کپی می کند.
ADD: فایلها را از دستگاه میزبان در ایمیج کپی میکند و همچنین میتواند فایلهای tar را استخراج کند یا فایلها را از یک URL دانلود کند.
ENV: متغیرهای محیطی را در داخل ایمیج تنظیم می کند.
WORKDIR: دایرکتوری کاری داخل کانتاینر را مشخص می کند.
CMD: دستوری را مشخص می کند که هنگام راه اندازی کانتاینر اجرا شود. وقتی کانتاینر اجرا می شود، این می تواند لغو شود.
ENTRYPOINT: دستوری را مشخص میکند که در هنگام راهاندازی کانتاینر اجرا شود و وقتی کانتینر اجرا میشود نمیتوان آن را لغو کرد.
EXPOSE: یک پورت داخل کانتینر را آشکار می کند.
VOLUME: یک نقطه اتصال برای یک دایرکتوری یا یک فایل در داخل ایمیج ایجاد می کند.
اینها تنها تعدادی از دستورات موجود در Dockerfile هستند. برای فهرست کامل، لطفاً به مستندات Docker مراجعه کنید.
توضیح کافی است. بیایید به صورت عملی توضیح دهیم.
در اینجا مثالی از نحوه اتصال یک پروژه ساده FastAPI آورده شده است:
cd ~/Desktop
mkdir simplefastapi && cd simplefastapi
touch Dockerfile requirements.txt main.py
دستور cd ~/Desktop دایرکتوری فعلی را به دایرکتوری دسکتاپ تغییر میدهد.
دستور mkdir simplefastapi && cd simplefastapi یک دایرکتوری جدید به نام simplefastapi میسازد سپس دایرکتوری فعلی را به دایرکتوری ساخته شده تغییر می دهد.
دستور touch Dockerfile requirements.txt main.py سه فایل مورد نظر را می سازد.
فایل main.py را باز کنید و محتویات زیر را اضافه کنید:
from fastapi import FastAPI
app= FastAPI()
@app.get("/")
async def index():
return {"response":"Hello World"}
هر گونه وابستگی مورد نیاز برای پروژه خود را در requirement.txt اضافه کنید به عنوان مثال:
fastapi
uvicorn
اکنون Dockerfile را باز کرده و محتویات زیر را اضافه کنید:
FROM python:latest
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
در اینجا خلاصه ای از دستورات در Dockerfile آمده است:
خط اول : با استفاده از FROM ایمیج پایه برای ساخت ایمیج جدید رو مشخص میکنیم. در اینجا اخرین نسخه پایتون انتخاب شده است.
خط دوم: دستور WORKDIR دایرکتوری که دستورات در آن اجرا شوند را ست میکند که در اینجا /app انتخاب شده است
خط سوم: دستور COPY فایل یا دایرکتوری موردنظر را از داخل دستگاه میزبان به image کپی میکند که در اینجا فایل requirements.txt در داخل /app کپی شد.
خط چهارم: این دستور تمام وابستگی های موجود در فایل requirements.txt که در داخل ایمیج کپی شد را داخل ایمیج نصب میکند.
خط چهارم: تمام محتویات دایرکتوری که Dockerfile در آن واقع شده است را به /app که دایرکتوری ست شده برای دستورات است را کپی میکند.
خط پنجم: این فرمان مشخص می کند هنگام شروع کانتینر اجرا شود. در این حالت، دستور uvicorn را اجرا می کند تا وب سرور Uvicorn را با آرگومان main:app راه اندازی کند که نام فایل پایتون و شی برنامه FastAPI را مشخص می کند و میزبان و پورت را روی 0.0.0.0: 80 قرار می دهد.
به طور کلی، این Dockerfile محیطی را برای اجرای یک برنامه Python FastAPI با وابستگیهای مورد نیاز راهاندازی میکند و یک وب سرور را راهاندازی میکند تا برنامه را در پورت 80 در داخل ایمیج Docker ارائه کند.
اکنون با استفاده از دستور docker build تصویر Docker را بسازید:
docker build -t my_fastapi_project .
با این کار ایمیج Docker ساخته می شود و آن را با نام my_fastapi_project نشانه گذاری می کند
هنگامی که تصویر ساخته شد، می توانید کانتاینر را با دستور زیر اجرا کنید:
docker run -p 80:80 my_fastapi_project
با این کار کانتینر شروع می شود و پورت 80 را در دستگاه میزبان به پورت 80 داخل کانتینر وصل می کند. اکنون باید بتوانید با رفتن به http://127.0.0.1 در مرورگر وب خود به برنامه FastAPI خود دسترسی پیدا کنید.