GH GambleHub

Konteynerləşdirmə: Docker və OCI

Konteynerləşdirmə: Docker və OCI

1) OCI əsas anlayışlar və standartlar

OCI Image Spec - görüntü formatı (manifest, , qatlar, multi-arch üçün index).
OCI Runtime Spec - konteyneri (bundle, 'config. json`); həyata: runc, həmçinin gVisor, Kata Containers.
OCI Distribution Spec - reyestrlərlə qarşılıqlı əlaqə (push/pull, avtorizasiya).

Docker = UX və OCI ətrafında ekosistem: Dockerfile/BuildKit/CLI/Compose/Hub. Kubernetes Docker Engine containerd/CRI-O ilə əvəz olunur, lakin şəkillərin formatı eynidir.

2) Şəkillər: qatlar, etiketlər, meta-məlumatlar

Образ = слои (layered filesystem) + config (entrypoint/cmd/env/labels) + manifest.
Tags: ': latest' istifadə etməyin; pinning ': 1. 21. 3 ', git-SHA və ya tarix + SHA.
LABEL: sahibi, əlaqə, vcs-url, org. opencontainers. (title, description, revision, source).
Multi-arch: manifest indeksi 'amd64/arm64' üçün düzgün variant verir.

3) Montaj: Dockerfile, BuildKit, multi-stage

3. 1 Prinsipləri

Qatları minimuma endirin, versiyaları düzəldin, paket menecerlərinin keşlərini təmizləyin.
Əvvəlcə manifest/lock fayllarını kopyalayın, sonra 'RUN install deps' - cache yaxşılaşdırır.
.dockerignore tələb olunur ('.git', artefaktlar, sirləri istisna edin).
Nümunələr üstünlük distroless/alpine/minimum baza.

3. 2 BuildKit çipləri

Paralel yapılar, yığma sirləri ('--secret'), cash-mounts, multi-arch üçün buildx.

Cash mount nümunəsi:
dockerfile syntax=docker/dockerfile:1. 6
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements. txt

3. 3 Multi-stage nümunələri

Go (statik link, 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 olmadan prod-qat):
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) Minimum şəkillər, PID 1 və siqnallar

Distroless - az hücum səthi, heç bir shell/paket meneceri.

PID 1 düzgün siqnalları, əks halda «zombi prosesləri» proksasiya etməlidir. exec formasında 'ENTRYPOINT' və tini/daxili init istifadə edin:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK' ağıllı (tezlik/zaman, lazımsız yük olmadan).

5) Konteynerlərin təhlükəsizliyi

5. 1 Siyasət və hardening

Non-root (USER), rootless Docker/containers.
Capabilities: artıq ('--cap-drop = ALL --cap-add = NET _ BIND _ SERVICE' və s.).
seccomp/AppArmor/SELinux: profilləri default və ya sərt daxil edin.
Read-only FS + `tmpfs` для `/tmp`, no-new-privileges.
Secrets: şəkillərdə deyil; secrets menecerindən (K8s/vault/docker secrets) quraşdırın.

5. 2 Supply chain

SBOM (CycloneDX/SPDX) və tarama (Trivy/Grype).
İmza (cosign, sigstore) və siyasət pull (verify).
Yeniləmə məşqləri: CVE yamaları olan əsas şəkillər müntəzəm olaraq yenidən yığılır.

6) Saxlama və fayl sürücüləri

Default overlay2 (sürətli və sabit). rootless mühitdə tez-tez fuse-overlayfs.
verilənlər və caches üçün volumes, inkişaf üçün bind-mount.
'/' yazmayın - məlumat yolunu ('/data ') istifadə edin, state-i görüntüdən ayırın.

7) Şəbəkə və DNS

Docker Network: bridge (default), host (minimum overhead, liman münaqişələri), none, macvlan/ipvlan (L2/L3 inteqrasiya).
DNS rezolver Docker host/daemon alır. json; prod üçün yerli cache rezolverlərini qurun.
K8s şəbəkə CNI (Calico/Cilium/Flannel) tərəfindən idarə olunur. sidecar/mesh üçün - tutma (iptables).

8) Resurslar və QoS (cgroups v2)

Məhdudiyyətlər: '--cpus', '-memory', '--pids-limit', '--cpuset-cpus'.
requests/limits (in K8s) → planlaşdırma və QoS təsir.
GC/IO səbəbiylə OOMKilled, throttling, latency spikes izləyin.

Başlanğıc nümunələri:
bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...

9) Log və müşahidə

Log sürücüləri: 'json-file' (rotasiya ilə), 'journald', 'gelf', 'awslogs', 'syslog'.

Rotasiyanı qurun:
json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }

Metrik: Docker Engine API, cAdvisor, node ixracatçıları; konteyner və ya sidecar agent vasitəsilə track.

10) Qeydlər və Autentifikasiya

