GH GambleHub

Containerization: داکر و OCI

Containerization: داکر و OCI

1) مفاهیم و استانداردهای اساسی OCI

OCI مشخصات تصویر - فرمت تصویر (آشکار، پیکربندی، لایه ها، شاخص برای چند قوس).
OCI Runtime Spec - نحوه اجرای یک ظرف (بسته نرم افزاری، پیکربندی. JSON ') ؛ پیاده سازی: runc و همچنین gVisor، ظروف کاتا.
OCI Distribution Spec - تعامل با ثبت نام (فشار/کشش، مجوز).

Docker = UX و اکوسیستم اطراف OCI: Dockerfile/BuildKit/CLI/Compose/Hub. در Kubernetes، موتور Docker با containerd/CRI-O جایگزین می شود، اما فرمت تصویر یکسان است.

2) ظاهر: لایه ها، برچسب ها، ابرداده

Образ = слои (فایل سیستم لایه ای) + پیکربندی (entrypoint/cmd/env/labels) + manifest.
برچسب ها: استفاده نکنید «: آخرین» در تولید ؛ پین کردن: 1. 21. 3 '، git-SHA یا تاریخ + SHA.
برچسب: مالک، تماس، vcs-url، org. opencontainers. (عنوان، توضیحات، تجدید نظر، منبع).
چند قوس: manifest index گزینه صحیح برای «amd64/arm64» را می دهد.

3) ساخت: Dockerfile، BuildKit، چند مرحله ای

3. 1 اصول

لایه ها را به حداقل برسانید، نسخه ها را تعمیر کنید، کش های مدیر بسته را تمیز کنید.
ابتدا فایل های manifest/lock را کپی کنید، سپس «RUN install deps» - حافظه پنهان را بهبود می بخشد.
.dockerignore مورد نیاز است (به استثنای '.git'، مصنوعات، اسرار).
نمونه هایی از پایگاه های بی نظیر/آلپ/حداقل ترجیح داده می شوند.

3. 2 تراشه های BuildKit

ساختارهای موازی، اسرار در مونتاژ («--secret»)، پایه های حافظه پنهان، buildx برای چند قوس.

مثالی از cache mount:
dockerfile syntax=docker/dockerfile:1. 6
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements. txt

3. 3 نمونه های چند مرحله ای

برو (به صورت ایستا مرتبط، بدون فاصله):
dockerfile syntax=docker/dockerfile:1. 6
FROM golang:1. 23 AS build
WORKDIR /src
COPY go. mod go. sum./
RUN go mod download
COPY..
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o /app

FROM gcr. io/distroless/static:nonroot
USER 65532:65532
COPY --from=build /app /app
ENTRYPOINT ["/app"]
گره ها js (تولید لایه بدون dev-deps):
dockerfile syntax=docker/dockerfile:1. 6
FROM node:22-alpine AS deps
WORKDIR /app
COPY package. json./
RUN npm ci --omit=dev

FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules./node_modules
COPY..
RUN npm run build

FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules./node_modules
COPY --from=build /app/dist./dist
USER node
CMD ["node","dist/server. js"]
پایتون (кеш چرخ، غیر ریشه):
dockerfile syntax=docker/dockerfile:1. 6
FROM python:3. 12-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
WORKDIR /app

FROM base AS deps
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade pip
COPY requirements. txt.
RUN --mount=type=cache,target=/root/.cache/pip pip wheel --wheel-dir=/wheels -r requirements. txt

FROM base
COPY --from=deps /wheels /wheels
RUN pip install --no-index --find-links=/wheels -r /app/requirements. txt && rm -rf /wheels
COPY..
USER 1000:1000
CMD ["python","-m","app"]
جاوا (JLink/بهار لایه):
dockerfile syntax=docker/dockerfile:1. 6
FROM maven:3. 9-eclipse-temurin-21 AS build
WORKDIR /src
COPY pom. xml./
RUN mvn -q -e -DskipTests dependency:go-offline
COPY..
RUN mvn -q -DskipTests package

FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=build /src/target/app. jar /app/app. jar
ENTRYPOINT ["java","-XX:+UseContainerSupport","-jar","/app/app. jar"]

4) حداقل تصاویر، PID 1 و سیگنال ها

Distroless - سطح حمله کوچکتر، بدون مدیر پوسته/بسته.

PID 1 باید سیگنال ها را به درستی پروکسی کند، در غیر این صورت «فرآیندهای زامبی». "استفاده از" ENTRYOINT "در فرم exec و tini/init:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK' معقول است (فرکانس/زمان، بدون بار غیر ضروری).

5) امنیت کانتینر

