GH GambleHub

Konteynerleştirme: Docker ve OCI

Konteynerleştirme: Docker ve OCI

1) Temel OCI kavramları ve standartları

OCI Image Spec - görüntü formatı (manifest, config, layers, index for multi-arch).
OCI Runtime Spec - bir konteynerin nasıl çalıştırılacağı (bundle, 'config. json '); uygulama: runc yanı sıra gVisor, Kata Containers.
OCI Dağıtım Özellikleri - kayıtlarla etkileşim (itme/çekme, yetkilendirme).

Docker = UX ve OCI çevresindeki ekosistem: Dockerfile/BuildKit/CLI/Compose/Hub. Kubernetes'te Docker Engine, containerd/CRI-O ile değiştirilir, ancak görüntü formatı aynıdır.

2) Görünümler: katmanlar, etiketler, meta veriler

Образ = слои (katmanlı dosya sistemi) + config (entrypoint/cmd/env/labels) + manifest.
Etiketler: prod'da ': latest' kullanmayın; sabitleme ': 1. 21. 3 ', git-SHA veya tarih + SHA.
LABEL: sahip, kişi, vcs-url, org. Opencontainers. (başlık, açıklama, revizyon, kaynak).
Multi-arch: Index manifest 'amd64/arm64' için doğru seçeneği verir.

3) Yapı: Dockerfile, BuildKit, çok aşamalı

3. 1 İlkeler

Katmanları en aza indirin, sürümleri düzeltin, paket yöneticisi önbelleklerini temizleyin.
Önce manifest/lock dosyalarını kopyalayın, sonra 'RUN install deps' - önbelleği geliştirir.
.dockerignore gereklidir (hariç '.git', eserler, sırlar).
Distroless/alpine/minimum bazlar tercih edilir.

3. 2 BuildKit yongaları

Paralel yapılar, montajdaki sırlar ('--secret'), önbellek bağlantıları, çoklu kemer için buildx.

Önbellek montajı örneği:
dockerfile syntax=docker/dockerfile:1. 6
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements. txt

3. 3 Çok aşamalı örnekler

Git (statik bağlantılı, 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"]
Düğüm noktası. Js (dev-deps içermeyen prod-layer):
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 (tekerlek кеш, kök olmayan):
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/Katmanlı Yay):
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 görüntüler, PID 1 ve sinyaller

Distroless - daha küçük saldırı yüzeyi, kabuk/paket yöneticisi yok.

PID 1 doğru proxy sinyalleri, aksi takdirde "zombi süreçleri gerekir. Exec formunda 'ENTRYPOINT've tini/init init kullanın:
dockerfile
ENTRYPOINT ["tini","--","/app"]

'HEALTHCHECK' makul (frekans/zaman aşımı, gereksiz yük yok).

5) Konteyner güvenliği

5. 1 Politikalar ve sertleştirme

Root olmayan (USER), rootsuz Docker/container'lar.
Yetenekler: gereksiz kaldırın ('--cap-drop = ALL --cap-add = NET _ BIND _ SERVICE', vb.).
Seccomp/AppArmor/SELinux: Varsayılan veya katı profilleri etkinleştirin.
Salt okunur FS + 'tmpfs' для'/tmp ', yeni ayrıcalık yok.
Sırlar: görüntülerde değil; K8s/vault/docker sırları yöneticisinden Mount.

5. 2 Tedarik zinciri

SBOM (CycloneDX/SPDX) ve tarama (Trivy/Grype).
İmza (cosign, sigstore) ve çekme politikası (doğrulama).
Güncellemeler için provalar: CVE yamalarına sahip temel görüntüler düzenli olarak yeniden oluşturulur.

6) Depolama ve dosya sürücüleri

Varsayılan overlay2'dir (hızlı ve kararlı). Köksüz ortamlarda, genellikle fuse-overlayfs.
Veri ve önbellekler için hacimler, geliştirme için bind-mount.
'/'ye yazmayın - veri yolunu ('/data ') kullanın, durumu görüntüden ayırın.

7) Ağ ve DNS

Docker ağları: bridge (varsayılan), host (minimum yük, port çakışmaları), none, macvlan/ipvlan (L2/L3 tümleştirme).
Docker DNS çözümleyici ana bilgisayardan/daemon alır. json; Prod için, yerel çözümleyici önbelleğini yapılandırın.
K8s'da ağ CNI (Calico/Cilium/Flannel) tarafından yönetilmektedir. Kenar çubuğu/kafes için - kesmeler (iptables).

8) Kaynaklar ve QoS (cgroups v2)

Kısıtlamalar: '--cpus', '--memory', '--pids-limit', '--cpuset-cpus'.
Set requests/limits (in K8s) - zamanlamayı ve QoS'u etkiler.
GC/IO nedeniyle OOMKilled, kısma, gecikme artışlarını izleyin.

Başlatma örnekleri:
bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...

9) Günlükler ve gözlemlenebilirlik

Günlük sürücüleri: 'Json-file' (rotasyonlu), 'journal', 'gelf', 'awslogs', 'syslog'.

Rotasyonu ayarlama:
json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }

Metrikler: Docker Engine API, cAdvisor, düğüm ihracatçıları; Bir konteynerdeki veya yan arabadaki bir ajanın izini sürmek.

10) Kayıtlar ve kimlik doğrulama

