कंटेनराइजेशन: डॉकर और ओसीआई
कंटेनराइजेशन: डॉकर और ओसीआई
1) बेसिक ओसीआई अवधारणाएं और मानक
OCI इमेज स्पेक्ट - इमेज फॉर्मेट (मैनिफेस्ट, कॉन्फिग, लेयर्स, इंडेक्स फॉर मल्टी-आर्क)।
OCI रनटाइम स्पेक - एक कंटेनर (बंडल, 'कॉन्फिग कैसे चलाएं। json '); कार्यान्वयन: runc के साथ-साथ gVisor, काटा कंटेनर।
ओसीआई वितरण कल्पना - रजिस्ट्रियों के साथ बातचीत (पुश/पुल, प्राधिकरण)।
डॉकर = UX और OCI के आसपास पारिस्थितिकी तंत्र: डॉकरफाइल/बिलकिसकिट/CLI/Compose/हब। कुबेरनेट्स में, डॉकर इंजन को कंटेनर/CRI-O द्वारा प्रतिस्थापित किया जाता है, लेकिन छवि प्रारूप समान है।
2) दिखावे: परतें, टैग, मेटाडेटा
= = (स्तरित फ़ाइलसिस्टम) + कॉन्फ़िग (एन्ट्रीपॉइंट/सीएमडी/एनवी/लेबल) + प्रकट।
टैग: प्रोड में ': नवीनतम' का उपयोग न करें; पिनिंग ': 1। 21. 3 ', git-SHA या दिनांक + SHA।
लेबल: मालिक, संपर्क, vcs-url, org। Openconteners। (शीर्षक, विवरण, संशोधन, स्रोत)।
मल्टी-आर्क: इंडेक्स मैनिफेस्ट 'amd64/arm64' के लिए सही विकल्प देता है।
3) बिल्ड: डॉकरफाइल, बिल्डकिट, मल्टी-स्टेज
3. 1 सिद्धांत
परतों को न्यूनतम करें, संस्करण ठीक करें, पैकेज प्रबंधक कैश साफ करें।
पहले मेनिफेस्ट/लॉक फ़ाइलों की नक़ल करें, फिर 'RUN इंस्टॉल डिप्स' - कैश को बेहतर बनाता है।
.dockerignore की आवश्यकता है ('.git', कलाकृतियों, रहस्यों को छोड़ कर)।
डिस्ट्रोलेस/अल्पाइन/न्यूनतम ठिकानों के उदाहरण पसंद किए जाते हैं।
3. 2 बिल्डकिट चिप्स
समानांतर बिल्ड, असेंबली में रहस्य ('-secret'), कैश माउंट, मल्टी-आर्क के लिए बिल्डएक्स।
कैश माउंट का उदाहरण:dockerfile syntax=docker/dockerfile:1. 6
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements. txt
3. 3 बहु-चरण उदाहरण
जाओ (स्थिर रूप से जुड़ा हुआ, विचलित):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"]
नोड। जेएस (देव-डिप्स के बिना प्रोड-लेयर):
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"]
पायथन (व्हील- кеш, नॉन-रूट):
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"]
जावा (JLink/स्तरित वसंत):
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) न्यूनतम छवियां, पीआईडी 1 और संकेत
डिस्ट्रोलेस - छोटे हमले की सतह, कोई शेल/पैकेज प्रबंधक नहीं।
PID 1 को सही ढंग से प्रॉक्सी सिग्नल चाहिए, अन्यथा "ज़ोंबी प्रक्रियाएं। "निष्पादन रूप में 'ENTRYPOINT' का उपयोग करें और टिनी/इनिट इनिट:dockerfile
ENTRYPOINT ["tini","--","/app"]
'HEALTHCHECK' उचित (आवृत्ति/समय समाप्त, कोई अनावश्यक भार नहीं)।
5) कंटेनर सुरक्षा
5. 1 नीतियां और सख्ती
नॉन-रूट (यूजर), रूटलेस डॉकर/कंटेनर।
क्षमताएं: अनावश्यक ('--cap-drop = ALL -cap-ad = NET _ BIND _ SERVICE', आदि) हटाएं.
seccomp/AppArmor/SELinux: डिफ़ॉल्ट या सख्त प्रोफाइल सक्षम करें।
केवल पढ़ें FS + 'tmpfs' для '/tmp ', कोई नया-विशेषाधिकार नहीं.
रहस्य: छवियों में नहीं; K8s/vault/docker रहस्य प्रबंधक से माउंट करें।
5. 2 आपूर्ति श्रृंखला
SBOM (CycloneDX/SPDX) और स्कैनिंग (त्रिवी/ग्रिप)।
हस्ताक्षर (cosign, sigstore) और पुल पॉलिसी (सत्यापित)।
अद्यतन के लिए रिहर्सल: CVE पैच के साथ आधार छवियों को नियमित रूप से फिर से बनाया जाता है।
6) भंडारण और फ़ाइल ड्राइवर
डिफ़ॉल्ट ओवरले 2 (तेज और स्थिर) है। जड़ रहित वातावरण में, अक्सर फ्यूज-ओवरलेफ्स।
डेटा और कैश के लिए वॉल्यूम, विकास के लिए बांध-माउंट।
छवि से अलग स्थिति, '/' - डेटा पथ ('/data ') पर लिखें नहीं।
7) नेटवर्क और डीएनएस
डॉकर नेटवर्क: ब्रिज (डिफ़ॉल्ट), होस्ट (न्यूनतम ओवरहेड, पोर्ट संघर्ष), कोई नहीं, मैकवलान/इप्लान (L2/L3 एकीकरण)।
डॉकर डीएनएस रिज़ॉल्वर होस्ट से/डेमन लेता है। json; प्रोड के लिए, स्थानीय समाधान कैश कॉन्फ़िगर करें।
K8s में, नेटवर्क का प्रबंधन CNI (Calico/Cilium/Flannel) द्वारा किया जाता है। साइडकार/मेष - इंटरसेप्ट (आईप्टेबल्स) के लिए।
8) संसाधन और QoS (cgroups v2)
प्रतिबंध: '--cpus', '--memory', '-pids-limited', '--cpuset-cpus'।
निर्धारित अनुरोध/सीमा (K8s में) → शेड्यूलिंग और QoS को प्रभावित करता है।
GC/IO के कारण OOMKilled, थ्रॉटलिंग, लेटेंसी स्पाइक्स की निगरानी करें।
उदाहरण लॉन्च करें:bash docker run --cpus=1. 5 --memory=512m --pids-limit=256 --read-only --tmpfs /tmp:rw,size=64m...
9) लॉग और अवलोकन
लॉग ड्राइवर: 'json-file' (रोटेशन के साथ), 'जर्नल', 'जेल्फ', 'awslogs', 'syslog'।
घुमाव सेट करें:json
{ "log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"5"} }
मेट्रिक्स: डॉकर इंजन एपीआई, सीएडवाइजर, नोड निर्यातक; एक कंटेनर या साइडकार में एक एजेंट के माध्यम से ट्रेसिंग।
10) रजिस्टर और प्रमाणीकरण
निजी रजिस्ट्रियां: ईसीआर/जीसीआर/एसीआर/हार्बर/गिटहब कंटेनर रजिस्ट्री।
दर-सीमा डॉकर हब; दर्पण/कैश (रजिस्ट्री-कैश) का उपयोग करें।
प्रतिधारण/अपरिवर्तनीय टैग नीति, क्षेत्रों के बीच प्रतिकृति।
'डॉकर लॉगिन' स्क्रिप्ट में संग्रहीत नहीं है; सीआई रहस्य और OIDC महासंघ का उपयोग करें।
11) डॉकर-रचना बनाम ऑर्केस्ट्रेटर
रचना - स्थानीय विकास/एकीकरण स्टैंड।
: कुबर्नेट्स (तैनाती/Stat Set/DaemonSet, Ingress, रहस्य, PVC) कंटेनर/CRI-O; सुरक्षा नीतियां और रोलआउट रणनीतियाँ।
झुंड बड़ी बिक्री के लिए पुराना है, जो सरल समूहों के लिए उपयुक्त है।
उदाहरण रचना (स्टैंड):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' का उपयोग करें।
सुंदर सही करें: SIGTERM को पकड़ें, आने वाले को समाप्त करें, कनेक्शन बंद करें, फिर बाहर निकलें।
: 'प्रीस्टॉप' हुक + 'टर्मिनेशनग्रेससेकंड्स', तत्परता - जीवंतता।
13) भाषा/ढेर (सारांश) द्वारा सर्वश्रेष्ठ अभ्यास
नोड: 'npm ci', 'nODE _ ENV = प्रोडक्शन', रनटाइम में dev-deps को अक्षम करें, '-heapsnapshot' ऑफ, L7 प्रॉक्सी के पीछे 'uWS/GZip'।
अजगर: CPU द्वारा पहिए, 'गनकॉर्न -- ग्रेसफुल-टाइमआउट', 'GTHREADS '/' UVICORN', अनावश्यक रूप से एक सामान्य परत के अंदर वेनव को स्टोर नहीं करते हैं।
गो: CGO ऑफ (यदि संभव हो),' -ldflags =" -s -w ", distroless/static, 'GOMAXPROCS 'cgroups द्वारा।
जावा: स्तरित JAR, '-XX: MaxRAMPercentage', CDS/स्तरित JAR कैश के लिए।
14) आपूर्ति श्रृंखला और छवि राजनीति
CI पर SBOM उत्पन्न करें, कलाकृति के बगल में सहेजें।
प्रत्येक पूच पर छवियों को स्कैन करें; महत्वपूर्ण CVE के लिए गेट।
छवियों पर हस्ताक्षर करें (cosign), नीति नियंत्रक सक्षम करें (K8s - Kyverno/Conftest/Gatekeeper)।
लेखा/नेटवर्क का निर्माण और संचालन अलग; निजी रजिस्ट्री में कैश निर्भरता।
15) एंटी-पैटर्न
': नवीनतम' प्रोड में; अपरिवर्तनीय टैग की कमी।
अलगाव के बिना "उत्पादन मेजबान के अंदर" विधानसभा; डॉकरफाइल में रहस्यों का भंडारण।
रूट के रूप में चल रहा है, '-- privileged', व्यापक क्षमताएँ.
मोटी छवियाँ (> 1-2 जीबी), कोई नहीं। डॉकरिग्नोर।
शेल फॉर्म - सिग्नल समस्याओं के माध्यम से ENTRYPOINT में इनिट तर्क।
आयतन के बजाय कंटेनर परत पर सतत डाटा लिखें।
Healthcheck, जो prod-DB के लिए महंगा अनुरोध करता है।
16) कार्यान्वयन चेकलिस्ट (0-45 दिन)
0-10 दिन
डॉकरफाइल (मल्टी-स्टेज, .dockerignore, LABLE, pinned base) को मानकीकृत करें।
बिल्डकिट/बिल्डएक्स शामिल करें, पैकेज प्रबंधकों के लिए कैश माउंट।
नॉन- रूट और 'सेकंडकॉम्प '/AppArmor/SELinux डिफ़ॉल्ट प्रोफाइल में स्विच करें.
11-25 दिन
रनटाइम छवियों (अल्पाइन/डिस्ट्रोलेस) को न्यूनतम करें, चीजों को लॉग (रोटेशन) के साथ क्रम में रखें।
संसाधन सीमा सेट करें, healthchecks, सही PID 1/tini।
निजी रजिस्ट्री/कैश उठाएं, CVE स्कैनर और SBOM पीढ़ी को जोड़ें।
26-45 दिन
छवि हस्ताक्षर और क्लस्टर प्रवेश नीति भरें।
आवश्यक सेवाओं के लिए मल्टी-आर्क (amd64/arm64) का आयोजन करें।
दस्तावेज़ बिल्ड/रिलीज़रनबुक, आकार/भेद्यता/समय रिपोर्ट का निर्माण
17) परिपक्वता मैट्रिक्स
≥ 95% सेवाओं के लिए अपरिवर्तनीय टैग और प्रजनन योग्य विधानसभाएं।
औसत रनटाइम छवि का आकार <200-300 MB (स्टैक्ड) है।
100% प्रॉड-कंटेनर गैर-रूट हैं, जिनमें सीमित क्षमताएं और रीड-ओनली एफएस हैं।
SBOM और CVE प्रति पुश स्कैन; महत्वपूर्ण CVE → अवरुद्ध हैं।
वातावरण में छवि हस्ताक्षर और नीति-प्रवर्तन।
कंटेनर कोल्ड स्टार्ट टाइम ≤ लक्ष्य SLO (उदा। 2-5 सेकंड), सही सुंदर बंद।
18) निष्कर्ष
वयस्क कंटेनराइजेशन OCI मानक है + अनुशासन का निर्माण + डिफ़ॉल्ट सुरक्षा + अवलोकन और वितरण नीति। मल्टी-स्टेज और बिजनेसकिट का उपयोग करें, रनटाइम छवियों को कम करें, सख्त प्रोफाइल के तहत नॉन-रूट चलाएं, टैग फिक्स करें, स्कैन करें और साइन करें, लॉग/रिसोर्स/नेटवर्क को नियंत्रण में रखें। इसलिए कंटेनर आपके प्लेटफॉर्म की पूर्वानुमानित और प्रबंधनीय नींव बन जाएंगे - विकास से लेकर उत्पादन तक।