מבוא

יישומי אינטרנט מודרניים לעתים רחוקות לרוץ כמו תהליך מונוליטי יחיד. במקום, הם מורכבים ממספר שירותים: קו החזית, API, מסד נתונים, מטמון, תור הודעה, ואולי רץ עבודה.ניהול ידנית את מחזור החיים של כל מיכל, עומס רשת שלהם, ואת התלות שלהם הופך במהירות ערימה של מידע על ביצועים מרובים, תוך כדי הפעלת שירות יעיל יותר, מאפשר לך להגדיר את התצורה הטובה ביותר עבור שירות גמישה, תוך כדי שימוש מהיר של שירות גמישה, אשר מאפשר לך להגדיר את הפתרון הטוב ביותר עבור יישום יחיד, אשר מאפשר לך להגדיר את ה-תועלת יחיד-תועלת גבוהה ביותר עבור מערכת ההפעלה שלך, אשר מאפשר שימוש יעיל יותר, כדי שימוש יעיל יותר עם שירות גמישה, כדי שימוש יעיל של שירות אופטימיזציה של שירות גמישה עם יישום זה, כדי שימוש יעיל יותר עבור יישום זה, כדי שימוש יעיל יותר עם שירות יעיל יותר עם שירות יעיל של שירות יעיל של שירות גמישה עם שירות יעיל יותר עם שירות גמישה עם שירות גמישה שירות גמישה עם שירות גמישה עם שירות יעיל יותר עם שירות גמישה עם שירות יעיל יותר עבור יישום יעיל יותר מדי זמן רב-תועלת יחיד, כדי שימוש יעיל עבור יישום זה, תוך כדי שימוש יעיל של שירות זה, כדי שימוש במהירות, אשר מאפשר לך להגדיר את ה-תועלת יחיד כדי שימוש במהירות כדי שימוש יעיל של שירות

Prerequisites

לפני צלילה, ודא שיש לך את הפעולות הבאות מותקנות על המערכת שלך:

  • (ב) [ה] ב[[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]
  • (ב) ,2 (ב) ,2 ,2 , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) ,0) ,ב"ה, ב"התחילה" (ב) וב[[המאה ה-20]], [[1924]], [[1924]]

באופן אופציונלי יש שם דומיין מצביע על השרת שלך אם אתה מתכנן לעקוב אחר סעיף התצורה SSL.

הבנה של Docker Compose in Depth

דוקר Compose הוא לא רק "ריצה מהירה" פשוטה.זהו כלי הבהרתי המאפשר לך להגדיר שירותים, רשתות, כרכים, משתנים סביבתיים, מדיניות הפעלה מחדש, בדיקות בריאות בקובץ יחיד בשם FLT:1 (כיום חלק של FLT:0Compose SpecificationFLT:1) סטנדרטיזציה כיצד יישומים מרובים המכילים, הופכים את ספקי ההתקנה / התצורה של Microsoft שלך.

שירותים

כל תמונה של מיכל, הנמלים, הנפחים, הסביבה והתלויים מוגדרים תחת המפתח של ההרחבה:2 השירותים יכולים לתקשר אחד עם השני באמצעות רשת גשר ייעודית ש- Compose יוצר באופן אוטומטי.זה אומר שאתה לא צריך לפתוח נמלים מארחים לתקשורת בין-שירותית - רק ה- Proxy הפוך צריך לחשוף נמלים לעולם החיצוני.

רשתות

כברירת מחדל, Compose יוצר רשת אחת לכל השירותים, נותן להם גילוי שירות מבוסס DNS באמצעות שם השירות בשם המארח.לדוגמה, שירות בשם FLT 3 יכול להיות מושג על ידי שירותים אחרים פשוט כמו FLT:4 אתה יכול גם להגדיר רשתות מותאמות אישית לבידוד - למשל, לשים רק את ה- Proxy לאחור על רשת מול פנים ושמירה על מסדי נתונים ברשת פנימית.

networks:
 frontend:
 backend:
services:
 nginx:
 networks:
 - frontend
 app:
 networks:
 - frontend
 - backend
 db:
 networks:
 - backend

כרך

כרך הוא המנגנון המועדף על מנת להתמיד בנתונים שנוצרו על ידי Docker מכולות.ב Compose, אתה יכול להכריז על שם כרכים ברמה העליונה ולהרים אותם לשירותים.זה חיוני עבור מסדי נתונים, העלאת קבצים וכל שירות ממשלתי.

volumes:
 db_data:
