ویرگول
ورودثبت نام
سیداحمد
سیداحمداز کدنویسی ری‌اکت و یا نکست جی اس برای طراحی سایت‌های مدرن و سئو لذت می‌برم! دنبال توسعه‌دهنده‌ خلاق برای سایت یا لندینگ پیج‌ هستید؟ من اینجام! 😊 zil.ink/seyedahmaddev
سیداحمد
سیداحمد
خواندن ۵ دقیقه·۷ ماه پیش

۵ پروژه که واقعاً شما را در داکر Docker قوی‌تر می‌کنند

بیشتر توسعه‌دهندگان داکر را فقط با کپی‌پیست کردن یک داکرفایل Dockerfile از Stack Overflow یاد می‌گیرند و همانجا کار را تمام‌شده می‌دانند. اما اگر می‌خواهید واقعاً مفهوم کانتینرها، محدودیت‌ها، ویژگی‌های عجیبشان و راه‌های شخصی‌سازی‌ کردنشان را بفهمید، باید دست به کار شوید و بازی کنید!

در ادامه، ۵ پروژه عملی آورده‌ام که کمک می‌کنند مهارت‌های داکر Docker خودتان را سریع ارتقا بدهید.

آیا این‌ها چیزهایی هستند که هر روز استفاده خواهید کرد؟ احتمالاً نه.

اما شاید روزی در یک موقعیت عجیب، این مهارت‌ها حسابی نجاتتان بدهند!




۱. کوچک‌ترین Docker Image ممکن را بسازید، بدون اینکه برنامه دست بخورد

احتمالاً الان یک پروژه دارید — مثلاً یک فرانت‌اند Next.js یا یک API با Flask. چالش اینجاست:

ایمیج خودتان را تا جایی که می‌توانید کوچک کنید. فقط Base Image را عوض نکنید؛ بروید و فایل‌ها، لایه‌ها و حتی ابزارهایی که لازم ندارید را حذف کنید.

وقتی ایمیج شکست خورد و کار نکرد، بررسی کنید چرا شکست خورد. راه‌حل پیدا کنید. باز امتحان کنید. باز هم کوچکترش کنید.

چه چیزی در این شروع کوچک یاد می‌گیرید؟

  • نیازهای واقعی اپ شما
  • نحوه کار لایه‌ها در Docker
  • چطور وابستگی‌ها پنهانی وارد پروژه می‌شوند

پیشنهاد ابزار: از دستورات docker history و ابزارهایی مثل dive استفاده کنید تا ببینید دقیقاً چه چیزی داخل ایمیجتان هست.




۲. چیزی را Dockerize کنید که اصلاً نباید Dockerize شود

چیزی انتخاب کنید که غیرعادی و حتی خنده‌دار به نظر برسد: مثلاً Spotify، یک IDE گرافیکی یا حتی کل محیط دسکتاپ لینوکس یا ویندوز!

سعی کنید آن را داخل کانتینر اجرا کنید.

بیشتر موارد شکست می‌خورند — و دقیقاً همین هدف ماست.

وقتی شکست خوردید، از خودتان بپرسید:

  • مشکل از محدودیت Docker است؟
  • مشکل هسته (Kernel) لینوکس است؟
  • به سخت‌افزار نیاز دارد؟
  • برنامه انتظار خروجی گرافیکی دارد؟

چه چیزی از این شکست یاد می‌گیرید؟

درک عمیق از محدودیت‌های Docker و اینکه چرا برای همه چیز مناسب نیست.




۳. ایمیج پایه Base Image را از صفر بسازید

معمولاً Dockerfileها این شکلی نوشته می‌شوند:

FROM node
FROM ubuntu

حالا متفاوت عمل کنید:

FROM scratch

و خودتان از صفر، Base Image بسازید که اپلیکیشن شما روی آن اجرا شود.

چه چیزی در از صفر ساختن ایمیج پایه یاد می‌گیرید؟

  • چطور فایل‌ها وارد کانتینر می‌شوند
  • یک باینری واقعاً برای اجرا به چه چیزهایی نیاز دارد
  • چرا بعضی‌ها از Alpine استفاده می‌کنند و بعضی‌ها نه
  • تفاوت CMD و ENTRYPOINT

نکته مهم: این کار برای تولید (production) پیشنهاد نمی‌شود، فقط برای یادگیری عالی است.




۴. ساخت Docker را پارامتریک کنید

بسیاری از پروژه‌های متن‌باز چند نوع ایمیج منتشر می‌کنند:

  • یکی بر پایه Debian
  • یکی سبک و کوچک با Alpine
  • یکی برای دیباگ کردن
  • یکی برای معماری‌های مختلف CPU

شما هم این کار را تمرین کنید:

  • از build arguments استفاده کنید
  • منطق شرطی در Dockerfile بنویسید
  • خروجی‌های مختلف از یک pipeline بسازید
  • تکرار منطق‌های تکراری را حذف کنید

چه چیزی در پارامتریک کردن داکر یاد می‌گیرید؟

ساخت ایمیج‌های منعطف و قابل نگهداری




توضیحات بیشتر درباره مورد چهارم: پارامتریک کردن Docker builds

درباره مورد چهارم (پارامتریک کردن Docker builds) الان برات دقیق توضیح می‌دم که چه کاری باید انجام بدی، چه چیزهایی یاد می‌گیری، و حتی برات یک نمونه Dockerfile هم می‌نویسم.


