شناخت تنظیمات Compose
کار هر بخش از تنظیمات تمرینی و نکتههایی که هنگام تغییر باید بدانید.
فایل compose.yaml را از محیط تمرینی باز کنید. تورفتگی ساختار YAML را تعیین میکند. از فاصله استفاده کنید و پس از تغییر، sudo docker compose config --quiet را اجرا کنید.
ایمیج، سرویس و فرایند
web یک نام سرویس است که کانتینرهای شبکهٔ مشترک میتوانند آن را پیدا کنند. image بستهٔ برنامه است و نمونهٔ در حال اجرای آن کانتینر نام دارد. استک نامی است که برای گروهی از سرویسها و تنظیمات مرتبط به کار میبریم؛ شیء مستقلی در Docker نیست. پروژهٔ Compose کانتینرها، شبکهها و volumeهای آن را کنار هم نگه میدارد.
Traefik و Prometheus از برچسب نسخه استفاده میکنند. ایمیجهای وب و پشتیبانگیری با Dockerfileهای داخل بسته ساخته میشوند و ایمیجهای پایه با digest مشخص شدهاند. ساخت ابزار پشتیبانگیری، checksum کد منبع را هم بررسی و وابستگیهای مشخصی را بهروزرسانی میکند. Dockerfile روش ساخت ایمیج را تعریف میکند؛ Compose روش اجرای کانتینرها را. ثابت کردن نسخه، تغییر را آگاهانه میکند اما اصلاحات امنیتی آینده را خودکار نصب نمیکند.
command آرگومانهای برنامه را تعیین میکند. restart: unless-stopped فرایند پایانیافته را دوباره اجرا میکند، ولی برنامهٔ معیوب را تعمیر نمیکند. depends_on: [web] وابستگی را زودتر اجرا میکند، اما منتظر آماده شدن آن نمیماند. برنامهٔ وابسته به پایگاه داده به بررسی آمادگی یا تلاش مجدد نیاز دارد. ترتیب اجرا
فایل و ماندگاری داده
پوشهٔ صفحه یک bind mount است؛ مسیر موجود میزبان داخل کانتینر دیده میشود. گزینهٔ read_only: true روی این اتصال نوشتن را منع میکند. گزینهٔ create_host_path: false نبودن مسیر را خطا میداند و بیصدا پوشهٔ خالی نمیسازد.
metrics-data و backup-data volumeهای نامدار هستند که Docker مدیریت میکند و پس از ساخت دوبارهٔ کانتینر میمانند. ماندگاری داده همان پشتیبانگیری نیست. برای خروجی گرفتن از روش پشتیبانیشدهٔ برنامه استفاده کنید؛ کپی پوشهٔ پایگاه داده در حال اجرا لزوماً سازگار نیست. Volume در Docker
گزینهٔ read_only در سطح سرویس، فایلسیستم ریشهٔ کانتینر را فقطخواندنی میکند. volumeهای متصل همچنان میتوانند قابلنوشتن باشند. tmpfs فضای موقت حافظه است و با توقف پاک میشود؛ دادهٔ دائمی را آنجا نگذارید.
پورت و شبکه
127.0.0.1:18080:8080 یعنی loopback میزبان، پورت 18080 میزبان و پورت 8080 کانتینر. کانتینر وب پورت منتشرشده ندارد. Traefik از شبکهٔ داخلی lab به http://web:8080 وصل میشود. شبکهٔ access انتشار پورت روی loopback را برای گیتوی و متریک ممکن میکند. این تنظیم جای ورود کاربر یا سیاست فایروال پروژههای دیگر را نمیگیرد. گیتوی با dns: [127.0.0.1] نام سرویس غایب را به DNS خارجی نمیفرستد. Docker نام سرویس فعال را همچنان پاسخ میدهد. این گیتوی به تبدیل نام اینترنتی نیاز ندارد.
مجوز و منابع
cap_drop: [ALL] قابلیتهای لینوکس را حذف میکند. no-new-privileges مانع گرفتن مجوز بیشتر از راههایی مانند setuid میشود. کار یکبارهٔ پشتیبان به CHOWN، DAC_OVERRIDE و FOWNER نیاز دارد تا فایل گذرواژهٔ محدود را بخواند و مالکیت و مجوز فایلها را بازیابی کند. این کانتینر شبکه ندارد و فقط مسیرهای صریحاً متصلشده را میبیند. این استثنا را به برنامههای وب تعمیم ندهید و ریشهٔ میزبان را متصل نکنید.
mem_limit و pids_limit مصرف حافظه و تعداد فرایندها را محدود میکنند. محدودیت بیش از حد ممکن است باعث توقف شود. مقدار GOMEMLIMIT هدف نرمتری برای حافظهٔ runtime زبان Go گیتوی تعیین میکند. محدودیت اندازهٔ گزارش رشد آن را کم میکند، ولی جای هشدار پر شدن دیسک را نمیگیرد.
متغیر محیطی و رازها
فایل .env پروژه مقدارهایی برای جایگزینی Compose مانند ${PORT} میدهد؛ همهٔ مقدارها خودکار وارد کانتینر نمیشوند. environment یا env_file متغیرهای داخل کانتینر را تعیین میکند. خروجی کامل و جایگزینشدهٔ docker compose config را عمومی نکنید. جایگزینی متغیرها
گذرواژهٔ restic به شکل secret متصل و از راه RESTIC_PASSWORD_FILE خوانده میشود تا مقدارش در YAML نباشد. secret محلی Compose فایل است، نه گاوصندوق رمزگذاریشده. از فایل میزبان و دسترسی پشتیبان محافظت کنید. همهٔ برنامهها دریافت راز از فایل را پشتیبانی نمیکنند. رازهای Compose
مرحلهٔ بعد: DNS و مسیریابی.