GH GambleHub

Կոնտուրիզացիա ՝ Docker և OCI

Կոնտուրիզացիա ՝ Docker և OCI

1) OCI հիմնական հասկացությունները և ստանդարտները

OCI Image Spec-ը պատկերների ձևաչափ է (մանիֆեստ, ամինգ, շերտեր, index multi-arch)։

OCI Runtime Spec-ը ինչպես սկսել բեռնարկղը (bundle, «bundle,»)։ json`); 07: runc, ինչպես նաև gVisor, Kata Invainers։

OCI Distribution Spec-ը ռեեստրերի հետ փոխազդեցությունն է (push/pox, հեղինակային)։

Docker = UX և էկոհամակարգ OCI-ի շուրջ 'Dockerfile/BuildKit/CLI/Compose/Hub։ Kubernetes Docker Engine-ում փոխարինվել է intainerd/CRI-O-ում, բայց պատկերների ձևաչափը նույնն է։

2) Պատկերներ ՝ շերտեր, թեգեր, մետատվյալներ

Образ = слои (layered filesystem) + config (entrypoint/cmd/env/labels) + manifest.

Թեգեր 'մի օգտագործեք «: latest 's» վաճառքում։ pinning '1։ 21. 3 ', git-SHA կամ ամսաթիվը + SHA։

LABEL 'սեփականատեր, կապ, vcs-urrg, org։ opencontainers. (title, description, revision, source).

Multi-arch: մանիֆեստ ինդեքսը տալիս է ճիշտ տարբերակ '«amd64/arm64» համար։

3) Հավաքածու ՝ Dockerfile, BuildKit, multi-stage

3. 1 Սկզբունքներ

Նվազեցրեք շերտերը, արձանագրեք տարբերակները, մաքրեք փաթեթային կառավարիչների կեշին։

Նախ պատճենեք manifest/www.k-ֆայլերը, ապա 'RUN install deps "- բարելավում է քեշը։

.dockerignore պարտավոր է (բացառեք '.git ", արտեֆակտներ, գաղտնիքներ)։

Նախընտրելի են distroless/alpine/նվազագույն հիմքերը։

3. 2 BuildKit fishks

Զուգահեռ տոմսերը, գաղտնիքները հավաքման մեջ («--secret»), քաշ-մաունտները, buildx-ը multi-arch-ի համար։

Քաշ-մաունտի օրինակ

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 (105 շերտ առանց 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-ը պետք է ճիշտ հեռացնի ազդանշանները, հակառակ դեպքում «զոմբիի գործընթացները»։ Օգտագործեք «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 _ III» և այլն)։

secope/Apple Armor/SELinux: Ներառեք լռելյայն կամ խիստ պրոֆիլներ։

Read-only FS + `tmpfs` для `/tmp`, no-new-privileges.

Secrets: Պատկերների մեջ չէ։ տեղադրեք գաղտնիքների ղեկավարից (K8s/vert/docker secrets)։

5. 2 Supply chain

SBSA (Cyclect DX/SPDX) և սկանավորում (Trivy/Grype)։

Ստորագրությունը (cosport, sigstore) և քաղաքականությունը pox (verify)։

Փորձարկումները ցույց են տալիս, որ CVE-ի հիմնական պատկերները պարբերաբար փոխակերպվում են։

6) Պահեստավորում և հիդրավլիկ վարորդներ

Լռելյայն overlay2 (արագ և կայուն)։ Rootless-ում հաճախ fuse-overlay)։

volumes տվյալների և քեշի համար, bind-mount զարգացման համար։

Մի գրեք «/» - օգտագործեք տվյալների ուղին («/www.d. »), առանձնացրեք ստատը պատկերից։

7) Ցանց և RF

Docker ցանցը ՝ bridge (լռելյայն), host (առնվազն ovided, կոնֆլիկտներ), none, macvlan/ipvlan (L2/L3 ինտեգրումը)։

Docker-ռեզոլերը վերցնում է հոստից/daemon։ json; կարգաբերելու համար տեղական kes-resolvers։

K8s-ում ցանցը կառավարում է CNI (Calico/Cilico/Flannel)։ Sidecar/mesh-ի համար - ընդհատումներ (iptables)։

8) Ռեսուրսներ և QoS (cgroups v2)

Սահմանափակումները '--cpus', ----memory «,» ----pids-limit «, ---cpuset-cpus»։

Տեղադրեք reques.ru/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-71» (ռոտացիայով), «journald», «gelf», «awslogs», «www.slog»։

Պարեք ռոտացիան

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 Disainer 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 (Stend) օրինակը

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, stup/stop, graceful shutdown

Օգտագործեք 'HEALTHCHECK' թայմաուտներով և սահմանափակումներով '«retries»։

Ճիշտ graceful 'բռնել SIGTERM, ավարտել բաղադրիչները, փակել միացությունները, ապա դուրս գալ։

В K8s: `preStop` hook + `terminationGracePeriodSeconds`, readiness перед liveness.

13) Best pract.ru լեզուներով/ապակիներ (կամար)

Node: «npm ci», «NODE _ ENV = portion», անջատել dev deps runtime, --- heapsnapshot 'off, «uWS/GZip» -ի համար։

Python: Wheels, "gunicorn--graceful-timeout", "GTHREADS '/" UVICORN" -ը CPU-ով, առանց ընդհանուր շերտի ներսում venv պահպանելու։

Go: CGO off (եթե կարող եք), "-ldflags =" -s -w ", distroless/static," GOMAXPROCS "cgroups։

Java: փխրուն JAR, «-XX: Windows RAMPercentage», CDS/Layered JAR քեշի համար։

14) Supply chain և պատկերների քաղաքականությունը

Engeney SBIM-ը CI-ում, պահպանեք արտեֆակտի կողքին։

Սկանավորեք պատկերները յուրաքանչյուր հոտի վրա։ գեյթ կրիտիկական CVE-ի համար։

Ստորագրեք պատկերները (cosport), միացրեք policy winler (K8s - Kyverno/Wintest/Gatekeeeper)։

Կիսեք build-ը և run-ը։ Քարշիրուզե կախվածություն մասնավոր տարբերակում։

15) Anti-patterna

'latest' ն վաճառում է; իմուտաբային թեգերի բացակայությունը։

«Prod host» -ի ներսում հավաքումը առանց մեկուսացման։ գաղտնիքների պահպանումը Dockerfile-ում։

Root, «--privileged», լայն capabilities։

Հաստ պատկերներ (> 1-2 ԳԲ), բացակայություն։ dockerignore.

INIT-ի տրամաբանությունը ENTRYPOINT-ում shell-ձևի միջոցով բացատրվում է ազդանշանների հետ կապված խնդիրները։

Գրել անընդհատ տվյալներ բեռնարկղի շերտում volume-ի փոխարեն։

Healthcheck-ը, որը թանկ հարցումներ է անում prod-BD-ի համար։

16) Chek-Show-( 0-45 օր)

0-10 օր

Ստանդարտացնել Dockerfile (multi-stage, .dockerignore, LABEL, pinned box)։

Միացրեք BuildKit/buildx, kash mounts ձեռնարկության ղեկավարների համար։

Անցնել non-root և «seccope »/ApPmor/SELinux-ին լռելյայն։

11-25 օր

Նվազագույնի հասցնել runtime-պատկերները (alpine/distroless), բերել կարգուկանոն լոգարանների հետ (ռոտացիա)։

Տեղադրել ռեսուրսների սահմանները, healthecks, ճիշտ PID 1/tini։

Բարձրացրեք մասնավոր ֆորումը/քեշը, միացրեք CVE սկաները և SBSA գեներացիան։

26-45 օր

Ներդնել պատկերների ստորագրությունը և քաղաքականությունը կլաստերի մեջ։

Կազմակերպել multi-arch (amd64/arm64) անհրաժեշտ ծառայությունների համար։

Փաստաթղթավորել runbook հավաքման/թողարկման, չափսի/խոցելիությունների/հավաքման ժամանակի զեկույցը։

17) Հասունության մետրերը

Իմպուտաբելային թեգերը և վերարտադրողական հավաքումները ծառայության 95 տոկոսը։

Runtime-պատկերի միջին չափը <200-300 MB (ապակու վրա)։

Բեռնարկղերի 100 տոկոսը non-root է, սահմանափակ capabilities և read-only FS-ից։

SBSA-ը և CVE սկանավորումը յուրաքանչյուր push-ում։ քննադատական CVE-ները արգելափակված են։

Պատկերների ստորագրումը և policy-enforcae միջավայրում։

Սառը գործարկման ժամանակը SLO (օրինակ ՝ 2-5 վայրկյան), ճիշտ graceful shutdown։

18) Եզրակացություն

Մեծահասակների տարանջատումը OCI + ստանդարտ է հավաքման + անվտանգությունը լռելյայն + դիտարկումը և մատակարարման քաղաքականությունը։ Օգտագործեք multi-stage-stage և BuildKit-ը, նվազեցրեք runtime պատկերները, սկսեք non-root-root-ի տակ, տեղադրեք tegs, սկանավորեք և ստորագրեք, պահեք լոգներ/ռեսուրսներ/ցանցեր վերահսկեք։ Այսպիսով, բեռնարկղերը կդառնան ձեր պլատֆորմի կանխատեսելի և կառավարվող հիմքը 'ծրագրավորումից մինչև երկարաձգված։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Telegram
@Gamble_GC
Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։