Контейнеризатсия: Docker ва OCI
Контейнеризатсия: Docker ва OCI
1) Мафҳумҳо ва стандартҳои асосии OCI
OCI Image Spec - формати тасвир (манифест, конфигуратсия, қабатҳо, индекс барои бисёр нимдоираи).
OCI Runtime Spec - чӣ гуна контейнерро идора кардан мумкин аст (баста, 'конфигуратсия. json '); амалисозӣ: runc ва инчунин контейнерҳои GVisor, Kata.
Spec Distribution OCI - ҳамкорӣ бо феҳристҳо (тела/кашидан, иҷозат).
Docker = UX ва системаи экосистема дар атрофи OCI: Dockerfile/Build .Kit/CLI/Compose/Hub. Дар Кубернетес, Docker Engine бо контейнер/CRI-O иваз карда мешавад, аммо формати тасвир якхела аст.
2) Намуди зоҳирӣ: қабатҳо, барчаспҳо, метамаълумот
Образ = слой (системаи файлии қабатӣ) + конфиг (entrypoint/cmd/env/labels) + манифест.
Барчаспҳо: ': охирин' -ро дар prod истифода набаред; пинҳонӣ ': 1. 21. 3 ', git-SHA ё сана + SHA.
LABEL: соҳиб, тамос, vcs-url, org. opencontainers. (унвон, тавсиф, бознигарӣ, манбаъ).
Бисёр нимдоираи: Нишондиҳандаи шохис варианти дурустро барои 'amd64/arm64' медиҳад.
3) Сохтан: Dockerfile, Build
3. 1 Принсипҳо
Қабатҳоро кам кунед, версияҳоро ислоҳ кунед, кэшҳои менеҷери бастаро тоза кунед.
Аввал файлҳои манифест/қулфро нусхабардорӣ кунед, баъд 'RUN насб кунед' - кэшро такмил медиҳад.
.dockerignore талаб карда мешавад (ба истиснои '.git', артефактҳо, асрҳо).
Намунаҳои пойгоҳҳои парешон/баландкӯҳ/ҳадди аққал бартарӣ доранд.
3. 2 Микросхемаҳои сохташуда
Сохтмонҳои мувозӣ, асрори маҷлис ('-- secret'), болҳои кэш, созанда барои бисёр нимдоираи.
Намунаи васлкунии кэш: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 (prod-қабати бе dev-defs):
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"]
Python (чарх-кеш, реша надорад):
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"]
Java (JL bink/Баҳори қабати):
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 ва сигналҳо
Парешон - сатҳи ҳамлаи хурдтар, менеҷери ниҳонӣ/бастаҳо нест.
PID 1 бояд сигналҳои прокси дуруст дошта бошад, вагарна "равандҳои зомби. "Истифодаи 'ENTRYPOINT' дар шакли exec ва tini/init init:dockerfile
ENTRYPOINT ["tini","--","/app"]
'HEALTHCHECK' оқилона аст (басомад/вақт, бори нолозим).
5) Амнияти контейнер
5. 1 Сиёсат ва сахтгирӣ
Реша (USER), Docker/контейнерҳои решавӣ.
Қобилиятҳо: хориҷ кардани нолозим ('--cap-drop = ALL --cap-add = NET _ BIND _ SERVICE' ва ғайра).
seccomp/App Armor/SEL minux: Профилҳои пешфарз ё қатъиро фаъол созед.
Танҳо FS + 'tmpfs' dlya '/tmp ', имтиёзҳои нав нест.
Асрҳо: на дар тасвирҳо; васл аз мудири асрори K8s/vault/docker.
5. 2 Силсилаи таъминот
SBOM (Cyclone .DX/SPDX) ва сканкунӣ (Trivy/Grype).
Имзо (cosign, sigstore) ва сиёсати кашидан (тафтиш).
Репетиция барои навсозиҳо: тасвирҳои асосӣ бо часпакҳои CVE мунтазам барқарор карда мешаванд.
6) Драйверҳои нигоҳдорӣ ва файл
Пешфарз такрори 2 аст (зуд ва устувор). Дар муҳитҳои решавӣ аксар вақт сарпӯшҳои пешгирикунанда.
ҳаҷм барои маълумот ва кэшҳо, пайвастшавӣ барои рушд.
Ба '/' нанависед - роҳи маълумотро истифода баред ('/data '), ҳолати алоҳида аз тасвир.
7) Шабака ва DNS
Шабакаҳои docker: купрук (пешфарз), мизбон (ҳадди ақали сарборӣ, муноқишаҳои порт), ҳеҷ кас, macvlan/ipvlan (L2/L3 ҳамгироӣ).
Ҳалкунандаи Docker DNS аз мизбон демон мегирад. json; барои prod, кэши ҳалкунандаи маҳаллиро танзим кунед.
Дар K8s шабакаро CNI (Calico/Cilium/Flannel) идора мекунад. Барои sidecar/mesh - intercepts (iptables).
8) Захираҳо ва QOS (гурӯҳҳои v2)
Маҳдудиятҳо: '--cpus', '--memory', '--pids-limit', '--- cpuset-cpus'.
Муқаррар кардани дархостҳо/маҳдудиятҳо (дар K8s) → ба банақшагирӣ ва QO таъсир мерасонад.
Монитор OOMK billed, drottling, хӯшаҳои ниҳонӣ аз сабаби GC/IO.
bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...
9) Гузоришҳо ва мушоҳидаҳо
Драйверҳои сабти ном: 'json-file' (бо гардиш), 'журнал', 'gelf', 'awslogs', 'syslog'.
Танзими гардиш:json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }
Андозагирӣ: Docker Engine API, CAdvisor, содиркунандагони гиреҳ; пайгирӣ тавассути агент дар контейнер ё sidecar.
10) Бақайдгирӣ ва аутентификатсия
Феҳристҳои хусусӣ: Феҳристи контейнерии ECR/GCR/ACR/Harbor/Git
Меъёри маҳдудиятҳои Docker Hub; оинаҳо/кэшҳоро истифода баред (регистр-кэш).
Сиёсати нигоҳдорӣ/барчаспҳои тағйирнопазир, такрори байни минтақаҳо.
'docker login' дар скриптҳо нигоҳ дошта намешавад; сирри CI ва федератсияи OIDC -ро истифода баред.
11) docker-compose vs оркестрҳо
Compose - стендҳои рушд/ҳамгироии маҳаллӣ.
Прод: Кубернетес (Ҷойгиркунӣ/Statureforment-Set/Daemon-Set, Ingress, Secrets, PVC) с контейнерд/CRI-O; сиёсати амният ва стратегияҳои таҳия.
Тӯда барои фурӯши калон кӯҳна шудааст ва барои кластерҳои оддӣ мувофиқ аст.
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' -ро бо вақт ва маҳдудиятҳои 'retries' истифода баред.
Меҳрубонии дуруст: SIGTERM-ро сайд кунед, воридшавиро қатъ кунед, алоқаҳои наздик ва пас аз баромадан.
В K8s: 'Преэстоп' қалмоқе + 'қатъ' Грейс Period 'Seconds', омодагии перед.
13) Таҷрибаи пешқадам аз рӯи забон/стек (хулоса)
Гиреҳ: 'npm ci', 'NODE _ ENV = истеҳсол', хомӯш кардани dev-dev дар вақти корӣ, '--heapsnapshot' хомӯш, 'UWS/GZ' паси прокси L7.
Python: чархҳо, 'gunicorn ---- вақти тӯлонӣ', 'GTHREADS '/' UVIC' orn 'аз ҷониби CPU, ҳатман венвро дар дохили қабати умумӣ нигоҳ намедоранд.
Гузаштан: CGO хомӯш (агар имконпазир бошад),' -ldflags =" -s -w "', парешон/статикӣ, 'GOMAXPROCS' аз ҷониби гурӯҳҳо.
Java: қабати JAR, '-XX: Max
14) Сиёсати занҷираи таъминот ва тасвир
SBOM-ро дар CI тавлид кунед, дар паҳлӯи артефакт захира кунед.
Скан кардани тасвирҳо дар ҳар як порча; дарвоза ба CVE-ҳои интиқодӣ.
Тасвирҳоро имзо кунед (cosign), назорати сиёсатро фаъол созед (дар K8s - Kyverno/Conftest/Gatekeeper).
Ҳисобҳои/шабакаҳои ҷудогона сохтан ва идора кардан; Вобастагии кэш дар феҳристи хусусӣ.
15) Анти-намунаҳо
': охирин' дар prod; набудани барчасбҳои тағйирнопазир.
Маҷлис "дар дохили мизбони истеҳсолӣ" бидуни ҷудоӣ; нигоҳ доштани асрори дар Dockerfile.
Давидан ҳамчун реша, '--privileged', имкониятҳои васеъ.
Тасвирҳои ғафс (> 1-2 ГБ), ҳеҷ. dockerignore.
Мантиқи init дар ENTRYPOINT тавассути ниҳонӣ ба мушкилоти сигнал.
Ба ҷои ҳаҷм ба қабати контейнер маълумоти доимӣ нависед.
Healthcheck, ки ба prod-DB дархостҳои гарон мекунад.
16) Рӯйхати санҷиши амалисозӣ (0-45 рӯз)
0-10 рӯз
Стандарти Dockerfile (бисёр марҳила, .dockerignore, LABEL, пойгоҳи пинҳоншуда).
Ба менеҷерони бастаҳо Building: Kit/buildx, васлаки кэш дохил кунед.
Гузариш ба профилҳои ғайримуқаррарӣ ва 'seccomp '/App
11-25 рӯз
Тасвирҳои вақти кориро (баландкӯҳ/парешон) кам кунед, чизҳоро бо гузоришҳо (гардиш) тартиб диҳед.
Муқаррар кардани маҳдудиятҳои захираҳо, санҷишҳои тиббӣ, PID 1/tini дуруст.
Баланд бардоштани феҳристи/кэши хусусӣ, пайваст кардани сканер CVE ва насли SBOM.
26-45 рӯз
Имзои тасвир ва сиёсати қабули кластерро ворид кунед.
Барои хизматрасониҳои зарурӣ бисёрсоҳавӣ (amd64/arm64) ташкил кунед.
Ҳуҷҷати сохтани/нашри дафтар, сохтани андоза/осебпазирӣ/гузориши вақт.
17) Нишондиҳандаҳои камолот
Барчаспҳои тағйирнопазир ва маҷлисҳои такроршаванда барои ≥ 95% хидматҳо.
Андозаи миёнаи вақти корӣ <200-300 МБ (часпонидашуда) аст.
100% контейнерҳои prod-решавӣ реша надоранд, қобилияти маҳдуд доранд ва танҳо FS-ро мехонанд.
Сканкунии SBOM ва CVE дар як тела; CVE-ҳои интиқодӣ § баста шудаанд.
Имзои тасвир ва татбиқи сиёсат дар муҳит.
Вақти оғози хунук контейнер ≤ ҳадафи SLO (масалан, 2-5 сония), дуруст хомӯш кардани зебо.
18) Хулоса
Контейнеризатсия барои калонсолон стандартҳои OCI + сохтани интизом + амнияти пешфарз + мушоҳида ва сиёсати таҳвил мебошад. Аз бисёр марҳилаҳо ва Build-Kit истифода баред, тасвирҳои вақти кориро кам кунед, дар профилҳои қатъӣ решакан накунед, барчаспҳо ислоҳ кунед, скан ва аломат гузоред, гузоришҳо/захираҳо/шабакаро таҳти назорат нигоҳ доред. Ҳамин тавр, контейнерҳо таҳкурсии пешбинишаванда ва идорашавандаи платформаи шумо - аз рушд то истеҳсол мешаванд.