GH GambleHub

Контейнерлештирүү: Docker жана OCI

Контейнерлештирүү: Docker жана OCI

1) негизги түшүнүктөр жана OCI стандарттары

OCI Image Spec - сүрөттөрдүн форматы (манифест, , катмар, көп арх үчүн индекс).
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.
Tags: пайдаланууга болбойт ': latest'; pinning ': 1. 21. 3 ', git-SHA же дата + SHA.
LABEL: ээси, байланыш, vcs-url, org. opencontainers. (title, description, revision, source).
Multi-arch: Манифест индекси 'amd64/arm64' үчүн туура вариантты берет.

3) чогултуу: Dockerfile, BuildKit, multi-этап

3. 1 принциптер

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

3. 2 BuildKit чиптер

Параллель ийримдер, чогултуу сырлары ('--secret'), кэш-маунттар, көп-арх үчүн buildx.

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

3. 3 Multi-этап мисалдар

Go (статикалык linked, 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 жок прод-катмар):
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 туура сигналдарды, башкача "зомби-жараяндарды" илип керек. EXEC түрүндө 'ENTRYPOINT' колдонуңуз жана tini/орнотулган init:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK' акылга сыярлык (жыштык/убакыт, ашыкча жүк жок).

5) Контейнер Security

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) Сактоо жана File Drivers

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

7) Тармак жана DNS

Docker Network: bridge (демейки), host (минималдуу overhead, порт чыр-чатактар), 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 таасир этет.
Мониторинг 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' (ротация менен), '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, 'ggroups боюнча GOMAXPROCS'.
Java: катмар JAR, '-XX: MaxRAMPercentage', CDS/кэш үчүн Layered JAR.

14) Supply chain жана сүрөттөр саясаты

CI боюнча SBOM түзүү, артефактынын жанында сактоо.
Ар бир мамык боюнча сүрөттөрдү сканерлөө; критикалык CVE боюнча дарбазасы.
Image кол (cosign), policy controller (K8s - Kyverno/Conftest/Gatekeeper) кирет.
build жана run эсептер/тармактарды бөлүшүү; жеке реестринде көз карандылыкты кэш.

15) Анти-үлгүлөрү

': latest' тукумунда; иммундук тегинин жоктугу.
"Прод-хосттун ичинде" изоляциясы жок чогултуу; Dockerfile жашыруун сактоо.
root астында ишке киргизүү, '--privileged', кенен capabilities.
Калың сүрөттөр (> 1-2 ГБ), жок. dockerignore.
init логикасы shell-форма аркылуу ENTRYPOINT → сигналдар менен көйгөйлөр.
ордуна volume контейнер катмарына туруктуу маалыматтарды жазуу.
Healthcheck, прод-БД үчүн кымбат суроо-талаптарды түзөт.

16) киргизүү чек-тизмеси (0-45 күн)

0-10 күн

Dockerfile стандартташтыруу (multi-этап, .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 MB (агымы боюнча).
100% prod контейнерлер - root эмес, чектелген capabilities жана read-only FS менен.
SBOM жана ар бир push боюнча CVE сканерлөө; критикалык CVE → бөгөттөлгөн.
Кол сүрөттөр жана курчап policy-enforcement.
контейнердин муздак баштоо убактысы ≤ максаттуу SLO (мисалы, 2-5 сек), туура graceful shutdown.

18) Корутунду

Чоңдор үчүн контейнерлөө OCI стандарттары + монтаждоо тартиби + демейки коопсуздук + байкоо жана жеткирүү саясаты. Көп баскычты жана BuildKit колдонуңуз, runtime сүрөттөрүн минималдаштырыңыз, катуу профилдер астында root эмес иштеңиз, тегдерди бекитиңиз, сканерлеңиз жана кол коюңуз, логиндерди/ресурстарды/тармакты көзөмөлгө алыңыз. Ошентип, контейнерлер сиздин платформаңыздын болжолдуу жана башкарылуучу негизи болуп калат - иштеп чыгуудан өндүрүшкө чейин.

Contact

Биз менен байланышыңыз

Кандай гана суроо же колдоо керек болбосун — бизге кайрылыңыз.Биз дайым жардам берүүгө даярбыз!

Telegram
@Gamble_GC
Интеграцияны баштоо

Email — милдеттүү. Telegram же WhatsApp — каалооңузга жараша.

Атыңыз милдеттүү эмес
Email милдеттүү эмес
Тема милдеттүү эмес
Билдирүү милдеттүү эмес
Telegram милдеттүү эмес
@
Эгер Telegram көрсөтсөңүз — Emailден тышкары ошол жактан да жооп беребиз.
WhatsApp милдеттүү эмес
Формат: өлкөнүн коду жана номер (мисалы, +996XXXXXXXXX).

Түшүрүү баскычын басуу менен сиз маалыматтарыңыздын иштетилишине макул болосуз.