GH GambleHub

Контейнерлеу: Docker және OCI

Контейнерлеу: Docker және OCI

1) Базалық ұғымдар және OCI стандарттары

OCI Image Spec - бейнелер пішімі (манифест, , қабаттар, multi-arch үшін index).
OCI Runtime Spec - контейнерді (bundle, 'config. json`); іске асыру: runc, сондай-ақ gVisor, Kata Containers.
OCI Distribution Spec - тізілімдермен өзара іс-қимыл (push/pull, авторизация).

Docker = UX және OCI айналасындағы экожүйе: Dockerfile/BuildKit/CLI/Compose/Hub. Kubernetes бағдарламасында Docker Engine containerd/CRI-O-ға ауыстырылды, бірақ кескіндер пішімі бірдей.

2) Бейнелер: қабаттар, тегтер, метадеректер

Образ = слои (layered filesystem) + config (entrypoint/cmd/env/labels) + manifest.
Тегтер: 'latest' дегенді өнертабыста қолданбаңыз; пинning ': 1. 21. 3 ', git-SHA немесе күні + SHA.
LABEL: иесі, контактісі, vcs-url, org. opencontainers. (title, description, revision, source).
Multi-arch: манифест-индекс 'amd64/arm64' үшін дұрыс нұсқаны береді.

3) Құрастыру: Dockerfile, BuildKit, multi-stage

3. 1 Қағидаттар

Қабаттарды азайтыңыз, нұсқаларды белгілеңіз, пакеттік менеджерлердің кэштерін тазалаңыз.
Алдымен manifest/lock файлдарын көшіріңіз, содан кейін 'RUN install deps' кэшті жақсартады.
.dockerignore міндетті ('.git', артефакттар, құпияларды алып тастаңыз).
distroless/alpine/ең аз базалардың үлгілері артықшылықты.

3. 2 BuildKit чиптері

Параллель билдтер, жинаудағы құпиялар ('--secret'), кэш-маунттар, multi-arch үшін buildx.

Кэш-маунт мысалы:
dockerfile syntax=docker/dockerfile:1. 6
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements. txt

3. 3 Multi-stage мысалдар

Go (статикалық линкалы, distroless):
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"]
Node. js (dev-deps жоқ prod-қабат):
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 (wheel-кеш, non-root):
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 (JLink/Layered Spring):
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 - шабуыл беті аз, shell/пакет менеджері жоқ.

PID 1 сигналдарды дұрыс проксирлеуге тиіс, әйтпесе «зомби-процестер». 'ENTRYPOINT' дегенді exec пішінінде және tini/орнатылған init дегенде пайдаланыңыз:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK' ақылға қонымды (жиілік/таймаут, артық жүктемесіз).

5) Контейнерлердің секьюрлігі

5. 1 Саясат және hardening

Non-root (USER), rootless Docker/containers.
Capabilities: артық жинаңыз ('--cap-drop = ALL --cap-add = NET _ BIND _ SERVICE' және т.б.).
seccomp/AppArmor/SELinux: әдепкі немесе қатаң профайлдарды қосыңыз.
Read-only FS + `tmpfs` для `/tmp`, no-new-privileges.
Secrets: бейнелерде емес; құпия менеджерден (K8s/vault/docker secrets) монтаждаңыз.

5. 2 Supply chain

SBOM (CycloneDX/SPDX) және сканерлеу (Trivy/Grype).
Қолтаңба (cosign, sigstore) және pull (verify) кезіндегі саясат.
Жаңартулардың репетициялары: CVE-патчтары бар базалық бейнелер үнемі қайта жинақталады.

6) Сақтау және файл драйверлері

Әдепкі overlay2 (жылдам және тұрақты). rootless ортада жиі fuse-overlayfs.
деректер мен кэштер үшін volumes, әзірлеу үшін bind-mount.
'/' деп жазбаңыз - деректер жолын ('/data ') пайдаланыңыз, state-ті бейнеден бөліңіз.

7) Желі және DNS

Docker желісі: bridge (әдепкі), host (минималды оверхеда, порт қайшылықтары), none, macvlan/ipvlan (L2/L3 интеграция).
DNS резолвері Docker/daemon хостынан алады. json; prod үшін жергілікті кэш-резервтерді теңшеңіз.
K8s желіні CNI (Calico/Cilium/Flannel) басқарады. sidecar/mesh үшін - ұстап алу (iptables).

8) Ресурстар және QoS (cgroups v2)

Шектеулер: '--cpus', '-memory', '--pids-limit', '--cpuset-cpus'.
requests/limits (K8s) → жоспарлауға және QoS әсер етеді.
GC/IO себебінен OOMKilled, throttling, latency spikes мониторинг.

Іске қосу мысалдары:
bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...

9) Логия және бақылау

'json-file', 'journald', 'gelf', 'awslogs', 'syslog' логтарының драйверлері.

Айналымды теңшеңіз:
json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }

Өлшемдер: Docker Engine API, cAdvisor, node-экспорттаушылар; контейнердегі агент немесе sidecar арқылы трассалау.

10) Тіркелімдер және аутентификация

