مقدمه
کانتینری کردن (Containerization) فرآیند بستهبندی یک برنامه و وابستگیهای آن در قالب یک ایمیج و اجرای آن بهعنوان کانتینر است. جریان کلی کار از پنج مرحله پیروی میکند: نوشتن برنامه و فهرست کردن وابستگیها، ساخت یک Dockerfile، ساخت ایمیج، ارسال اختیاری آن به یک رجیستری، و اجرای یک کانتینر از روی آن.
دریافت کد برنامه
مثال استفادهشده در این مقاله یک اپلیکیشن وب ساده با Node.js است. پس از کلون کردن آن، دایرکتوری برنامه به build context تبدیل میشود — مجموعه فایلهایی که داکر هنگام ساخت ایمیج از آن استفاده میکند.
git clone https://github.com/nigelpoulton/ddd-book.gitساخت Dockerfile
نسخههای جدیدتر داکر از دستور docker init پشتیبانی میکنند که برنامه را تحلیل کرده و بهصورت خودکار یک Dockerfile مطابق با بهترین شیوهها ایجاد میکند:
docker initDockerfile تولیدشده معمولاً شامل چند دستورالعمل کلیدی است: یک خط FROM برای دریافت ایمیج پایه، یک WORKDIR برای تعیین دایرکتوری کاری، یک دستورالعمل RUN برای نصب وابستگیها، یک دستورالعمل USER برای جلوگیری از اجرا با کاربر root، یک دستورالعمل COPY برای افزودن کد منبع، یک دستورالعمل EXPOSE برای مستندسازی پورت شبکه، و یک دستورالعمل CMD برای مشخص کردن نحوه اجرای برنامه.
ساخت ایمیج
پس از آماده شدن Dockerfile، دستور زیر آن را به یک ایمیج تبدیل میکند و از دایرکتوری فعلی بهعنوان build context استفاده میکند:
docker build -t ddd-book:ch8.node .هر دستورالعمل Dockerfile که محتوایی اضافه میکند — مانند FROM، RUN یا COPY — یک لایه جدید در ایمیج ایجاد میکند. وجود ایمیج نهایی با دستور زیر قابل تأیید است:
docker imagesاجرای docker inspect روی ایمیج، لایههای آن را به همراه متادیتایی مانند پورتهای exposeشده و working directory نشان میدهد.
ارسال ایمیج به Docker Hub
برای اشتراکگذاری یک ایمیج، ابتدا باید وارد سیستم شوید و ایمیج را با تگ جدیدی که شامل ریپازیتوری مقصد باشد برچسبگذاری کنید، زیرا داکر از تگ برای تعیین مقصد push استفاده میکند:
docker login
docker tag ddd-book:ch8.node nigelpoulton/ddd-book:ch8.node
docker push nigelpoulton/ddd-book:ch8.nodeاجرا و تست برنامه
یک کانتینر را میتوان از روی ایمیج ارسالشده (یا ساختهشده محلی) با دستور زیر راهاندازی کرد:
docker run -d --name c1 -p 5005:8080 nigelpoulton/ddd-book:ch8.nodeبرنامه از طریق پورت نگاشتشده هاست در مرورگر قابل دسترسی میشود، و docker ps اجرای صحیح کانتینر و نگاشت پورت را تأیید میکند.
نگاهی دقیقتر
فرآیند docker build Dockerfile را از بالا به پایین میخواند. دستورالعملهایی که محتوا اضافه میکنند — FROM، RUN، COPY، WORKDIR — لایههای جدید میسازند، در حالی که دستورالعملهایی مانند EXPOSE، ENV و CMD فقط متادیتا اضافه میکنند. دستور docker history دقیقاً نشان میدهد کدام دستورالعملها لایه ساختهاند و اندازه هرکدام چقدر است:
docker history ddd-book:ch8.nodeمعمولاً بهترین شیوه این است که ایمیجهای جدید بر پایه Docker Official Images یا ایمیجهای Verified Publisher ساخته شوند، چون این ایمیجها بهطور فعال نگهداری شده و سریعاً برای آسیبپذیریهای شناختهشده بهروزرسانی میشوند.
نتیجهگیری
کانتینری کردن یک برنامه در نهایت به یک الگوی قابل تکرار خلاصه میشود: تعریف فرآیند ساخت در یک Dockerfile، ساخت آن بهصورت ایمیج، اشتراکگذاری اختیاری از طریق رجیستری، و اجرای آن بهعنوان کانتینر. درک اینکه کدام دستورالعملهای Dockerfile لایه میسازند و کدام فقط متادیتا اضافه میکنند، به نوشتن ایمیجهای تمیزتر و کارآمدتر کمک میکند.