Table of Contents
מבוא
יישומי אינטרנט מודרניים לעתים רחוקות לרוץ כמו תהליך מונוליטי יחיד. במקום, הם מורכבים ממספר שירותים: קו החזית, 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.