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.
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ş.
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.