5. 1 سیاست ها و سخت شدن

Non-root (USER)، Docker/containers بدون ریشه.
قابلیت ها: حذف غیر ضروری ('-- cap-drop = ALL -- cap-add = NET _ BIND _ SERVICE، و غیره).
seccomp/AppArmor/SELinux: پروفایل های پیش فرض یا سخت را فعال کنید.
فقط خواندنی FS + 'tmpfs' для '/tmp ', no-new-privileges.
راز: نه در تصاویر از مدیر اسرار K8s/vault/docker استفاده کنید.

5. 2 زنجیره تامین

SBOM (CycloneDX/SPDX) و اسکن (Trivy/Grype).
امضا (cosign، sigstore) و سیاست کشیدن (تأیید).
تمرینات برای به روز رسانی: تصاویر پایه با تکه های CVE به طور مرتب بازسازی می شوند.

6) رانندگان ذخیره سازی و فایل

پیش فرض overlay2 (سریع و پایدار) است. در محیط های بدون ریشه، اغلب پوشش های فیوز.
حجم برای داده ها و حافظه های پنهان، اتصال کوه برای توسعه.
روی «/» ننویسید - از مسیر داده («/data ») استفاده کنید، حالت را از تصویر جدا کنید.

7) شبکه و DNS

Docker networks: bridge (default), host (minimum overhead, port conflicts), none, macvlan/ipvlan (L2/L3 integration).
حل کننده DNS Docker از میزبان/daemon می گیرد. JSON ؛ برای prod، حافظه پنهان حل کننده محلی را پیکربندی کنید.
در K8s، شبکه توسط CNI (Calico/Cilium/Flannel) اداره می شود. برای جانبی/مش - intercepts (iptables).

8) منابع و QoS (cgroups v2)

محدودیت ها: «--cpus»، «--memory»، «--pids-limit»، «--cpuset-cpus».
تنظیم درخواست ها/محدودیت ها (در K8s) → بر برنامه ریزی و QoS تاثیر می گذارد.
مانیتور OOMKilled، throttling، latency spikes به دلیل GC/IO.

راه اندازی نمونه ها:
bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...

9) گزارش ها و قابلیت مشاهده

درایورهای ورود: 'json-file' (با چرخش)، 'journal'، 'gelf'، 'awslogs'، 'syslog'.

تنظیم چرخش:
json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }

معیارها: API موتور Docker، cAdvisor، صادرکنندگان گره ؛ ردیابی از طریق یک عامل در یک ظرف یا sidecar.

10) ثبت و احراز هویت

رجیستری های خصوصی: ECR/GCR/ACR/Harbor/GitHub Container Registry.
محدودیت نرخ داکر هاب ؛ از آینهها/حافظههای نهان (registry-cache) استفاده کنید.
سیاست حفظ/تغییر ناپذیر برچسب ها، تکرار بین مناطق.
'docker login' در اسکریپتها ذخیره نمیشود ؛ استفاده از اسرار CI و فدراسیون OIDC.

11) docker-compose در مقابل ارکستراتورها

Compose - توسعه/ادغام محلی است.
Прод: Kubernetes (استقرار/StatefulSet/DaemonSet، ورود، اسرار، PVC) с containerd/CRI-O ؛ سیاست های امنیتی و استراتژی های گسترش.
Swarm برای فروش های بزرگ، مناسب برای خوشه های ساده است.

مثال ترکیب (ایستاده):
yaml version: "3. 9"
services:
api:
build:.
ports: ["8080:8080"]
environment: ["DB_URL=postgres://pg/DB"]
depends_on: ["pg"]
pg:
image: postgres:16-alpine volumes: ["pgdata:/var/lib/postgresql/data"]
volumes: { pgdata: {} }

12) Healthcheck، شروع/توقف، خاموش شدن برازنده

از «HEALTHCHECK» با محدودیت های زمانی و «محدودیت های مجدد» استفاده کنید.
برازنده صحیح: گرفتن SIGTERM، خاتمه ورودی، اتصالات نزدیک، و سپس خروج.
В K8s: قلاب 'preStop' + 'terminationGracePeriodSeconds'، آمادگی перед زنده بودن.

13) بهترین شیوه های زبان/پشته (خلاصه)

گره: 'npm ci'، 'NODE _ ENV = تولید'، غیرفعال کردن dev-deps در زمان اجرا '، - heapsnapshot' خاموش، 'uWS/GZip' پشت پروکسی L7.
پایتون: چرخ ها، 'gunicorn - graceful-timeout'، 'GTHREADS '/' UVICorn' توسط CPU، به طور غیر ضروری ذخیره venv در داخل یک لایه مشترک نیست.
برو: CGO خاموش (در صورت امکان),' -ldflags =» -s -w «, distroless/استاتیک, 'GOMAXPROCS 'توسط cgroups.
جاوا: JAR لایه ای، '-XX: MaxRAMPercentage'، CDS/JAR لایه ای برای حافظه پنهان.