services:
 postgres:
 image: postgres:16
 volumes:
 - db_data:/var/lib/postgresql/data

איכות הסביבה משתנה

תצורה חיצונית באמצעות משתנים סביבתיים.You יכול לנסח אותם בקובץ Compose לפיתוח, אבל עבור ייצור אתה צריך להשתמש ב-FLT 7 קבצים או Docker סודות. Compose באופן אוטומטי לטעון קובץ FLT:8 הממוקם באותו מנהל אם אתה לא מציין FLT:9 .

services:
 api:
 image: my-api:latest
 env_file:
 - ./api.env
 environment:
 - NODE_ENV=production

גינוי Nginx כ-Reverse proxy - Advanced

Nginx מאיר כתור הפוך בגלל הביצועים הגבוהים שלה, טביעת אצבע נמוכה, ותכונה עשירה להגדיר.באדריכלות רב-כילה, Nginx יושב בקצה, מקבל בקשות הלקוח, ומעביר אותם לשירות המתאים בהתבסס על הבקשה URI, כותרות, או אפילו תוכן גוף.זה יכול גם לטפל בסימור SSL, גירוד, הגבלת, ועומס.

המונחים: multiple Upstreams

הנה תצורה שלמה יותר שמדגימה כיצד לחלק את התנועה בין שתי יישומים שונים, כולל טיפול בנכסים סטטיים ורשתות:

upstream app1_upstream {
 server app1:8000;
}

upstream app2_upstream {
 server app2:8001;
}

server {
 listen 80;
 server_name example.com;
 return 301 https://$server_name$request_uri;
}

