שירותי קונטיינריזציה של יישומים עם Docker

קונטיינריזציה של יישומים עם Docker: כתיבת Dockerfiles, Docker Compose, הגדרת Registry, אופטימיזציה של תמונות, בניות מרובות שלבים ואבטחת קונטיינרים.
מציג 30 מתוך 37כל 1054 השירותים
הגדרת Hadolint לבדיקת Dockerfile
פשוט
מ- 4 שעות עד 2 ימים

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1112

כיצד קונטיינריזציה של יישומים פותרת את בעיית השחזוריות?

יישום Python רץ על המחשב הנייד של מפתח. בסביבת staging, הוא קורס עם ModuleNotFoundError. בסביבת production, הוא קורס עם PermissionError על ספרייה שאינה קיימת. שלוש סביבות — שלוש קבוצות של בעיות. קונטיינריזציה עם Docker פותרת בדיוק את זה: לא "בידוד" מופשט, אלא את הבעיה הספציפית של שחזוריות סביבת הריצה.

אנחנו עובדים עם Docker כבר למעלה מ-7 שנים וקונטיינרזנו יותר מ-50 שירותים — ממיקרוסרוויסים ב-Go ועד מונוליטים ב-PHP וצינורות ML כבדים ב-Python. בכל פרויקט נתקלנו בטעויות אופייניות: תמונות של 2 GB, זמני בנייה של 15 דקות על מטמון נקי, סודות שנצרבו בשכבות, ויישומים שרצו כ-root. הנה איך לתקן את זה.

מדוע בנייה מרובת-שלבים היא התקן התעשייתי?

Dockerfile חד-שלבי ליישום Go נושא את כל ערכת הכלים: מהדר, חבילות, קוד מקור. התמונה המתקבלת היא 1.1 GB עם יותר מ-150 פרצות אבטחה. בנייה מרובת-שלבים משאירה רק את הבינארי ותעודות CA:

FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o server . FROM scratch COPY --from=builder /app/server /server COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ EXPOSE 8080 ENTRYPOINT ["/server"] 

גודל התמונה הוא 8–15 MB במקום 1.1 GB — הפחתה של עד פי 100. שטח התקיפה מינימלי: אין shell, אין מנהל חבילות. Trivy מוצא 0 פרצות בתמונה כזו (אם הבינארי קומפל ללא תלויות CVE). עבור Node.js, אנו מיישמים תבנית דומה: שלבים נפרדים לתלויות, בנייה, ושלב סופי עם משתמש שאינו root.

כיצד BuildKit מאיץ בניות פי 6?

BuildKit (פעיל כברירת מחדל בגרסאות Docker מודרניות) מוסיף ביצוע מקבילי של שלבים עצמאיים ומטמוני mount שאינם נכללים בתמונה הסופית. דוגמה עבור Go:

FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod \ go mod download COPY . . RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=0 go build -o server . 

הבנייה הראשונה אורכת 4 דקות. בניות עוקבות רק מהדרות חבילות ששונו תוך 40 שניות. ב-CI, ניתן לייצא מטמון דרך FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o server . FROM scratch COPY --from=builder /app/server /server COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ EXPOSE 8080 ENTRYPOINT ["/server"] — זה עובד על כל runner. תיעוד Docker מתאר את כל האפשרויות.

מהו הסדר הנכון של הוראות לשמירה על מטמון שכבות?

Docker מבטל את מטמון השכבות ואת כל השכבות הבאות אחריהן כאשר כל קובץ המשמש בהוראה משתנה. טעות אופיינית היא העתקת כל הקוד לפני התקנת התלויות. הסדר הנכון: ראשית העתקת קבצי מניפסט (package.json, go.mod), הרצת התקנה, ולאחר מכן העתקת קוד המקור. כך, שינויי קוד לא מפעילים מחדש את FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod \ go mod download COPY . . RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=0 go build -o server . או type=registry. זה מאיץ את הבנייה ב-CI ב-30–50% עבור פרויקט טיפוסי.

כיצד לנהל רישומים פרטיים?

Registry מתי להשתמש
ECR (AWS) תשתית AWS, אינטגרציה טבעית עם EKS
GCR / Artifact Registry תשתית GCP
ACR (Azure) Azure
Harbor On-premise, מתארח עצמאית עם Trivy ו-RBAC
GitHub Container Registry פרויקטים על GitHub Actions

