نرم افزار رابطی که دسترسی به ویژگی های process isolation کرنل لینوکس را به ما میدهد Docker Engine نام دارد. از آنجایی که ویژگی هایی که به کانتینرها اجازه ی اجرا می دهند تنها در لینوکس وجود دارند، ویندوز و مک با بکارگیری یک Linux VM اجرای کانتینرها را ممکن می کنند.
ویندوز به صورت کلی از ماشین مجازی wsl برای کانتینرهای لینوکسی و از hyper-v برای کانتینرهای ویندوزی استفاده می کند. به علت کاربرد بسیار کمتر کانتینرهای ویندوزی از بررسی hyper-v در این دوره صرف نظر می کنیم اما کاربرد و مفاهیم آن کاملا مشابه wsl است.
ضمنا سعی میکنیم اگر تفاوتی بین کدها در بین سیستم عامل های مختلف مشاهده کردیم، آن را در دوره مطرح کنیم.
برای استفاده از داکر در ویندوز و مک بنیاد داکر به کاربران Docker Desktop را ارائه میدهد که با نصب آن ماشین مجازی مناسب لینوکسی سیستم عامل شما در پس زمینه اجرا می شود و به داکر اجازه میدهد تا با تمام ترمینال های سیستم شما در ارتباط باشد و با هر ترمینالی که راحتید، کانتینر خود را ایجاد کنید. سیستم های لینوکسی هم نیاز به این ماشین مجازی ندارند چرا که دو ویژگی cgroups و namespace isolation توسط کرنل سیستم عامل تامین می شود.
موتور داکر( Docker Engine ) علاوه بر قابلیت اجرای تصاویر کانتینری، مکانیسم های داخلی build و test تصاویر کانتینری را از طریق فایل های سورس کد مخصوصی به نام Dockerfile دارد. زمانی که یک تصویر کانتینر( container image ) ساخته می شود، میتوانیم آن ها را به ریپازیتوری هایی به نام container image registries به سادگی push کنیم. image registry یک ریپازیتوری اختصاصی تصاویر داکر است که داکر از طریق آن میتواند تصاویر کانتینرها را دانلود و اجرا کند. Docker Engine علاوه بر اجرا و ساخت این تصاویر، میتواند به عنوان یک ریپازیتوری نیز عمل کند البته برای این کار باید تنظیم شود.
در واقع Docker Desktop در کنار کارهای معمول خود به عنوان یک container image registery نیز عمل می کند.
زمانی که یک کانتینر شروع به کار می کند( start : در قسمت بعدی توضیح داده می شود)، داکر تصویر کانتینر را دانلود کرده، در یک فضای cache مخصوص تصاویر به صورت local ذخیره می کند و در نهایت دستور entrypoint همان کانتینر را اجرا می کند. دستور entrypoint فرمانی است که فرآیند اصلی ( primary process ) برنامه ی داخل کانتینر را اجرا می کند. زمانی که primary process متوقف شود یا دچار خطا شود، دیگر کانتینر را در حال اجرا در نظر نمی گیریم.
دستور entrypoint با توجه به برنامه ی داخل کانتینر متفاوت است. این دستور میتواند منجر به اجرای دستورات طولانی، اجرای یک اسکریپت Bash یا اجرای یک خط کد شود. دستور entrypoint را مانند سلسله ای از دستورات مرحله به مرحله در نظر بگیرید که اجرای آنها باعث اجرای primary process می شود.
در زیر نمونه دستورات تعریف شده در Dockerfile کدینگ کاگز را میبینید که بخش مربوط به entrypoint در آن به رنگ آبی است:
FROM python:3.10.4
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
WORKDIR /CCWebsiteProd
COPY Pipfile Pipfile.lock /CCWebsiteProd/
RUN pip install pipenv && pipenv install --system &&
COPY . /CCWebsiteProd/
RUN python /CCWebsiteProd/manage.py runserver 0.0.0.0:8000