server {
 listen 443 ssl http2;
 server_name example.com;

 ssl_certificate /etc/nginx/certs/fullchain.pem;
 ssl_certificate_key /etc/nginx/certs/privkey.pem;

 # Security headers
 add_header X-Frame-Options "SAMEORIGIN" always;
 add_header X-Content-Type-Options "nosniff" always;
 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

 # App 1 – main web frontend
 location / {
 proxy_pass http://app1_upstream;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 }

 # App 2 – admin dashboard
 location /admin/ {
 proxy_pass http://app2_upstream/;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 }

 # WebSocket support (e.g., for live updates)
 location /ws/ {
 proxy_pass http://app1_upstream;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 }

 # Static assets – serve directly for better performance
 location /static/ {
 alias /var/www/static/;
 expires 30d;
 add_header Cache-Control "public, immutable";
 }
}

שימו לב לשימוש בלוקים (FLT:12) הם מאפשרים לכם להגדיר קבוצה של שרתים עבור איזון עומס.אפילו עם שרת יחיד, באמצעות קבוצת Upstream עושה את זה קל להוסיף העתקים מאוחר יותר מבלי לגעת בלוק השרת.

SSL/TLS עם Let's Encrypt

עבור ייצור, לשרת HTTPS הוא לא ניתן להשגה, אתה יכול להזין מחדש תעודה באמצעות Certbot או FLT:0acme.shearFLT:1 בתוך מיכל רכב.תבנית נפוצה היא להעלות את האישורים ככרכים לתוך מיכל Nginx.

services:
 nginx:
 image: nginx:alpine
 volumes:
 - ./nginx.conf:/etc/nginx/conf.d/default.conf
 - ./certs:/etc/nginx/certs:ro
 - ./static:/var/www/static:ro
 ports:
 - "80:80"
 - "443:443"
 depends_on:
 - app1
 - app2

לחידוש אוטומטי, ניתן להוסיף מיכל לוויה כמו 14:14 או (FLT) אשר פועל עבודה קרום ו reloads Nginx כאשר תעודות מתרעננות.

טעינה Balancing and Health Checks

כאשר אתה מקליד שירות להעתקים מרובים, Nginx יכול להפיץ בקשות באמצעות קורובין עגול, לפחות חיבורים, או IP hash.שלב את זה עם Docker Compose's FLT:16 אפשרות:

upstream api_servers {
 least_conn;
 server api:80 max_fails=3 fail_timeout=30s;
}

כדי לזהות מכולות לא בריאות, Nginx ניתן להגדיר עם FLT 18 (requires NGINX Plus או להשתמש ב-FLT:19 מגרסת הקוד הפתוח עם עבודה קטנה). חלופה פשוטה יותר היא להסתמך על בדיקות בריאות של Docker ורק לרשום מכולות שעוברות.

יצירת קובץ Docker Compose - דוגמה אמיתית לעולם

בואו לשלב הכל לתוך קובץ Compose מעשי עבור יישום אינטרנט המורכב מ- Node.js API, חזית תגובה מוגש על ידי Nginx, מסד נתונים PostgreSQL, ו- Redis cache.ה- Nginx יהיה לשרת קבצים סטטיים ובקשות API Proxy.

version: "3.9"

services:
 nginx:
 image: nginx:alpine
 container_name: reverse-proxy
 restart: unless-stopped
 volumes:
 - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
 - ./frontend/build:/var/www/frontend:ro
 - ./certs:/etc/nginx/certs:ro
 ports:
 - "80:80"
 - "443:443"
 depends_on:
 - api
 - frontend
 networks:
 - public

 frontend:
 image: my-frontend:latest
 # In production, frontend is built into static files and served by Nginx
 # This container may run a dev server, but Nginx will bypass it for static files
 container_name: frontend-dev
 ports:
 - "3000:3000"
 networks:
 - public
 # healthcheck: ...

 api:
 image: my-api:latest
 container_name: api-server
 restart: unless-stopped
 env_file:
 - ./api/.env.production
 depends_on:
 postgres:
 condition: service_healthy
 redis:
 condition: service_started
 networks:
 - public
 - internal
 healthcheck:
 test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
 interval: 30s
 timeout: 10s
 retries: 3

 postgres:
 image: postgres:16-alpine
 container_name: database
 restart: unless-stopped
 environment:
 POSTGRES_USER: app_user
 POSTGRES_DB: app_db
 POSTGRES_PASSWORD_FILE: /run/secrets/db_password
 volumes:
 - pgdata:/var/lib/postgresql/data
 secrets:
 - db_password
 networks:
 - internal
 healthcheck:
 test: ["CMD-SHELL", "pg_isready -U app_user"]
 interval: 10s
 timeout: 5s
 retries: 5

 redis:
 image: redis:7-alpine
 container_name: cache
 restart: unless-stopped
 volumes:
 - redisdata:/data
 networks:
 - internal
 healthcheck:
 test: ["CMD", "redis-cli", "ping"]
 interval: 10s
 timeout: 3s

volumes:
 pgdata:
 redisdata:

networks:
 public:
 internal:
 internal: true

secrets:
 db_password:
 file: ./secrets/db_password.txt

נקודות מפתח בקובץ זה:

  • (ב) ,0.10.1: רשת ה-FLT:21 מוגדרת כ-FLT:22, כלומר רק שירותים מחוברים אליו יכולים לתקשר.
  • (ב) סודיות: נתונים רגישים כמו סיסמאות מאוחסנים כסודות דוקר, רכובים כקבצים בתוך מיכל.זה נמנע מדליפה אותם במשתנים סביבתיים שניתן לחשוף באמצעות LT:23.
  • (ב) עיין ב-[[1924]]: "השירות קובע בדיקות בריאות כך ש-FLT:24 יכול לחכות למצב של 25 מעלות צלזיוס" (Nginx) יתחיל רק לאחר שה- API בריא.
  • (FLT:0) נכסים סטטיים של FLT:1: התפוקה של בניית החזית רכובה ישירות לתוך Nginx, ומאפשר Nginx לשרת קבצים סטטיים מבלי להכות את שרת ה- dev הקדמי.זה משפר את הביצועים והחריגים חששות.

המונחים: Step by Step

עם קובץ Compose ו- Nginx תצורה מוכן, פריסה כוללת מספר פקודות פשוטות.קודם, להבטיח שכל הקבצים התצורה נמצאים במקום:

project/
├── docker-compose.yml
├── nginx/
│ └── nginx.conf
├── api/
│ └── .env.production
├── frontend/
│ └── build/
├── certs/
│ └── (fullchain.pem, privkey.pem)
└── secrets/
 └── db_password.txt

ואז לרוץ:

docker compose pull # pull latest images
docker compose up -d # start all services in background
docker compose ps # verify services are running
docker compose logs -f # tail logs for all services

ברגע שהכל עולה, לבדוק את היישום על ידי ביקור בדומיינים שלך.בדוק יומני Nginx כדי לאשר בקשות הם פרושינטים כראוי.אם אתה צריך לעדכן את התצורה או את משתנים הסביבה, לערוך את הקבצים הרלוונטיים ולהפעיל:

docker compose up -d --no-deps --build nginx # rebuild only nginx if config changed

(ב) בפריסות זמן אפס, יש לשקול שימוש ב-FLT:0כחול-ירוקרטיב-אדום 1 או FLT:2rolling עדכונים sphveFLT 3 עם תכונות של Compose'sFLT:29 ו Nginx upstream Health Check.

סקר וביצועים Tuning

Docker Compose עושה את זה טריוויאלי כדי בקנה מידה שירותים ללא תנאים כמו API:

docker compose up -d --scale api=3

כעת, שלושה העתקים של מיכל ה- API פועלים. Nginx, המוגדרים בבלוק upstream, יפיצו באופן אוטומטי בקשות ביניהם.

  • (ב) ,0) , דחיסה של Gzipves 1 ב Nginx לתגובות מבוססות טקסט.
  • (ב) ויקרא י"א: כ"כ (ב)" (בדוגמא)
  • (ב) ,0) ,Use a CDNFLT 1 עבור משלוח עולמי של קבצים סטטיים.
  • (ב) ,0) תהליכי העבודה של Nginx 1 (FLT:1) כדי להתאים את הליבה CPU:
  • (ב) ,0) ,5 ,5 ,