Harbor היא האפשרות היחידה המתארחת עצמאית עם סט מלא: סריקת Trivy, שכפול בין רישומים, תגים בלתי ניתנים לשינוי. התג npm ci בסביבת production הוא אנטי-תבנית: Kubernetes לא ימשוך את התמונה אם היא כבר קיימת על הצומת. הגישה הנכונה היא תיוג לפי git SHA או semver: go mod download.

מה מספקת סריקת פרצות ב-CI?

Trivy סורק חבילות מערכת הפעלה, תלויות שפה, ותצורת Dockerfile. אינטגרציה מינימלית ב-GitLab CI מפחיתה פרצות קריטיות ב-90% תוך חודש:

trivy-scan: image: aquasec/trivy:latest stage: security script: - trivy image --exit-code 1 --severity HIGH,CRITICAL --ignore-unfixed --format json --output trivy-report.json $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA 

latest — אל תיכשל על פרצות ללא תיקונים. app:1.4.2 — הימנע מרעש בצנרת. ב-trivy-scan: image: aquasec/trivy:latest stage: security script: - trivy image --exit-code 1 --severity HIGH,CRITICAL --ignore-unfixed --format json --output trivy-report.json $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA , תעד סיכונים מקובלים עם הצדקה.

אבטחת קונטיינרים: מה עוד לבדוק

מלבד CVEs, תמיד בדוק:

  • משתמש root. תמיד הוסף הוראת --ignore-unfixed. היישום לא צריך לרוץ כ-root.
  • מערכת קבצים לקריאה בלבד. --severity HIGH,CRITICAL או .trivyignore ב-Kubernetes. ספריות כתיבה דרך tmpfs.
  • סודות. BuildKit עם USER מעביר סודות לתוך הבנייה מבלי לכתוב אותם לשכבה. דוגמה: docker run --read-only.
  • תמונות Distroless (Google Distroless) — תמונות מינימליות ללא shell. פחות CVEs, שטח תקיפה קטן יותר.

ויקיפדיה מאשרת שפרקטיקות אלה הן תקן תעשייתי.

Docker Compose לפיתוח מקומי

securityContext.readOnlyRootFilesystem: true עם --secret — המתן למוכנות בפועל של השירות:

services: app: depends_on: db: condition: service_healthy db: image: postgres:15-alpine healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 

RUN --mount=type=secret,id=npm_token NPM_TOKEN=$(cat /run/secrets/npm_token) npm ci — להגדרות ספציפיות לפיתוח (הרכבות volumes, פורטים לדיבוג) שאינן נכללות ב-production.

כיצד אנו עובדים על קונטיינריזציה

  1. ביקורת על Dockerfiles וצנרת CI קיימים. זיהוי צווארי בקבוק: גודל תמונה, מטמון, אבטחה.
  2. תכנון ארכיטקטורת בנייה מרובת-שלבים עבור המחסן הטכנולוגי שלך.
  3. פיתוח ואופטימיזציה של Dockerfiles (מטמון, לא-root, distroless).
  4. הקמת רישום פרטי, סריקה ב-CI/CD, ומדיניות אי-שינוי.
  5. תיעוד והדרכת צוות: runbook למפתחים, 1-2 סדנאות.

חיסכון ממוצע במשאבי ענן לאחר היישום: 35%. אם אתה מזהה את הבעיות שלך במקרים המתוארים — צור קשר לביקורת על התשתית שלך. קבל הערכה תוך יום אחד.

ניסיון החברה

מעל 7 שנים של עבודה עם Docker ו-Kubernetes. יותר מ-50 פרויקטי קונטיינריזציה — מסטארטאפים ועד ארגונים. מוסמך Kubernetes (CKA, CKAD). ניסיון עם Yandex Cloud, AWS, GCP, Selectel. כל פרויקט מסתיים במסירת תיעוד ותוכנית תפעול.

הערכות זמנים

משימה לוח זמנים
קונטיינריזציה של שירות בודד מאפס 1–2 ימים
אופטימיזציה של Dockerfiles קיימים + מטמון CI 1–2 ימים
הקמת Harbor עם Trivy ושכפול 2–4 ימים
הקמת סריקה ב-CI עבור N שירותים 2–3 ימים
ביקורת והמלצות (ללא תיקונים) יום אחד

העלות מחושבת באופן אישי לאחר הערכת הפרויקט. בקש ייעוץ — ננתח את התשתית שלך ונציע את הפתרון האופטימלי. צמצם את זמן הבנייה ואת עלויות משאבי הענן כבר עכשיו.