Özel kayıtlar: ECR/GCR/ACR/Harbor/GitHub Konteyner Kaydı.
Hız limitleri Docker Hub; Aynalar/önbellekler (registry-cache) kullanın.
Tutma/değişmez etiketler ilkesi, bölgeler arasında çoğaltma.
'docker login' komut dosyalarında saklanmaz; CI sırlarını ve OIDC federasyonunu kullanın.

11) docker-compose vs orkestratörler

Compose - yerel kalkınma/entegrasyon standları.
Прод: Kubernetes (Dağıtım/StatefulSet/DaemonSet, Giriş, Sırlar, PVC) с containerd/CRI-O; Güvenlik politikaları ve dağıtım stratejileri.
Swarm, basit kümeler için uygun olan büyük satışlar için modası geçmiş.

Örnek oluşturma (stand):
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) Sağlık kontrolü, başlatma/durdurma, zarif kapatma

Zaman aşımları ve 'yeniden deneme' kısıtlamaları ile 'HEALTHCHECK' kullanın.
Doğru zarif: SIGTERM'i yakalayın, gelen bağlantıları sonlandırın, bağlantıları kapatın, sonra çıkın.
В K8s: 'PreStop' kanca + 'fesihGracePeriodSeconds', hazırlık перед canlılık.

13) Dile/yığına göre en iyi uygulamalar (özet)

Düğüm: 'npm ci', 'NODE _ ENV = production', çalışma zamanında dev-deps'i devre dışı bırak, '--heapsnapshot' kapalı, 'uWS/GZip' L7 proxy'sinin arkasında.
Python: tekerlekler, 'gunicorn --graceful-timeout', CPU tarafından 'GTHREADS'/' UVICorn', gereksiz yere ortak bir katman içinde venv depolamayın.
Git: CGO kapalı (mümkünse),' -ldflags =" -s -w "', distroless/static, 'GOMAXPROCS'tarafından cgroups.
Java: Katmanlı JAR, '-XX: MaxRAMPercentage', CDS/Önbellek için Katmanlı JAR.

14) Tedarik zinciri ve imaj politikaları

CI üzerinde SBOM oluştur, objenin yanında kaydet.
Her pooch üzerindeki görüntüleri tarayın; Kritik CVE'lere giriş kapısı.
Görüntüleri imzalayın (cosign), politika denetleyicisini etkinleştirin (K8s - Kyverno/Conftest/Gatekeeper).
Ayrı hesaplar/ağlar oluşturun ve çalıştırın; Özel kayıt defterindeki bağımlılıkları önbelleğe alın.

15) Anti-desenler

': son' prod; Değişmez etiketlerin eksikliği.
İzolasyon olmadan "üretim konağının içinde" montaj; Sırların Dockerfile'da saklanması.
Root olarak çalışıyor, '--privileged', geniş yetenekler.
Kalın görüntüler (> 1-2 GB), yok. dockerignore.
Kabuk formu üzerinden ENTRYPOINT init mantığı - sinyal problemleri.
Hacim yerine kap katmanına kalıcı veri yazın.
Sağlık kontrolü, bu da prod-DB'ye pahalı istekte bulunuyor.

16) Uygulama kontrol listesi (0-45 gün)

0-10 gün

Dockerfile'i standartlaştırın (çok aşamalı, .dockerignore, LABEL, sabitlenmiş baz).
Paket yöneticileri için BuildKit/buildx, önbellek bağlantılarını ekleyin.
Root olmayan ve 'seccomp'/AppArmor/SELinux varsayılan profillerine geçin.

11-25 gün

Çalışma zamanı görüntülerini en aza indirin (alp/distroless), günlüklerle işleri sıraya koyun (rotation).
Kaynak limitlerini, sağlık kontrollerini ayarlayın, PID 1/tini'yi düzeltin.
Özel kayıt defterini/önbelleği yükseltin, CVE tarayıcısını ve SBOM neslini bağlayın.

26-45 gün

Görüntü imzasını ve küme kabul politikasını girin.
Gerekli hizmetler için çok kemerli (amd64/arm64) düzenleyin.
Belge oluşturma/yayınlama çalışma kitabı, oluşturma boyutu/güvenlik açığı/zaman raporu.

17) Olgunluk metrikleri

Hizmetlerin ≥ %95'i için değişmez etiketler ve tekrarlanabilir düzenekler.
Ortalama çalışma zamanı görüntü boyutu <200-300 MB (yığılmış).
Prod-container'ların %100'ü kök olmayan, sınırlı yeteneklere ve salt okunur FS'ye sahiptir.
Her itme başına SBOM ve CVE taraması; Kritik CVE'ler engellenir.
Ortamlarda görüntü imzalama ve ilke uygulama.
Konteyner soğuk başlangıç zamanı ≤ hedef SLO (örn. 2-5 saniye), doğru zarif kapatma.

18) Sonuç

Yetişkin konteynerizasyonu OCI standartları + yapı disiplini + varsayılan güvenlik + gözlemlenebilirlik ve teslimat politikasıdır. Çok aşamalı ve BuildKit kullanın, çalışma zamanı görüntülerini en aza indirin, sıkı profiller altında root olmayan çalıştırın, etiketleri düzeltin, tarayın ve imzalayın, günlükleri/kaynakları/ağı kontrol altında tutun. Böylece konteynerler, geliştirmeden üretime kadar platformunuzun öngörülebilir ve yönetilebilir temeli haline gelecektir.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Telegram
@Gamble_GC
Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.