למה לשלב עם Docker עבור ייצור

תשתיות מודרניות דורשות כי שירותים מקוטבים לשרוד תגמולים בלתי צפויים, תקלות חומרה, או עדכוני החבילה.בעוד דוקר מספק מדיניות הפעלה מחדש (FLT:0), מדיניות זו רק פועלת כל עוד ה- Docker daemon פועל.מערכת Init המשמשת Ubuntu, Debian, פדורה, CentOS, והתפוצה המודרנית ביותר - לוקחת זאת עוד על ידי ניהול החיים של Dockered יכול אפילו להתחיל להשתמש ביתרונות הכלולים, לפני השימוש ב- Dockert עצמו.

  • הזמנה לסטארט-אפ מובטחת באמצעות הנחיות תלותיות (למשל, לאחר רשת.target, לאחר docker.service)
  • ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • שליטה על גבולות משאבים (CPU, זיכרון, I / O) באמצעות הנחיות יחידות ממומשות
  • חידוש אוטומטי על כישלון עם עיכוב חד-משמעי וגבולות פורצים
  • תמיכה ב-Socket הפעלה ו-Timed Startup

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

יצירת שירות מערכתי עבור יחיד דוקר Container

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

שלב 1: כתוב קובץ השירות

צור קובץ בשם FLT:2 השתמש בתבנית הבאה כנקודת התחלה:

[Unit]
Description=My Application Container
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service

[Service]
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStartPre=-/usr/bin/docker kill myapp
ExecStartPre=-/usr/bin/docker rm myapp
ExecStart=/usr/bin/docker run --rm --name myapp \
 -e DB_HOST=10.0.1.50 \
 -e DB_PORT=5432 \
 -v /data/myapp:/app/data \
 -p 8080:8080 \
 myregistry/myapp:latest
ExecStop=/usr/bin/docker stop -t 10 myapp
ExecStopPost=-/usr/bin/docker rm myapp

[Install]
WantedBy=multi-user.target

(ב) ,0) ,הסבר של הוראות מפתח:

  • (ב) ויקרא י"א: "ה', ויקרא י'" (בראשית כ"ד, כ"ד).
  • (ב) ויקרא י"א:5 ,5 ,5 ,5 ,5 , אם כן, , ).
  • (ב) ויקרא י"א: "ה' י'"א: "ה', כ"כ, ויקרא י', כ"כ," (בראשית כ"ד, כ"ד).
  • (ב) ויקרא י"א: "ה' י' (ב') ב': "ה' (ב') ב'"ה' (ב') ב'[[1924]], ב[[1924]], ב[[1924]], [[1924]], [[1924]]]], [[1924]]
  • (ב) ויקרא י"א: "ה' י'"א, בחסדו, הוא עוצר את מיכל עם שעה" (בראשית כ"ד).
  • (ב) ויקרא י"א: "ה', ה' י'"א, ויקרא כ"ד, ו''
  • (ב) ויקרא י"ד: "ה' י"א , ויקרא י"ד: "וַיָּעֹה נָא נָעָשָׂה הוּא עַל עַכְתָּעָם" (בראשית י"ד).
  • (ב) ,0 ,00 ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

שלב 2: אפשרות והתחל את השירות

sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service

ה-FLT:15 אומר להזין מחדש קבצים בשירות.

ניהול השירות עם פקודות סטנדרטיות

לאחר שהשירות פועל, אתה שולט בו בדיוק כמו כל שירות אחר של מערכת:

  • [[1924]]]]]]
  • (ב) ,0) ,(הפסק: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • [[1924]]]]]]
  • (ב) ויקרא י"ד: "ה' אלקים" (בראשית כ"ד)
  • (ב) ויקרא י"ד: ויקרא י"ד:

דפוסי הקונפדרציה מתקדמים