Жеке тізілімдер: ECR/GCR/ACR/Harbor/GitHub Container Registry.
Rate-limits Docker Hub; (registry-cache) айналарын пайдаланыңыз.
Retention/immutable tags саясаты, өңірлер арасындағы репликация.
'docker login' скрипттерде сақтамаңыз; CI-құпияларды және OIDC-федерациясын пайдаланыңыз.

11) docker-compose vs оркестраторлар

Compose - жергілікті әзірлеу/интеграциялық стендтер.
Прод: Kubernetes (Deployment/StatefulSet/DaemonSet, Ingress, Secrets, PVC) с containerd/CRI-O; қауіпсіздік саясаты және rollout-стратегиялар.
Swarm үлкен азық-түлік үшін ескірген, қарапайым кластерлер үшін жарамды.

Мысал compose (стенд):
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, старт/тоқта, graceful shutdown

'retries' бойынша таймауттар мен шектеулермен 'HEALTHCHECK' пайдаланыңыз.
Дұрыс graceful: SIGTERM-ді ұстаңыз, кірістерді аяқтаңыз, қосылымдарды жабыңыз, содан кейін шығыңыз.
В K8s: `preStop` hook + `terminationGracePeriodSeconds`, readiness перед liveness.

13) Тілдер/стек бойынша Best practices (жиынтық)

Node: 'npm ci', 'NODE _ ENV = production', runtime ішінде dev-deps өшіру, '--heapsnapshot' off, 'uWS/GZip' L7-прокси үшін.
Python: wheels, 'gunicorn --graceful-timeout', 'GTHREADS '/' UVICorn' CPU бойынша, қажетсіз жалпы қабаттың ішінде venv сақтауға болмайды.
Go: CGO off (егер мүмкін болса),' -ldflags =» -s -w «', distroless/static, 'GOMAXPROCS' cgroups бойынша.
Java: қабатты JAR, '-XX: MaxRAMPercentage', CDS/Layered JAR кэші.

14) Supply chain және бейнелер саясаты

SBOM-ды CI-ге генералаңыз, артефактпен қатар сақтаңыз.
Бейнелерді әрбір мамықта сканерлеңіз; сыни CVE гейт.
Суреттерге (cosign) қол қойыңыз, policy controller (K8s - Kyverno/Conftest/Gatekeeper) қосыңыз.
build және run тіркелгілерін/желілерін бөліңіз; Жеке тіркелгідегі тәуелділіктерді кэштеңіз.

15) Қарсы үлгілер

': latest' торабында; иммутабельді тегтердің болмауы.
«Прод-хост ішінде» оқшаулаусыз құрастыру; Dockerfile бағдарламасында құпияларды сақтау.
root, '--privileged', кең capabilities астында іске қосу.
Қалың бейнелер (> 1-2 ГБ), жоқ. dockerignore.
Shell пішіні арқылы ENTRYPOINT-тегі init логикасы → сигналдармен проблемалар.
volume орнына контейнер қабатына тұрақты деректерді жазу.
Healthcheck, прод-ДБ-ға қымбат сұраныстар жасайды.

16) Енгізу чек-парағы (0-45 күн)

0-10 күн

Dockerfile (multi-stage, .dockerignore, LABEL, pinned base) стандарттау.
Бума менеджерлері үшін BuildKit/buildx, кэш-маунттарды қосу.
non-root және 'seccomp '/AppArmor/SELinux профильдеріне әдепкі түрде өту.

11-25 күн

Runtime-бейнелерді азайту (alpine/distroless), логтармен ретке келтіру (ротация).
Ресурс шектерін, healthchecks, дұрыс PID 1/tini баптау.
Жеке тізілімді/кэшті көтеру, CVE сканерін және SBOM генерациясын қосу.

26-45 күн

Кескін қолтаңбасын және кластерге кіру саясатын енгізу.
Қажетті сервистер үшін multi-arch (amd64/arm64) ұйымдастыру.
Құрастыру/шығару runbook құжаттамасы, құрастыру өлшемдері/осалдықтары/уақыты бойынша есеп.

17) Жетілу метрикасы

Сервистердің 95% -ын ≥ үшін иммутабельді тегтер мен жаңғыртылатын құрастырмалар.
Runtime-бейненің орташа өлшемі <200-300 МБ (ағын бойынша).
100% prod-контейнерлер - non-root, шектеулі capabilities және read-only FS.
SBOM және әрбір push үшін CVE сканерлеу; сыни CVE → блокталады.
Ортадағы бейнелер мен policy-enforcement қолтаңбасы.
Контейнерді салқын бастау уақыты ≤ мақсатты SLO (мысалы, 2-5 сек), дұрыс graceful shutdown.

18) Қорытынды

Ересек контейнерлеу - OCI стандарттары + жинау тәртібі + әдепкі қауіпсіздік + бақылау және жеткізу саясаты. Multi-stage және BuildKit-ті пайдаланыңыз, runtime-бейнелерді барынша азайтыңыз, қатаң профильдер астында root емес іске қосыңыз, тегтерді белгілеңіз, сканерлеңіз және қол қойыңыз, логиндерді/ресурстарды/желіні бақылауда ұстаңыз. Осылайша, контейнерлер сіздің платформаңыздың болжамды және басқарылатын негізіне айналады - девелопенттен бастап өндіріске дейін.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Telegram
@Gamble_GC
Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.