Şəxsi reyestrlər: ECR/GCR/ACR/Harbor/GitHub Container Registry.
Rate-limits Docker Hub; güzgü/cache istifadə edin (registry-cache).
retention/immutable tags siyasəti, regionlar arasında replikasiya.
'docker login' skriptlərdə saxlamayın; CI-sirləri və OIDC federasiyasını istifadə edin.

11) docker-compose vs orkestratorlar

Compose - yerli inkişaf/inteqrasiya stendləri.
Прод: Kubernetes (Deployment/StatefulSet/DaemonSet, Ingress, Secrets, PVC) с containerd/CRI-O; təhlükəsizlik siyasəti və rollout strategiyaları.
Swarm böyük məhsullar üçün köhnəlmişdir, sadə klasterlər üçün uyğundur.

Nümunə 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, start/stop, graceful shutdown

'retries' taymautları və məhdudiyyətləri ilə 'HEALTHCHECK' istifadə edin.
Düzgün graceful: SIGTERM tutun, daxil olanları tamamlayın, bağlantıları bağlayın, sonra çıxış.
В K8s: `preStop` hook + `terminationGracePeriodSeconds`, readiness перед liveness.

13) Dillər/yığınlar üzrə ən yaxşı practices (xülasə)

Node: 'npm ci', 'NODE _ ENV = production', runtime dev-deps off, '--heapsnapshot' off, 'uWS/GZip' L7-proxy.
Python: wheels, 'gunicorn --graceful-timeout', 'GTHREADS '/' UVICorn' CPU, ehtiyac olmadan ümumi təbəqə daxilində venv saxlamaq deyil.
Go: CGO off (mümkünsə),' -ldflags =» -s -w «', distroless/static, 'GOMAXPROCS' cgroups.
Java: qatlı JAR, '-XX: MaxRAMPercentage', CDS/Layered JAR cache üçün.

14) Supply chain və görüntü siyasəti

CI-də SBOM yaradın, artefaktın yanında saxlayın.
Hər top üzərində görüntüləri tarayın; kritik CVE qapısı.
Şəkilləri imzalayın (cosign), siyasi nəzarətçini daxil edin (K8s - Kyverno/Conftest/Gatekeeper).
Build və run hesabları/şəbəkələri bölün; şəxsi reyestrdə asılılıqları cache.

15) Anti-nümunələr

': latest' prodda; immutable etiketlərin olmaması.
izolyasiya olmadan «prod-host daxilində» montaj; Dockerfile gizli saxlamaq.
root altında start, '--privileged', geniş capabilities.
Qalın şəkillər (> 1-2 GB), yoxdur. dockerignore.
Shell-form vasitəsilə ENTRYPOINT-də init məntiqi → siqnallarla problemlər.
volume əvəzinə konteyner təbəqəsinə daimi məlumat yazın.
Healthcheck, Prod-DB-yə bahalı sorğular edir.

16) Giriş çek siyahısı (0-45 gün)

0-10 gün

Dockerfile (multi-stage, .dockerignore, LABEL, pinned base) standartlaşdırmaq.
BuildKit/buildx, paket menecerləri üçün cache maunts daxil edin.
Qeyri-root və 'seccomp '/AppArmor/SELinux profilləri default.

11-25 gün

Runtime görüntülərini minimuma endirin (alpine/distroless), yuvaları qaydaya salın (rotasiya).
Resurs limitləri, healthchecks, düzgün PID 1/tini.
Private Reestr/Cache qaldırın, CVE skaneri və SBOM Generation qoşun.

26-45 gün

Şəkillərin imzasını və klaster qəbul siyasətini daxil edin.
İstədiyiniz xidmətlər üçün multi-arch (amd64/arm64) təşkil edin.
Runbook montaj/reliz, ölçüsü/boşluqları/montaj vaxtı hesabatı sənədləşdirin.

17) Yetkinlik metrikası

Xidmətlərin 95% -ni ≥ üçün immutable etiketlər və təkrarlanabilir montajlar.
Orta runtime ölçüsü <200-300 MB (yığına görə).
100% prod-konteyner - qeyri-root, məhdud capabilities və read-only FS ilə.
SBOM və hər push üçün CVE scan; kritik CVE → bloklanır.
Şəkillərin imzası və mühitdə policy-enforcement.
Qabın soyuq başlanğıc vaxtı ≤ hədəf SLO (məsələn, 2-5 saniyə), düzgün graceful shutdown.

18) Nəticə

Yetkin konteynerləşdirmə OCI standartları + montaj intizamı + default təhlükəsizlik + müşahidə və təchizat siyasətidir. Multi-stage və BuildKit istifadə edin, runtime görüntüləri minimuma endirin, sərt profillər altında root olmayan başlayın, etiketləri düzəldin, skanerləyin və imzalayın, qeydləri/resursları/şəbəkəni nəzarət altında saxlayın. Beləliklə, konteynerlər sizin platformanızın proqnozlaşdırıla bilən və idarə edilə bilən bazasına çevriləcək - inkişafdan istehsala qədər.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.