Table of Contents
چرا سیستم را با Docker برای تولید Deployment ترکیب کنیم
زیرساخت های مدرن خواستار آن است که خدمات کانتینری بقا یابنده های غیرمنتظره، خرابی های سخت افزاری یا به روز رسانی های بسته را فراهم کند، در حالی که Dockeremon سیاست های راه اندازی مجدد ( را فراهم می کند ()، این سیاست ها تنها تا زمانی کار می کنند که Dockeremon در حال اجرا است.D - سیستم آن که توسط Ubuntu، دبیان، فدورا، فدورا، CentOS، و اکثر توزیع های مدرن لینوکس استفاده می شود.
- سفارش راه اندازی تضمین شده از طریق دستورالعمل های وابستگی (به عنوان مثال، پس از شبکه.target، پس از docker.service)
- از طریق [[FLT 1]]، ساخت و ساز (Dick)
- کنترل دقیق بر محدودیت های منابع (CPU، حافظه، I/O) با استفاده از دستورالعمل های واحد سیستم شده
- شروع خودکار به شکست با تاخیر قابل تنظیم و محدودیت های انفجار
- پشتیبانی از فعال سازی سوکت و استارت آپ های زمان بندی
با بسته بندی هر ظرف Docker در یک فایل سرویس سیستم، تیم های عملیاتی یک رابط ثابت برای شروع، توقف و نظارت بر ظروف، کاهش وابستگی به اسکریپت های تبلیغاتی و مداخله دستی به دست می آورند.
ایجاد یک سرویس سیستم شده برای یک کانتینر دوکر
رویکرد استاندارد شامل نوشتن یک فایل واحد سرویس است که دستورات Docker را برای اجرا و توقف ظرف می نامد.در زیر ما قدم به گام در روند را با یک مثال اساسی شروع می کنیم و سپس نیازهای تولید مشترک را پوشش می دهیم.
مرحله 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
[[ویرایش] [۱]
- [[۱] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰
- (اگر این کار را انجام دهید، این سرویس نیز متوقف می شود.)
- [[۱] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱]] [۱۰] [۱]] [۱۰] [۱]] [۱۰] [۱]] [۱۰] [۱]] [۱۰] [۱]] [۱۰] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۳] [۱] [۱] [۳] [۳] [۱] [۱]] [۱] [۱]]] [۱] [۳]] [۱]]] [۱]] [۱] [۱]]]]] [۱] [۳] [۳] [۱] [۳] [۳] [۱] [۳] [۳] [۱] [۱]]]]]] [۳] [۱۰] [۱۰] [۳]]] [۳] [۳] [۱]] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳]]]] [۳] [۱] [۳] [۱۰] [
- [[۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۳] [۱۰] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۶] [به طور خودکار [در هنگام توقف، [به صورت خودکار [در هنگام توقف، [به صورت خودکار] ظرف [و از ظرف [و [و [به صورت قطع [و [و [و [و] آن را از آن] دفع می کند،] استفاده کنید.
- [[۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰]] [۱۰] [۱۰]] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰]
- [FLT: 11] - ظرف را بدون در نظر گرفتن کد خروجی باز می کند.
- [در این باره] [به جز یک ثانیه] صبر کنید تا از نو شروع شود.
- [FLT13] - محدودیت ها به 3 تلاش در هر بازه (ده ثانیه) برای جلوگیری از حلقه های بازآفرینی.
مرحله دوم: فعال کردن و شروع خدمات
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
به سیستم های جدید برای خواندن فایل های خدمات می گوید. , symlink را ایجاد می کند تا خدمات شروع به بوت شدن کند.
مدیریت خدمات با فرماندهی سیستم استاندارد
هنگامی که سرویس در حال اجرا است، شما آن را مانند هر سرویس دیگر سیستم کنترل می کنید:
- [در این باره] [[[ویرایش] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۳] [۱] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]
- [در این باره] [[[۱]] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۱] [۳] [۳] [۱] [۳] [۱] [۱] [۱] [۳] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۳
- [[ویرایش] [۱] [۱۰] [۱] [۱۰] [۱۰] [۱] [۱۰] [۱] [۳] [۱] [۳] [۱] [۳] [۱] [۱۰] [۱] [۳] [۳] [۳] [۳] [۱] [۳] [۱] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۱] [۱] [۳] [۳] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]
- [[ویرایش] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۳] [۱] [۳] [۱] [۳] [۳] [۳] [۱] [۳] [۳] [۱] [۱] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۱] [۳] [۱] [۱] [۳] [۳] [۳] [۳] [۱] [۱] [۱] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۱] [۱] [۳] [۳] [۳] [۳] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳]
- [در این باره]: [[[۱]] [۱۰] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱۰] [۱] [۱] [۱۰] [۱] [۱] [۱] [۳] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۳] [۳] [۱] [۱] [۱] [۱] [۳] [۱] [۳] [۱] [۱] [۳] [۱] [۳] [۳] [۱] [۱] [۳] [۳] [۳] [۱] [۳] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۱] [
ویژگی های Advanced Configuration Patterns
استقرار های تولیدی اغلب نیاز به بیش از یک (FLT 22) ساده دارند.در زیر افزایش های رایجی است که می توانید به فایل های خدمات سیستم خود اضافه کنید.
انتقال Environment Variables
اسرار یا پیکربندی سخت در فایل سرویس توصیه نمی شود، در عوض، از یک فایل محیط جداگانه استفاده کنید:
[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
--env-file /etc/myapp/env.conf \
myregistry/myapp:latest
پیش از این، سرویس قبل از مسیر شروع می شود حتی اگر فایل وجود نداشته باشد (در طول راه اندازی اولیه مفید است).
شبکه و بندر بندینگ
برای ظروفی که نیاز به برقراری ارتباط با یکدیگر دارند، استفاده از یا شبکه های پل تعریف شده توسط کاربر را در نظر بگیرید.
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
وابستگی های متقابل-Container
هنگامی که یک ظرف قبل از شروع به آماده شدن نیاز دارد (به عنوان مثال، یک برنامه وب که منتظر یک پایگاه داده است)، سیستم می تواند سفارش را اجرا کند.
[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service
اتصال چرخه عمر برنامه وب به ظرف پایگاه داده - اگر پایگاه داده متوقف شود، برنامه وب نیز متوقف شده است.
بررسی سلامت و Readiness
چک های بهداشتی Docker می تواند با سیستم یکپارچه شده برای جلوگیری از دسترسی به خدمات زودرس استفاده شود. [FLT 31] با یک اسکریپت که نقطه پایان سلامت را بررسی می کند:
ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30
اسکریپت باید تنها زمانی که ظرف سالم است، از 0 خارج شود.اگر شکست بخورد، سیستم واحد را شکست می دهد.
محدودیت های منابع از طریق Systemd
شما می توانید CPU و حافظه یک ظرف را در سطح گروه بدون پرچم منابع دوکر محدود کنید، این به ویژه هنگامی مفید است که چندین کانتینر را در یک میزبان واحد اجرا کنید:
[Service]
MemoryMax=512M
CPUQuota=50%
این تنظیمات یک محدودیت سخت ایجاد می کند که سیستم به طور مستقل از Docker اجرا می شود.
مدیریت چندین Container: Systemd vs. Docker Compose
برای تعداد کمی از ظروف (به عنوان مثال، ۲)، فایل های خدمات سیستم های فردی ساده و قابل نگهداری هستند، با این حال، هنگامی که یک پروژه شامل بسیاری از خدمات به هم پیوسته، Docker Compose راحت تر می شود، شما هنوز هم می توانید از سیستم برای تنظیم کل 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
این رویکرد به شما سادگی تکمیل خدمات را همراه با مدیریت چرخه عمر سیستم، یادآوری می کند که [FLT36] به دلیل خروج از FLT:37 بلافاصله استفاده می شود. [FLT 38] واحد را در حالت "فعال" نگه می دارد تا زمانی که FLT 39 نامیده می شود.
کدام روش را باید انتخاب کنید؟
- خدمات سیستم های فردی [FLT 1] - بهترین برای برنامه های میراث، خدمات با سفارش سخت استارت آپ، و یا زمانی که شما نیاز به محدودیت منابع هر گیر.
- Docker Compose با سیستم [FLT 1] - ایده آل برای میکروسرویس ها پشته که در آن وابستگی ها به صورت داخلی توسط Compose اداره می شوند، و شما می خواهید یک واحد واحد واحد برای مدیریت کل گروه.
عیب یابی مسائل مشترک
حتی با تنظیمات دقیق، ممکن است با مشکلات مواجه شوید.در زیر مشکلات مکرر و راه حل های آنها وجود دارد.
سرویس شکست خورده با "نمی تواند به Docker daemon متصل شود"
این کار معمولاً به این معنی است که سرویس قبل از آماده شدن دوکر شروع می شود و اطمینان حاصل می کند که واحد شما دارای (FLT:40) و است.
Container Restarts در یک حلقه
اگر در این هنگام، به صورت مستقیم از آن خارج شود، به طور مستقیم آن را با توجه به و باز گرداند و چک کنید. [۳]
سرویس ها به صورت شفاف متوقف نمی شوند
در این صورت، یک جفت از آن ها به صورت نادرستی از آن استفاده می کنند و به صورت مستقیم از آن استفاده می کنند.
متغیرهای محیطی که بارگذاری نشده اند
اگر از [FLT51] استفاده می کنید، فایل موجود را تأیید کنید و با ریشه قابل خواندن است.از نقل قول های فایل اجتناب کنید - نقل قول های نوار سیستم شده از مقادیر متغیر.برای تزریق مخفی، استفاده از اعتبار سیستم یا یک مدیر مخفی اختصاصی را در نظر بگیرید.
ملاحظات امنیتی
اجرای ظروف Docker از طریق سیستم، چند نکته امنیتی را ایجاد می کند:
- همیشه سرویس سیستم را به عنوان کاربر غیر ریشه در صورت امکان اجرا کنید (از و دستورالعمل ها استفاده کنید، اما اطمینان حاصل کنید که کاربر به سوکت Docker دسترسی دارد یا در حالت ریشه ای اجرا می شود).
- از استفاده از در واحدهای سیستم، مگر اینکه کاملاً ضروری باشد، خودداری کنید.
- استفاده از لوله های تک نفره ( هر زمان که ظرف برای نوشتن به میزبان نیاز ندارد.
- و از این رو، از سیستم استفاده می کنند و در برابر فرارها، واحد را سخت می کنند.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser
منابع خارجی
برای مطالعه بیشتر، با این ارجاعات رسمی مشورت کنید:
- [[ویرایش] [۱] [۱۰] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۳] [۳] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱]
- [[ویرایش] [۱] [۱۰] [۱] [۱] [۱] [۱۰] [۱] [۱] [۱] [۱] [۱] [۲]] [۱] [۲] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۳] [۱] [۱] [۳] [۱] [۱] [۱] [۳] [۳] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۱] [۳] [۳] [۳] [۱] [۲] [۱] [۱
- [در این باره] [[[ویرایش] [۱]
نتیجه گیری
یکپارچه سازی سیستم با دوکر ظروف به شما یک مکانیسم استارت آپ قوی و خودکار می دهد که یکپارچه با بقیه سیستم لینوکس شما ادغام می شود.با نوشتن فایل های واحد خدمات به خوبی ساختار یافته، شما می توانید سفارش استارت آپ، مدیریت وابستگی ها، تنظیم محدودیت منابع و نظارت بر لاگین با استفاده از ابزار تیم عملیاتی خود را در حال حاضر می داند که آیا شما انتخاب خدمات فردی برای هر ظرف یا یک واحد واحد واحد واحد برای تنظیم سیستم انباشته سازی، پیش بینی و پیش بینی محیط های تولید است.
با یک فایل واحد ساده شروع کنید، آن را به طور کامل تست کنید، سپس لایه ای بر گزینه های پیشرفته مانند فایل های محیطی، چک های بهداشتی و سخت شدن امنیتی را با این روش، ظروف Docker شما دوباره زنده می مانند، تصادف و تغییرات پیکربندی بدون دخالت دستی، آزاد کردن تیم خود را به تمرکز بر ساخت برنامه ها.