در پروژه‌های واقعی، معمولاً فقط یک Docker image وجود ندارد.

مثلاً:

  • یک ایمیج سبک و سریع برای production (مثلاً با Alpine)
  • یک ایمیج با ابزارهای دیباگ برای توسعه‌دهندگان
  • ایمیج‌هایی برای معماری‌های مختلف CPU (amd64، arm64 و غیره)

برای اینکه هر بار همه چیز را از صفر ننویسی، می‌توانی:

  • از build arguments (ARG) استفاده کنی
  • داخل Dockerfile شرط‌گذاری کنی
  • چند خروجی مختلف از یک pipeline بسازی



مفاهیم اصلی در مورد پارامتریک کردن داکر بیلدز

  • ARG → متغیری است که موقع docker build تعیین می‌کنی و فقط در زمان build در دسترس است.

مثلاً:

ARG BASE_IMAGE=node:alpine FROM ${BASE_IMAGE}


  • ENV → متغیری است که در زمان build و run در دسترس است.
  • multi-stage builds → چند مرحله build در یک Dockerfile که خروجی مرحله‌های سبک را می‌گیری و فقط چیزهای لازم را در مرحله آخر قرار می‌دهی.
  • platform builds → ساخت ایمیج برای معماری‌های مختلف (مثلاً amd64 و arm64)



نمونه Dockerfile با ARG و multi-stage

# انتخاب base image با ARG ARG BASE_IMAGE=node:alpine FROM ${BASE_IMAGE} as build WORKDIR /app COPY . . RUN npm install && npm run build # مرحله production فقط فایل‌های نهایی را نگه می‌دارد FROM nginx:alpine COPY --from=build /app/build /usr/share/nginx/html

موقع build این‌طور صداش می‌زنی:

docker build --build-arg BASE_IMAGE=node:18-alpine -t myapp:alpine . docker build --build-arg BASE_IMAGE=node:18-bullseye -t myapp:debian .



تمرینات پیشنهادی برای این بخش

  • [ ] یک ARG برای base image بساز (مثلاً Alpine یا Debian)
  • [ ] یک ARG برای enable/disable کردن debug mode بساز
  • [ ] multi-stage build پیاده‌سازی کن که فقط فایل‌های لازم وارد مرحله آخر شوند
  • [ ] با docker buildx برای چند معماری ایمیج بساز:
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multiarch .


نکته مهم
سعی کن داکر فایل Dockerfile را DRY بنویسی (Don’t Repeat Yourself)
یعنی:
- از متغیرها استفاده کن
- کدهای تکراری را با if و ARG کنترل کن
- به جای چند Dockerfile جدا، یکی بنویس که انعطاف‌پذیر باشد





۵. بازی «اگر بخواهم کد غیرقابل اعتماد اجرا کنم» را انجام دهید

فرض کنید می‌خواهید در بک‌اند خودتان، اسکریپت‌هایی که کاربران ارسال می‌کنند اجرا کنید. چطور آن را ایمن می‌کنید؟

واقعاً امتحانش کنید:

  • یک کانتینر بسازید و داخلش کد غیرقابل اعتماد اجرا کنید
  • بعد شروع کنید به بستن دسترسی‌ها

ابزارها و مفاهیم برای یادگیری:

  • seccomp profiles
  • کانتینرهای Read-only
  • user namespaces
  • کاهش capabilities
  • آزمایش فرار از sandbox

چه چیزی در این بازی یاد می‌گیرید؟

اینکه داکر چه زمانی کافی نیست و چه زمانی نیاز به sandboxing واقعی دارید.

هر کدام از این پنج مورد توضیحات بیشتری دارند که اگر میخواهید برای دریافت توضیحات بیشتر در ارتباط باشید.





پروژه اضافه (Bonus): کلاً Docker CLI را کنار بگذارید

داکر Docker فقط یک فرانت اند (برنامه سمت جلویی) است. پشت پرده‌اش ابزارهایی مثل BuildKit کانتینر شده و شخصی سازی ایمیج وجود دارند.

تمرین:

  • از buildctl مستقیماً استفاده کنید
  • یک OCI image دستی بسازید
  • بدون docker push، ایمیج را به رجیستری بفرستید
  • مستندات OCI image spec را بخوانید و سعی کنید عملکرد داکر Docker را بازسازی کنید

چه چیزی در پروژه اضافه (Bonus) یاد می‌گیرید؟

مدل ذهنی دقیق‌تری از کانتینرها و عملکرد پشت‌صحنه Docker



خلاصه

آیا این لیست کامل است؟ قطعاً نه. همیشه چیزهای بیشتری برای یادگیری وجود دارد.

اما امیدوارم همین‌ها انگیزه‌ای برایتان باشد که عمیق‌تر به داکر Docker نگاه کنید و فقط به کپی‌پیست کردن قناعت نکنید.

dockerداکر
۲
۰
سیداحمد
سیداحمد
از کدنویسی ری‌اکت و یا نکست جی اس برای طراحی سایت‌های مدرن و سئو لذت می‌برم! دنبال توسعه‌دهنده‌ خلاق برای سایت یا لندینگ پیج‌ هستید؟ من اینجام! 😊 zil.ink/seyedahmaddev
شاید از این پست‌ها خوشتان بیاید