14) زنجیره تامین و سیاست تصویر

تولید SBOM در CI، صرفه جویی در کنار مصنوع.
اسکن کردن تصاویر بر روی هر پوچ دروازه به CVE های بحرانی.
تصاویر ثبت نام (cosign)، کنترل کننده سیاست را فعال کنید (در K8s - Kyverno/Conftest/Gatekeeper).
ایجاد و اجرای حساب ها/شبکه های جداگانه ؛ وابستگی های حافظه پنهان در رجیستری خصوصی.

15) ضد الگوهای

': آخرین' در تحریک ؛ عدم وجود برچسب های تغییر ناپذیر.
مونتاژ «در داخل میزبان تولید» بدون انزوا ؛ ذخیره اسرار در Dockerfile.
در حال اجرا به عنوان ریشه، «--priveged»، قابلیت های گسترده.
تصاویر ضخیم (> 1-2 گیگابایت)، هیچ کدام. داکرينور.
منطق init در ENTRYPOINT از طریق فرم پوسته → مشکلات سیگنال.
داده های ماندگار را به جای volume در لایه container بنویسید.
Healthcheck، که درخواست های گران قیمت را به prod-DB می دهد.

16) چک لیست پیاده سازی (0-45 روز)

0-10 روز

استاندارد Dockerfile (چند مرحله ای، dockerignore، LABEL، پایه پین شده).
شامل BuildKit/buildx، نصب کش برای مدیران بسته.
سوئیچ به پروفایل های پیش فرض غیر ریشه و «seccomp »/AppArmor/SELinux.

11-25 روز

به حداقل رساندن تصاویر زمان اجرا (آلپ/distroless)، قرار دادن همه چیز به ترتیب با سیاهههای مربوط (چرخش).
تنظیم محدودیت منابع، healthchecks، PID صحیح 1/tini.
بالا بردن رجیستری خصوصی/کش، اتصال اسکنر CVE و نسل SBOM.

26-45 روز

امضای تصویر و سیاست پذیرش خوشه را وارد کنید.
سازماندهی چند قوس (amd64/arm64) برای خدمات مورد نیاز.
سند ساخت/انتشار runbook، اندازه ساخت/آسیب پذیری/گزارش زمان.

17) معیارهای بلوغ

برچسب های غیر قابل تغییر و مجموعه های قابل تکرار برای ≥ 95٪ از خدمات.
متوسط اندازه تصویر در زمان اجرا <200-300 MB (انباشته) است.
100٪ از prod-containers غیر ریشه، با قابلیت های محدود و FS فقط خواندنی است.
اسکن SBOM و CVE در هر فشار ؛ CVE های بحرانی مسدود شده اند.
امضای تصویر و اجرای سیاست در محیط.
زمان شروع سرد کانتینر ≤ SLO هدف (به عنوان مثال 2-5 ثانیه)، خاموش کردن برازنده درست است.

18) نتیجه گیری

Containerization بزرگسالان استانداردهای OCI + ساخت نظم و انضباط + امنیت پیش فرض + قابلیت مشاهده و سیاست تحویل است. استفاده از چند مرحله ای و BuildKit، به حداقل رساندن تصاویر زمان اجرا، اجرای غیر ریشه تحت پروفایل های سخت، رفع برچسب ها، اسکن و ثبت نام، نگه داشتن سیاهههای مربوط/منابع/شبکه تحت کنترل است. بنابراین ظروف تبدیل به پایه قابل پیش بینی و قابل کنترل از پلت فرم خود را - از توسعه به تولید.

Contact

با ما در تماس باشید

برای هرگونه سؤال یا نیاز به پشتیبانی با ما ارتباط بگیرید.ما همیشه آماده کمک هستیم!

Telegram
@Gamble_GC
شروع یکپارچه‌سازی

ایمیل — اجباری است. تلگرام یا واتساپ — اختیاری.

نام شما اختیاری
ایمیل اختیاری
موضوع اختیاری
پیام اختیاری
Telegram اختیاری
@
اگر تلگرام را وارد کنید — علاوه بر ایمیل، در تلگرام هم پاسخ می‌دهیم.
WhatsApp اختیاری
فرمت: کد کشور و شماره (برای مثال، +98XXXXXXXXXX).

با فشردن این دکمه، با پردازش داده‌های خود موافقت می‌کنید.