פריסות הייצור דורשות לעתים קרובות יותר מ-FLT פשוט (מתי להלן הן שיפורים משותפים שניתן להוסיף לקבצים השירות הממוחשבים שלך.

מעבר לסביבה משתנה

סודות או תצורה קשיחים בקובץ השירות אינם מומלצים.במקום, השתמש בקובץ סביבה נפרד:

[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
 --env-file /etc/myapp/env.conf \
 myregistry/myapp:latest

הקידומת (FLT:24 ; קידומת לפני הדרך, היא השירות יתחיל גם אם הקובץ לא קיים (שימושי במהלך ההתקנה הראשונית).

רשתות ופורט Bindings

עבור מכולות שצריכים לתקשר אחד עם השני באותו מארח, לשקול שימוש ב-FLT:25 או רשתות גשר מוגדרות למשתמש.

ExecStart=/usr/bin/docker run --rm --name web \
 --network=my-net \
 -p 443:443 \
 -v /etc/ssl/certs:/etc/ssl/certs:ro \
 myregistry/web:latest

אם משתמשים ברשת אישית, וודא שהרשת קיימת לפני תחילת השירות, תוכל להוסיף פקודה ל-FLT:27 כדי ליצור אותה:

ExecStartPre=/usr/bin/docker network create my-net

תלות בין-קונינר

כאשר מיכל אחד דורש אחר להיות מוכן לפני תחילת (למשל, אפליקציה אינטרנט מחכה למסד נתונים), מערכת ההפעלה יכולה לאכוף את הזמנתו. צור קובץ שירות שני עבור מסד הנתונים ולאחר מכן:

[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service

(FLT:30) מקשר את מחזור החיים של אפליקציית האינטרנט למכל מסד הנתונים – אם מסד הנתונים מפסיק, אפליקציית האינטרנט גם נפסקת.

בדיקות בריאות וקריאה

בדיקות בריאות דוקר ניתן לשלב עם מערכת כדי למנוע זמינות מוקדם של שירות. השתמש (FLT:31) עם תסריט המצביע על נקודת הקצה הבריאותי:

ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30

התסריט צריך לצאת 0 רק כאשר המכולה בריאה.אם היא נכשלת, מסמן את היחידה כשלה.

מגבלות משאבים באמצעות Systemd

אתה יכול לבודד את CPU והזיכרון של מכולה ברמת cgroup ללא דגלי המשאבים של דוקר עצמו.זה שימושי במיוחד כאשר הפעלת מיכלים מרובים על מארח יחיד:

[Service]
MemoryMax=512M
CPUQuota=50%

הגדרות אלה יוצרות גבול קשה שמערכת אכיפת המערכת באופן עצמאי של דוקר.

ניהול מספר רב של Containers: Systemd vs. Docker Compose

עבור מספר קטן של מכולות (למשל, 25), קבצים בשירות אישי הם פשוטים וקיים.עם זאת, כאשר פרויקט כרוך שירותים מקושרים רבים, Dockerose הופך נוח יותר.You עדיין יכול להשתמש בתוכנות כדי לזמר את כל ערימה Docker Compose על ידי יצירת יחידה שירות יחיד כי קורא FLT:34 דוגמה:

[Unit]
Description=My Application Stack
After=network-online.target docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down

[Install]
WantedBy=multi-user.target

גישה זו מעניקה לך את הפשטות של Compose להגדרת שירותים בשילוב עם ניהול מחזור החיים של מערכת החינוך, שים לב כי השימוש ב-FLT:37 הוא מיד.

איזו שיטה אתה צריך לבחור?

  • (FLT:0) שירותים ממוצבים באופן יחסי 1 (FLT:1) - הטוב ביותר עבור יישומים מורשת, שירותים עם הזמנת סטארט-אפ קפדנית, או כאשר אתה צריך מגבלות משאבים המכילות.
  • (ב) ⁇ :0) Docker Compose with systemdFLT1) אידיאלי עבור מחסניות מיקרו-שירות שבו התלויים מטופלים מבפנים על ידי Compose, ואתה רוצה יחידה אחת לנהל את כל הקבוצה.

בעיות נפוצות

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

השירות נכשל עם "לא יכול להתחבר לדמון דוקר"

זה בדרך כלל אומר שהשירות מתחיל לפני שהשקע דוקר מוכן, ודא שהיחידה שלך מכילה (FLT:40 ו-FLT:41) ו-T.

מכיל מנוחה ב- Loop

אם המכה תצא מיד, המערכת תמשיך לפעול מחדש על פי ה-FLT:43 ו-(FLT:44 ).

השירות לא מפסיק נקי

(ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

איכות הסביבה לא נטען

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

שיקולים ביטחוניים

הפעלת מיכלי Docker באמצעות מערכת מעלה מספר נקודות אבטחה:

  • תמיד להפעיל את השירות המכוון כמשתמש לא-בסיס אם אפשרי (שימוש ב-FLT:52 ו-FLT:53 הוראות, אך להבטיח למשתמש גישה לשקע דוקר או לרוץ במצב חסר שורש).
  • להימנע משימוש ביחידות ממולאות, אלא אם כן יש צורך בכך.
  • השתמש רק בהרים (ראהים ⁇ ) בכל פעם שהמיכל אינו צריך לכתוב למארח.
  • (ב) ,לֹאמַר (ב) , אִם הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא .
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser

משאבים חיצוניים

לקריאה נוספת, נא להתייעץ עם ההערות הרשמיות הללו:

  • (ב) ,0) מדיניות הוראת סעיף 1
  • (ב) ,0) יחידת השירות של ארצות הברית
  • (ב) עיין ב[[1924]]

מסקנה

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

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