کانتینری کردن یک اپلیکیشن Node.js با داکر؛ راهنمای گام‌به‌گام

تبدیل کد منبع یک برنامه به ایمیج کانتینری قابل اجرا، در داکر از یک فرآیند پنج‌مرحله‌ای ثابت پیروی می‌کند. این مقاله نوشتن Dockerfile، ساخت ایمیج، ارسال آن به رجیستری و اجرای آن به‌عنوان کانتینر را با استفاده از یک اپلیکیشن ساده Node.js بررسی می‌کند.

DockerfileDocker BuildDocker Init

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۱۴ شهریور ۱۴۰۵

مقدمه

کانتینری کردن (Containerization) فرآیند بسته‌بندی یک برنامه و وابستگی‌های آن در قالب یک ایمیج و اجرای آن به‌عنوان کانتینر است. جریان کلی کار از پنج مرحله پیروی می‌کند: نوشتن برنامه و فهرست کردن وابستگی‌ها، ساخت یک Dockerfile، ساخت ایمیج، ارسال اختیاری آن به یک رجیستری، و اجرای یک کانتینر از روی آن.

دریافت کد برنامه

مثال استفاده‌شده در این مقاله یک اپلیکیشن وب ساده با Node.js است. پس از کلون کردن آن، دایرکتوری برنامه به build context تبدیل می‌شود — مجموعه فایل‌هایی که داکر هنگام ساخت ایمیج از آن استفاده می‌کند.

git clone https://github.com/nigelpoulton/ddd-book.git

ساخت Dockerfile

نسخه‌های جدیدتر داکر از دستور docker init پشتیبانی می‌کنند که برنامه را تحلیل کرده و به‌صورت خودکار یک Dockerfile مطابق با بهترین شیوه‌ها ایجاد می‌کند:

docker init

Dockerfile تولیدشده معمولاً شامل چند دستورالعمل کلیدی است: یک خط 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 لایه می‌سازند و کدام فقط متادیتا اضافه می‌کنند، به نوشتن ایمیج‌های تمیزتر و کارآمدتر کمک می‌کند.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

داکر چگونه از فناوری‌های امنیتی لینوکس استفاده می‌کند

مدل امنیتی داکر بر پایه دفاع چندلایه ساخته شده و فناوری‌های شناخته‌شده kernel لینوکس را با تنظیمات پیش‌فرض معقول ترکیب می‌کند. این مقاله توضیح می‌دهد که namespaceها، control groupها، capabilityها، Mandatory Access Control و seccomp چگونه در کنار هم کانتینرها را ایزوله و ایمن می‌کنند.

ادامه

مدیریت داده‌های ماندگار در داکر با Volume

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

ادامه

شبکه‌های Overlay در داکر چگونه کار می‌کنند؛ نگاهی به VXLAN

شبکه‌های overlay امکان می‌دهند کانتینرهای روی هاست‌های مختلف طوری با هم ارتباط برقرار کنند که گویی یک شبکه مسطح مشترک دارند، و ستون فقرات بیشتر اپلیکیشن‌های میکروسرویس ابرمحور را تشکیل می‌دهند. این مقاله نحوه ساخت، رمزنگاری و تست یک شبکه overlay داکر روی یک کلاستر Swarm را بررسی کرده و فناوری تونل‌زنی VXLAN پشت آن را توضیح می‌دهد.

ادامه

اتصال کانتینرهای داکر به VLAN و توزیع بار با Swarm

فراتر از شبکه‌های ساده bridge، داکر امکاناتی برای اتصال مستقیم کانتینرها به VLANهای فیزیکی موجود، تفکیک خودکار نام سرویس‌ها و توزیع ترافیک در سراسر یک کلاستر Swarm ارائه می‌دهد. این مقاله درایور macvlan، سرویس داخلی Service Discovery و مکانیزم Ingress Load Balancing در Swarm را بررسی می‌کند.

ادامه

شبکه‌سازی در داکر؛ آشنایی با CNM، Libnetwork و شبکه‌های Bridge

شبکه‌سازی در داکر بر پایه یک طراحی باز به نام Container Network Model ساخته شده که توسط libnetwork پیاده‌سازی و با درایورهای قابل‌جایگزینی گسترش می‌یابد. این مقاله تئوری پشت شبکه داکر را بررسی کرده و نحوه ساخت و تست شبکه‌های bridge تک‌هاست، از جمله تفکیک نام و نگاشت پورت را توضیح می‌دهد.

ادامه

استقرار و مدیریت کلاستر چندنودی با Docker Swarm

Docker Swarm گروهی از نودهای داکر را به یک کلاستر امن و بسیار در دسترس با قابلیت ارکستریشن داخلی تبدیل می‌کند. این مقاله ساخت یک swarm چندنودی، استقرار یک اپلیکیشن میکروسرویس به‌صورت اعلانی و انجام به‌روزرسانی‌های تدریجی بدون از دست دادن سازگاری با وضعیت مطلوب را بررسی می‌کند.

ادامه