GH GambleHub

कंटेनराइजेशन: डॉकर और ओसीआई

कंटेनराइजेशन: डॉकर और ओसीआई

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 मानक है + अनुशासन का निर्माण + डिफ़ॉल्ट सुरक्षा + अवलोकन और वितरण नीति। मल्टी-स्टेज और बिजनेसकिट का उपयोग करें, रनटाइम छवियों को कम करें, सख्त प्रोफाइल के तहत नॉन-रूट चलाएं, टैग फिक्स करें, स्कैन करें और साइन करें, लॉग/रिसोर्स/नेटवर्क को नियंत्रण में रखें। इसलिए कंटेनर आपके प्लेटफॉर्म की पूर्वानुमानित और प्रबंधनीय नींव बन जाएंगे - विकास से लेकर उत्पादन तक।

Contact

हमसे संपर्क करें

किसी भी प्रश्न या सहायता के लिए हमसे संपर्क करें।हम हमेशा मदद के लिए तैयार हैं!

Telegram
@Gamble_GC
इंटीग्रेशन शुरू करें

Email — अनिवार्य है। Telegram या WhatsApp — वैकल्पिक हैं।

आपका नाम वैकल्पिक
Email वैकल्पिक
विषय वैकल्पिक
संदेश वैकल्पिक
Telegram वैकल्पिक
@
अगर आप Telegram डालते हैं — तो हम Email के साथ-साथ वहीं भी जवाब देंगे।
WhatsApp वैकल्पिक
फॉर्मैट: देश कोड और नंबर (उदा. +91XXXXXXXXXX)।

बटन दबाकर आप अपने डेटा की प्रोसेसिंग के लिए सहमति देते हैं।