עבור מסדי נתונים, ודא שיש לך חיבור בריכות ב- API שלך, לשקול באמצעות PgBouncer כמכלת צד.

בעיות נפוצות

גם עם מבנה מובנה היטב, דברים יכולים להשתבש.כאן הם מכשולים תכופים וכיצד לתקן אותם:

  • (ב) לא ניתן להגיע לשירות אחר על ידי שם ראט'ל:1: בדוק ששני השירותים נמצאים באותה רשת דוקר.
  • (ב) [15] ⁇ x מחזיר 502 Bad GatewayFIRLT:1: מיכל הזרם העליון לא יכול להיות פועל או לא מקשיב לנמל הצפוי.
  • (ב) ,0) שגיאות קבלת אישור עם כרכים: קבצים שולבו לתוך מיכלים יורשו את הבעלות של המארח. השתמש במיקומים שמות משתמשים או להגדיר את הוראות ה-FLT:35 ב Nginx ואת מיכל השירות.
  • (FLT:0SSL תעודה לא לחדש את ה-FLT:1: אם באמצעות certbot Standalone, להבטיח יציאות 80 ו-443 אינן חסומות על ידי Nginx במהלך חידוש.
  • (ב) ,0) משתנה לא טעון: לבדוק את קובץ ה-FLT:36 הוא במיקום הנכון או להשתמש בהנחיות FLT:37 כראוי.

אבטחה Best Practices

הפעלת יישומים רב-כילים בייצור דורשת מעקב:

  • (ב) "לא תנהגו" (בראשית כ"ד) אלא אם כן יש צורך בכך, ב[[1924]], ב[[1924]], [[1924]], ב[[1924]], [[1924]]
  • (FLT:0) שמור תמונות עד תאריך ההרחבה 1:1 עם סריקה רגילה של פגיעות. השתמש בתמונות בסיס רשמי וגרסאות סיכות.
  • (FLT:0) חשיפה לרשת מוגבלת 1:1: רק לחשוף את נמלי הפרוקסי ההפוך לאינטרנט.
  • (FLT:0) השתמש בסודות ניהול סודות של קודמו, מפתחי API, ו אסימוניות.סודות דוקר הם התחלה טובה; עבור מתקנים גדולים יותר, שקול HashiCorp Vault.
  • (ב) ,0) , ראה ב-[[1924]], [[1924]]
  • (ב) ,0) , ⁇ וביקורת על פעילות מיכל 1:1, באמצעות שימוש ב-FLT:41 או פתרון מרכזי לרישום כמו ערימה של אלק.
  • (ב) בקובץ ה-FLT (בקובץ ה-Comose) כדי למנוע מכולה אחת מרעבת אחרים:
services:
 api:
 deploy:
 resources:
 limits:
 cpus: '0.50'
 memory: 256M
 reservations:
 cpus: '0.25'
 memory: 128M

הגבולות הללו מכובדים כאשר משתמשים ב-Docker, עבור Compose, הם נאכפים עם FLT:43 (למרות שזה טוב יותר להשתמש ב-Slerk או K8s לתזדורת הייצור).

מסקנה

(הופנה מהדף Compose and Nginx יחד יוצרים פלטפורמה רבת עוצמה, מדרגית, ושמירה על פריסת יישומי אינטרנט המכילים רב-כילה (Commoner Web Applications) על ידי הגדרת הערימה שלך בקובץ YAML יחיד, אתה משיג את השוויון של הסביבה מהפיתוח לייצור: NginFose, כ- Proxy לאחור, מספק נקודה מרכזית עבור סיום SSL, הפסקת תנועה, עומס, ו- cachingization.