کانتینرهای سرور ویندوز. چگونه یک برنامه را در ظرف Docker بسته بندی کنیم؟ اجرای کانتینرها را متوقف کنید

مطالعه فناوری کانتینر
ویندوز سرور 2016

یکی از ویژگی های جدید قابل توجه معرفی شده در ویندوز سرور 2016 پشتیبانی از کانتینرها است. بیایید او را بهتر بشناسیم

سیستم های مدرن مدت هاست که از اصل یک سیستم عامل - یک سرور دور شده اند. فناوری‌های مجازی‌سازی استفاده کارآمدتر از منابع سرور را ممکن می‌سازد و به شما امکان می‌دهد چندین سیستم عامل را اجرا کنید، آنها را بین خود تقسیم کنید و مدیریت را ساده‌تر کنید. سپس میکروسرویس‌ها ظاهر شدند و به برنامه‌های مجزا اجازه می‌دادند به‌عنوان یک جزء مجزا، به راحتی مدیریت و مقیاس‌پذیر به کار گرفته شوند. داکر همه چیز را تغییر داد. روند ارائه یک برنامه همراه با محیط آنقدر ساده شده است که نمی تواند برای کاربر نهایی جالب باشد. برنامه داخل کانتینر طوری کار می کند که گویی از یک سیستم عامل کامل استفاده می کند. اما بر خلاف ماشین های مجازی، آنها کپی های خود را از سیستم عامل، کتابخانه ها، فایل های سیستم و غیره بارگذاری نمی کنند. کانتینرها یک فضای نام مجزا دریافت می کنند که در آن برنامه به تمام منابع لازم دسترسی دارد، اما نمی تواند فراتر از آنها برود. اگر نیاز به تغییر تنظیمات دارید، فقط تفاوت‌ها با سیستم‌عامل اصلی ذخیره می‌شوند. بنابراین، کانتینر بر خلاف ماشین های مجازی، خیلی سریع راه اندازی می شود و بار کمتری به سیستم وارد می کند. کانتینرها به طور موثرتری از منابع سرور استفاده می کنند.

ظروف در ویندوز

در ویندوز سرور 2016، علاوه بر فناوری‌های مجازی‌سازی موجود - اپلیکیشن‌های مجازی Hyper-V و Server App-V، پشتیبانی از کانتینرهای Windows Server Containers اضافه شده است که از طریق لایه انتزاعی پشته Container Management که تمام عملکردهای لازم را پیاده‌سازی می‌کند، پیاده‌سازی شده است. این فناوری در پیش‌نمایش فنی 4 معرفی شد، اما از آن زمان تاکنون چیزهای زیادی در جهت ساده‌سازی تغییر کرده است و حتی نیازی به خواندن دستورالعمل‌های نوشته شده قبلی ندارید. در همان زمان، دو نوع ظروف "آنها" پیشنهاد شد - ظروف ویندوز و ظروف Hyper-V. و احتمالاً یکی دیگر از فرصت های اصلی استفاده از ابزارهای Docker علاوه بر cmdlet های PowerShell برای مدیریت کانتینرها است.

کانتینرهای ویندوز در اصل شبیه FreeBSD Jail یا Linux OpenVZ هستند؛ آنها از یک هسته با سیستم عامل استفاده می کنند که به همراه منابع دیگر (رم، شبکه) بین خودشان به اشتراک گذاشته می شود. فایل های سیستم عامل و سرویس در فضای نام هر کانتینر پیش بینی می شوند. این نوع کانتینر از منابع به نحو احسن استفاده می‌کند و سربار را کاهش می‌دهد و بنابراین به برنامه‌ها اجازه می‌دهد متراکم‌تر قرار بگیرند. از آنجایی که تصاویر کانتینر پایه "دارای" همان هسته گره هستند، نسخه های آنها باید مطابقت داشته باشند، در غیر این صورت عملکرد تضمین نمی شود.

کانتینرهای Hyper-V از سطح ایزوله اضافی استفاده می کنند و هر کانتینر هسته و حافظه خود را به خود اختصاص می دهد. جداسازی، بر خلاف نوع قبلی، نه توسط هسته سیستم عامل، بلکه توسط Hyper-V Hyper-V انجام می شود (نقش Hyper-V مورد نیاز است). نتیجه سربار کمتری نسبت به ماشین‌های مجازی است، اما انزوا بیشتر از کانتینرهای ویندوز است. در این حالت، برای اجرای کانتینر، همان هسته سیستم عامل را داشته باشید. این کانتینرها همچنین می توانند در Windows 10 Pro/Enterprise مستقر شوند. به ویژه شایان ذکر است که نوع کانتینر در حین ایجاد انتخاب نمی شود، بلکه در هنگام استقرار انتخاب می شود. یعنی هر کانتینری را می توان هم به عنوان ویندوز و هم به عنوان نسخه Hyper-V راه اندازی کرد.

این کانتینر از هسته سرور یا نانو سرور کوتاه شده به عنوان سیستم عامل استفاده می کند. اولین مورد در Windows Sever 2008 ظاهر شد و سازگاری بیشتری با برنامه های موجود فراهم می کند. دومی در مقایسه با Server Core کمتر است و برای کار بدون مانیتور طراحی شده است و به شما امکان می دهد سرور را در حداقل پیکربندی ممکن برای استفاده با Hyper-V اجرا کنید. سرور فایل(SOFS) و خدمات ابری که به 93 درصد فضای کمتر نیاز دارند. فقط شامل ضروری ترین مؤلفه ها است (Net with CoreCLR، Hyper-V، Clustering، و غیره).

فرمت تصویر هارد دیسک VHDX برای ذخیره سازی استفاده می شود. کانتینرها، مانند مورد Docker، در تصاویر در مخزن ذخیره می شوند. علاوه بر این، هر کدام مجموعه کاملی از داده ها را ذخیره نمی کند، بلکه فقط تفاوت بین تصویر ایجاد شده و تصویر پایه را ذخیره می کند. و در لحظه راه اندازی، تمام داده های لازم به حافظه نمایش داده می شود. سوئیچ مجازی برای مدیریت ترافیک شبکه بین کانتینر و شبکه فیزیکی استفاده می شود.

کانتینرها در Microsoft Windows Server 2016 توسعه قابلیت های این فناوری برای مشتریان هستند. مایکروسافت توسعه مشتری، استقرار و میزبانی برنامه های کاربردی در کانتینرها را به عنوان بخشی از فرآیندهای توسعه برنامه ریزی می کند.

از آنجایی که سرعت استقرار برنامه به سرعت ادامه می یابد و مشتریان از استقرار نسخه برنامه به صورت روزانه یا حتی ساعتی استفاده می کنند، توانایی استقرار سریع برنامه های تأیید شده از صفحه کلید توسعه دهنده تا تولید برای موفقیت تجاری بسیار مهم است. این فرآیند توسط ظروف تسریع می شود.

در حالی که ماشین‌های مجازی وظیفه انتقال برنامه‌های کاربردی در مراکز داده و به ابر و فراتر از آن را دارند، منابع مجازی‌سازی بیشتر توسط کانتینرهایی با استفاده از مجازی‌سازی سیستم‌عامل (نرم‌افزار سیستم) باز می‌شوند. این راه حل، به لطف مجازی سازی، امکان تحویل سریع برنامه ها را فراهم می کند.

فناوری Windows Container شامل دو نوع مختلف کانتینر، Windows Server Container و Hyper-V Container است. هر دو نوع کانتینر ایجاد، مدیریت و عملکرد یکسانی دارند. آنها حتی همان تصویر ظرف را تولید و مصرف می کنند. آنها در سطح ایزوله ایجاد شده بین کانتینر، سیستم عامل میزبان و سایر کانتینرهای در حال اجرا بر روی میزبان با یکدیگر تفاوت دارند.

کانتینرهای سرور ویندوز: چندین نمونه کانتینر می توانند به طور همزمان روی یک میزبان اجرا شوند که جداسازی از طریق فضای نام، مدیریت منابع و فناوری های جداسازی فرآیند ارائه می شود. کانتینرهای سرور ویندوز همان هسته واقع در هاست را دارند.

کانتینرهای Hyper-V: چندین نمونه کانتینر می توانند به طور همزمان روی یک میزبان اجرا شوند. با این حال، هر کانتینر در داخل یک ماشین مجازی اختصاصی پیاده سازی می شود. این یک جداسازی در سطح هسته بین هر کانتینر Hyper-V و کانتینر میزبان را فراهم می کند.

مایکروسافت در ویژگی کانتینر مجموعه ای از ابزارهای Docker را برای مدیریت نه تنها کانتینرهای لینوکس، بلکه کانتینرهای Windows Server و Hyper-V گنجانده است. به عنوان بخشی از همکاری در جوامع لینوکس و ویندوز، تجربه Docker با ایجاد ماژول PowerShell برای Docker، که اکنون منبع باز برای آن است، گسترش یافت. ماژول PowerShell می تواند کانتینرهای لینوکس و ویندوز سرور را به صورت محلی یا از راه دور با استفاده از فناوری Docker REST API مدیریت کند. توسعه دهندگان از نوآوری برای مشتریان با استفاده از باز راضی هستند کد منبعبرای توسعه پلت فرم ما در آینده قصد داریم فناوری هایی را همراه با نوآوری هایی مانند Hyper-V برای مشتریان خود بیاوریم.

خرید ویندوز سرور 2016

پیشنهاد ما به شما خرید ویندوز سرور 2016 با تخفیف از شریک رسمی مایکروسافت در روسیه - شرکت DATASYSTEMS است. با تماس با کارشناسان پشتیبانی فنی ما، فرصت دریافت مشاوره و همچنین دانلود رایگان ویندوز سرور 2016 را برای آزمایش خواهید داشت. قیمت ویندوز سرور 2016 در صورت درخواست. شما می توانید در صورت درخواست از طریق ایمیل، یک پیشنهاد تجاری برای مشارکت در خرید ویندوز سرور 2016 دریافت کنید:

اگر به روندهای مدرن در دنیای فناوری اطلاعات علاقه مند هستید، احتمالاً در مورد Docker شنیده اید. به طور خلاصه: این فناوری به شما امکان می دهد کانتینرهایی را با برنامه های نصب شده در جعبه سند خود اجرا کنید (نه، این مجازی سازی نیست). شما می توانید جزئیات بیشتر را بخوانید، به عنوان مثال، در Habré. یعنی ما می توانیم به سرعت یک کانتینر با نسخه مورد نیاز سرور 1C جمع آوری و راه اندازی کنیم. Docker به طور گسترده در لینوکس استفاده می شود و حتی می توانید کانتینرهای آماده را در docker.hub پیدا کنید، اما 1c بیشتر در ویندوز زندگی می کند.

این برای چیست؟

سریع و آسان برای استقرار. ما می توانیم با دو تیم یک محیط کاری آماده کنیم. محیط آماده ما همیشه در وضعیت مورد انتظار است. هنگام نصب هیچ رقصی با تنبور وجود ندارد.

نصب چندین نسخه از سرور 1C و راه اندازی مورد دلخواه.

بسیاری از ناخواسته ها روی سرور نصب نمی شوند

در این مقاله به شما نشان خواهم داد که چگونه خودتان یک کانتینر را با یک سرور 1C مونتاژ کنید.

الزامات سیستم عامل :

ویژگی Windows Container فقط در Windows Server Build 1709، Windows Server 2016، Windows 10 Professional و Windows 10 Enterprise (Anniversary Edition) موجود است.

الزامات سخت افزاری :

پردازنده باید مجازی سازی را پشتیبانی کند

نصب Docker

ویندوز سرور 2016

powershell را به عنوان مدیر باز کنید و دستورات زیر را اجرا کنید:

Install-Module DockerMsftProvider -Force Install-Package Docker -ProviderName DockerMsftProvider -Force (Install-WindowsFeature Containers). Restart Needed

اگر "بله" بعد از آخرین دستور روی صفحه ظاهر شد، باید کامپیوتر را مجددا راه اندازی کنید.

ویندوز 10

اینجا کمی راحت تر است. نصب کننده را از وب سایت رسمی دانلود کنید download.docker.comو راه اندازی شود. هنگام نصب، کادر کنار کانتینرهای ویندوز را علامت بزنید

راه اندازی

برای راه اندازی محیط خود، باید 2 کانتینر راه اندازی کنیم: یک پایگاه داده و یک سرور 1C. البته می توانید از سرور موجود خود استفاده کنید.

پایگاه داده

ما آن را روی MSSQL اجرا خواهیم کرد. مایکروسافت قبلاً ظرف لازم را با توصیف همراه با جزئیات. پیوند به docker.hub

ما آن را با یک دستور در powershell به عنوان مدیر نصب می کنیم. خط نیاز به تعویض دارد به رمز عبور ما

-e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

بیایید به این دستور نگاه کنیم:

docker run - یک کانتینر را در حافظه محلی اجرا می کند. اگر وجود ندارد، آن را از مخزن دانلود کنید.

د - ظرف در پس زمینه اجرا می شود. در غیر این صورت به کنسول پاورچل کانتینر منتقل خواهید شد

P - یک پورت از کانتینر به ماشین محلی فوروارد می کند.

ه - متغیرهایی که به کانتینر منتقل می شوند

به یک متغیر -e sa_password= شما باید رمز عبور کاربر SA خود را تنظیم کنید.

برای اتصال پایگاه های داده موجود، تیم خود را تکمیل خواهیم کرد.

ما باید پوشه را با پایگاه داده خود به کانتینر فوروارد کنیم

V DirectoryOnHost:DirectoryInContainer

پایگاه های داده از طریق متغیر attach_dbs به هم متصل می شوند

E attach_dbs="[("dbName":"Test","dbFiles":["C:\\db\\test.mdf"،"C:\\db\\test_log.ldf"])، ("dbName ":"HomeBuh"،"dbFiles":["C:\\db\\HomeBuh.mdf"،"C:\\db\\HomeBuh_log.ldf"])]"

docker run -d -p 1433:1433 -e sa_password= -e ACCEPT_EULA=Y -v C:/temp/:C:/temp/ -e attach_dbs="[("dbName":"SampleDb","dbFiles":["C:\\temp\\sampledb.mdf" "C:\\temp\\sampledb_log. ldf"])]" microsoft/mssql-server-windows-developer

سرور 1C

توجه! این تصویر فقط برای اهداف آزمایشی است.

برای اطمینان از اینکه اطلاعات مربوط به خوشه‌های ما در رایانه محلی ذخیره می‌شوند و می‌توانند به ظرف دیگری متصل شوند، اجازه دهید یک پوشه c:\srvinfo ایجاد کنیم.

بیایید دستور powershell را اجرا کنیم

Docker run -d -p 1541:1541 -p 1540:1540 -p 1560-1591:1560-1591 -v C:/srvinfo:C:/srvinfo lishniy/1c-windows

همه چیز آماده است. اینجاست که یک سورپرایز در انتظارم بود. من مدت زیادی است که از mssql در یک کانتینر روی یک ماشین آزمایشی استفاده می کنم و همیشه از طریق لوکال هاست به آن دسترسی داشته ام. حالا یا شکسته بود، یا ستاره ها در یک راستا قرار گرفتند، اما از کار افتاد. و می توانید دلیل آن را بخوانید. بنابراین در حالی که این مشکل در حال رفع است، یا کانتینر را به شبکه خود فوروارد می کنیم (هنگام راه اندازی کانتینر، میزبان --network را به جای دسته ای از پورت ها مشخص می کنیم)، یا IP های صادر شده در شبکه را تعیین می کنیم و به آنها متصل می شویم. . برای این کار باید دو دستور ساده را اجرا کنید. در مثالی که همراه با خروجی نشان خواهم داد

PS C:\WINDOWS\system32> docker container ls CONTAINER ID IMAGE Command CREATED STATUS PORTS NAMES 7bd5d26e9297 lishniy/1c-windows "powershell -Command..." 12 دقیقه قبل تا 10 دقیقه - 10-10:54 0.0. 1541/ tcp, 0.0.0.0:1560-1591->1560-1591/tcp gallant_perlman 696eb9b29a02 microsoft/mssql-server-windows-developer "powershell -Command.0th.0th.0min... 1433->1433 /tcp youthful_wing PS C:\WINDOWS\system32> داکر بازرسی -f "((محدوده .NetworkSettings.Networks))((.IPAddress))((پایان))" 696eb9b29a02 172.17.3WIND 172.17. \system32> docker inspect -f "((range.NetworkSettings.Networks))((.IPAddress))((پایان))" 7bd5d26e9297 172.17.92.255

دستور اول لیستی از کانتینرها را نمایش می دهد، دستور دوم آدرس IP کانتینر را با شناسه آن دریافت می کند.

بنابراین ما آدرس ها را داریم. حالا کنسول مدیریت را باز کنید و پایگاه داده ما را طبق معمول اضافه کنید.

اجرای کانتینرها را متوقف کنید

هنگام اجرای دستور

اجرای داکر...

ما همیشه یک ظرف جدید و تمیز بدون داده ایجاد می کنیم. برای دسترسی به لیست کانتینرهای از قبل ایجاد شده، فقط دستور را اجرا کنید

کانتینر داکر ls -a شناسه کانتینر فرمان تصویر ایجاد شده وضعیت نام‌های پورت‌ها 7bd5d26e9297 lishniy/1c-windows "powershell -Command..." 2 روز پیش خارج شد (1073807364) 43 ساعت قبل gallantdown-9msa6lman s-developer " powershell -Command…” 2 روز پیش خارج شد (1073807364) 4 دقیقه پیش youthful_wing

در آینده، می توانید ظروف آماده را راه اندازی یا متوقف کنید

شروع کانتینر داکر Container_ID توقف کانتینر داکر Container_ID راه اندازی مجدد کانتینر داکر Container_ID

همچنین یک برنامه رابط کاربری گرافیکی برای کنترل وجود دارد. به عنوان مثال kitematic

ساخت کانتینر داکر

استفاده از کانتینرهای آماده ساده و راحت است؛ در مورد پایگاه داده، می‌توانیم به GitHub برویم و نحوه مونتاژ آن را ببینیم. اگرچه برای ظروف بدون dockerfile در توضیحات، ما نمی‌توانیم با اطمینان بدانیم که چه چیزی داخل آن است.

بنابراین، این حداقل چیزی است که ما نیاز داریم

  1. نصب کننده 1C.
  2. dockerfile
  3. اسکریپت Powershell برای راه اندازی سرویس 1c. من از مخزن مایکروسافت استفاده کردم
  4. اسکریپت Powershell برای نصب و پیکربندی. اسمش رو گذاشتم آماده.ps1

با دو مورد اول همه چیز مشخص است. بیایید به ساخت dockerfile برویم.

dockerfile

این فایل یک فایل با مراحل ساخت کانتینر ما است.

اول، بیایید فقط سعی کنیم کانتینر خود را بسازیم و اجرا کنیم. برای انجام این کار، ما تمام فایل های خود را در یک دایرکتوری جمع آوری می کنیم. در آنجا یک dockerfile با محتویات زیر ایجاد می کنیم

FROM microsoft/windowsservercore SHELL ["powershell", "-Command", "$ErrorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue";"] WORKDIR / COPY ready.ps1 Wait-Service.ps1 1cEnt.zip.msi /RUN.\prepare.ps1; powershell.exe -Command Remove-Item ready.ps1 -Force CMD .\Wait-Service.ps1 -ServiceName "1C:Enterprise 8.3 Server Agent" -AllowServiceRestart

بیایید آن را با جزئیات تجزیه و تحلیل کنیم

از microsoft/windowsservercore

ظرفی را که به عنوان پایه می گیریم نشان می دهیم. این هسته سرور ویندوز است. به طور پیش فرض، تصویر با آخرین تگ گرفته می شود. می توانید آخرین نسخه را امتحان کنید، فضای بسیار کمتری را اشغال می کند. من از این یکی استفاده کردم، زیرا ظرف mssql روی آن ساخته شده است و در این مورد این قطعه دوباره دانلود نشد.

SHELL ["powershell"، "-Command"، "$ErrorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue";"]

به جای cmd، powershell را به عنوان خط فرمان مشخص کنید

WORKDIR / - دایرکتوری کاری را مشخص می کند
کپی - فایل ها را برای نصب کپی کنید
RUN - اسکریپت نصب را اجرا کنید
دستور CMD که پس از راه اندازی کانتینر راه اندازی می شود

یک فایل ready.ps1 بسازید. ما 1C را در آن نصب می کنیم و سرویس را پیکربندی می کنیم.

Msiexec /i "1CEnterprise 8.2.msi" /qr TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=0 THINCLIENT=1 WEBSERVERVERVEREXT=1 WEBSERVERVER70SER = 1 WEBSERVERVER0 POST = 1 WEBSERVERVER0S LANGUAGES =RU Remove-Item c:\sqlncli.msi -Force sc.exe config "1C:Enterprise 8.3 Server Agent" depend= "/"

به خط آخر دقت کنید. وابستگی های سرویس سرور شامل سرویس سرور است که در کانتینرها اجرا نمی شود. من نمی دانم چرا اضافه شده است، اما سرور 1C بدون آن به خوبی کار می کند. بنابراین، ما به سادگی آن را از وابستگی ها حذف می کنیم تا سرویس ما به درستی بارگیری شود.

حالا در پنجره powershell به پوشه حاوی فایل ها رفته و وارد شوید

داکر بیلد.

پس از اتمام ساخت، آن را اجرا کنید (در مورد شما، دو ستون اول خالی خواهند بود).

تصاویر داکر مخزن برچسب شناسه تصویر ایجاد شده اندازه lishniy/1c-windows جدیدترین dab800c94b09 3 روز پیش 11.6 گیگابایت داکر اجرا -d -p 1541:1541 -p 1540:1540 -p 1561:1509-1501-1560

پس از این عملیات، کانتینر ما کار خواهد کرد. اما تفاوت های ظریف کوچکی وجود دارد. ما نه می توانیم ورود به سیستم را فعال کنیم، نه می توانیم از اشکال زدایی در سرور استفاده کنیم و نه پورت ها را تغییر دهیم. بنابراین، اجازه دهید فایل docker خود را کمی تغییر دهیم

FROM microsoft/windowsservercore ENV regport=1541 \ port=1540 \ range="1560:1591" \ debug="N" \ log="N" SHELL ["powershell"، "-Command"، "$ErrorActionPreference = "Stop" $ProgressPreference = "SilentlyContinue";"] WORKDIR / COPY logcfg.xml start.ps1 ready.ps1 Wait-Service.ps1 1cEnt.exe sqlncli.msi ./ RUN .\prepare.ps1; powershell.exe -Command Remove-Item ready.ps1 -Force CMD .\start.ps1 -regport $env:regport -port $env:port -range $env:range -debug $env:debug -servpath "C:\srvinfo " -log $env:log -Verbose

ENV regport=1541 \ port=1540 \ range="1560:1591" \ debug="N" \ log="N"

اکنون از یک اسکریپت به عنوان نقطه راه‌اندازی استفاده می‌شود که در آن می‌توانیم پورت‌ها را تنظیم کنیم، اشکال‌زدایی و ورود به سیستم را فعال کنیم و مسیر ذخیره اطلاعات در مورد خوشه‌ها را مشخص کنیم.

شما می توانید اسکریپت خود را بنویسید یا از اسکریپت آماده در برنامه استفاده کنید.

چگونه یک برنامه را در ظرف Docker بسته بندی کنیم؟

من برنامه ای دارم که با NodeJS نوشته شده است. چگونه می توانم آن را در یک تصویر Docker بسته بندی کنم تا به عنوان یک کانتینر اجرا شود؟

Docker یک سیستم مدیریت کانتینر برای سیستم عامل های سازگار با POSIX است (در حال حاضر توسط لینوکس پشتیبانی می شود). ویژگی خاص Docker این است که یک برنامه را با تمام محیط های لازم بسته بندی می کند به گونه ای که می توان آن را روی سیستم دیگری بدون مراحل طولانی و پیچیده برای نصب وابستگی ها یا ساختن از منابع اجرا کرد. یک برنامه بسته بندی شده آماده برای استقرار "تصویر" نامیده می شود. تصاویر Docker بر اساس "الگوها" - محیط های کاری از پیش پیکربندی شده است. شما می توانید اینها را به عنوان توزیع های سیستم عامل در نظر بگیرید، اگرچه این کاملاً درست نیست. همچنین می توانید با بررسی مستندات Docker الگوی خود را ایجاد کنید. مزیت این روش این است که تصویر برنامه شما فقط شامل خود برنامه خواهد بود و محیط مورد نیاز برای آن به طور خودکار از مخزن قالب دانلود می شود. Docker کمی یادآور chroot یا bsd jail است، اما متفاوت عمل می کند.

تمایز بین مفاهیم "ظرف" و "تصویر" مهم است. کانتینر یک کپی در حال اجرا از برنامه شما است و تصویر فایلی است که برنامه در آن ذخیره شده است و ظرف از آن ساخته شده است.

فرض کنید یک برنامه NodeJS دارید که می‌خواهید آن را کانتینری کنید. فرض کنید فایلی که برنامه شما را اجرا می کند server.js نام دارد و برنامه به پورت 8000 گوش می دهد تا کار کند. ما از "node:carbon" به عنوان یک الگو استفاده خواهیم کرد. برای کانتینری کردن برنامه خود، باید یک فایل "Dockerfile" در فهرستی که فایل های برنامه شما در آن قرار دارد ایجاد کنید، که پارامترهای آماده سازی تصویر را شرح می دهد:

$ Dockerfile را لمس کنید

محتویات فایل ممکن است چیزی شبیه به این باشد:

# الگو را برای استفاده از FROM node:carbon تعیین کنید # دایرکتوری کاری برنامه را در داخل ظرف ایجاد کنید WORKDIR /usr/src/app # وابستگی های برنامه را با استفاده از npm نصب کنید # هر دو فایل package.json و package-lock.json کپی می شوند، در صورت وجود COPY بسته*. json ./ RUN npm install # فایل های برنامه خود را در تصویر کپی کنید. . # پورت 8000 را باز کنید تا از خارج از کانتینر EXPOSE 8000 قابل دسترسی باشد # دستور اجرای برنامه را در داخل کانتینر CMD اجرا کنید [ "npm"، "start" ]

برای حذف فایل های غیر ضروری از تصویر، می توانید نام آنها را در یک فایل ".dockerignore" فهرست کنید. می توانید از ماسک (*.log) استفاده کنید.

تصویر با دستور زیر ساخته شده است:

$ docker build -t username/node-web-app .

$ تصاویر داکر # نمونه شناسه تگ مخزن CREATED node carbon 1934b0b038d1 5 روز پیش نام کاربری/node-web-app آخرین d64d3505b0d2 1 دقیقه پیش

ظرف با استفاده از دستور زیر از تصویر راه اندازی می شود:

$ docker run -p 49160:8000 -d username/node-web-app

این مثال یک محفظه از تصویر "username/node-web-app" ایجاد می کند و بلافاصله آن را اجرا می کند. پورت برنامه 8000 بر روی ماشین محلی (localhost) موجود است و برای اینکه "خارج" در دسترس باشد، به پورت 49160 "Forward" می شود. می توانید هر پورت رایگان را انتخاب کنید، علاوه بر این، امکان فوروارد برنامه وجود دارد. با مشخص کردن گزینه "-p 8000:8000" به صورت "as is" پورت کنید.

با وارد کردن دستور می توانید مشاهده کنید که کانتینر شما در حال اجرا است:

$ docker ps # شناسه مثال دستور تصویر ... پورت ها ecce33b30ebf نام کاربری/node-web-app:جدیدترین شروع npm ... 49160->8000

یک کانتینر را می توان با استفاده از دستورات مختلف با تعیین شناسه این کانتینر مدیریت کرد:

$ docker pause ecce33b30ebf - مکث ظرف با شناسه ecce33b30ebf
$ docker resume ecce33b30ebf - از سرگیری کانتینر با شناسه ecce33b30ebf
$ docker stop ecce33b30ebf - کانتینر توقف با شناسه ecce33b30ebf
$ docker rm ecce33b30ebf - محفظه را حذف کنید (با این کار تمام داده های ایجاد شده توسط برنامه در داخل ظرف حذف می شود)

*سیستم‌های nix در ابتدا چندوظیفگی را پیاده‌سازی می‌کنند و ابزارهایی را ارائه می‌دهند که به شما امکان می‌دهد فرآیندها را جداسازی و کنترل کنید. فناوری هایی مانند chroot() که ایزوله سازی را در سطح سیستم فایل فراهم می کند، زندان FreeBSD که دسترسی به ساختارهای هسته، LXC و OpenVZ را محدود می کند، مدت هاست شناخته شده و به طور گسترده مورد استفاده قرار می گیرد. اما انگیزه توسعه فناوری Docker بود که امکان توزیع راحت برنامه ها را فراهم کرد. الان هم همین مورد برای ویندوز آمده است.

ظروف در ویندوز

سرورهای مدرن دارای ظرفیت مازاد هستند و گاهی اوقات اپلیکیشن ها حتی از بخشی از آنها استفاده نمی کنند. در نتیجه، سیستم ها برای مدتی بیکار می مانند و هوا را گرم می کنند. راه حل مجازی سازی بود که به شما امکان می دهد چندین سیستم عامل را روی یک سرور اجرا کنید و تضمین کنید که آنها را بین خود جدا کنید و مقدار مورد نیاز منابع را به هر کدام اختصاص دهید. اما پیشرفت ثابت نمی ماند. مرحله بعدی میکروسرویس ها است، زمانی که هر قسمت از برنامه به طور جداگانه به عنوان یک جزء خودکفا مستقر می شود که به راحتی می تواند به بار مورد نیاز مقیاس شود و به روز شود. جداسازی از تداخل سایر برنامه ها با میکروسرویس جلوگیری می کند. با ظهور پروژه داکر، که فرآیند بسته بندی و ارائه برنامه ها را به همراه محیط زیست ساده کرد، معماری میکروسرویس ها انگیزه بیشتری در توسعه یافت.

Container ها نوع دیگری از مجازی سازی هستند که محیط مجزایی را برای اجرای برنامه ها فراهم می کنند که مجازی سازی OS نامیده می شود. کانتینرها از طریق استفاده از یک فضای نام مجزا پیاده سازی می شوند که شامل تمام منابع لازم برای عملیات (نام های مجازی) می شود که می توانید با آنها تعامل داشته باشید (فایل ها، پورت های شبکه، فرآیندها و غیره) و نمی توانید آنها را ترک کنید. یعنی سیستم عامل ظرف را فقط آنچه اختصاص داده شده را نشان می دهد. برنامه داخل کانتینر معتقد است که تنها برنامه است و در یک سیستم عامل کامل بدون هیچ محدودیتی اجرا می شود. در صورت نیاز به تغییر یک فایل موجود یا ایجاد یک فایل جدید، کانتینر کپی هایی را از سیستم عامل میزبان اصلی دریافت می کند و تنها بخش های تغییر یافته را ذخیره می کند. بنابراین، استقرار چندین کانتینر روی یک میزبان بسیار کارآمد است.

تفاوت بین کانتینرها و ماشین های مجازی این است که کانتینرها کپی های خود را از سیستم عامل، کتابخانه ها، فایل های سیستم و غیره بارگذاری نمی کنند. سیستم عاملگویی با ظرف به اشتراک گذاشته شده است. تنها چیز اضافی مورد نیاز منابع مورد نیاز برای اجرای برنامه در کانتینر است. در نتیجه ظرف در عرض چند ثانیه راه اندازی می شود و سیستم را کمتر از زمانی که از ماشین های مجازی استفاده می کنید بارگیری می کند. داکر در حال حاضر 180 هزار برنامه را در مخزن ارائه می دهد و قالب توسط Open Container Initiative (OCI) یکسان شده است. اما وابستگی به هسته به این معنی است که کانتینرها روی سیستم عامل دیگری کار نخواهند کرد. کانتینرهای لینوکس به API لینوکس نیاز دارند، بنابراین ویندوز روی لینوکس کار نخواهد کرد.

تا همین اواخر، توسعه دهندگان ویندوز دو فناوری مجازی سازی را ارائه می کردند: ماشین های مجازی و برنامه های مجازی Server App-V. هر کدام کاربرد خاص خود را دارند، مزایا و معایب خود را دارند. اکنون دامنه گسترده تر شده است - کانتینرها در ویندوز سرور 2016 اعلام شده اند. و اگرچه در زمان TP4 توسعه هنوز تکمیل نشده بود، در حال حاضر کاملاً امکان پذیر است تکنولوژی جدیددر عمل و نتیجه گیری لازم به ذکر است که توسعه دهندگان MS با عقب افتادن و در اختیار داشتن فناوری های آماده، در برخی مسائل کمی جلوتر رفتند تا استفاده از کانتینرها آسان تر و جهانی تر شود. تفاوت اصلی این است که دو نوع کانتینر ارائه می شود: کانتینرهای ویندوز و کانتینرهای Hyper-V. در TP3 فقط اولین ها موجود بودند.

کانتینرهای ویندوز از یک هسته با سیستم عامل استفاده می کنند که به صورت پویا بین خودشان به اشتراک گذاشته می شود. فرآیند توزیع (CPU، RAM، شبکه) توسط سیستم عامل انجام می شود. در صورت لزوم، می توانید حداکثر منابع موجود را که به کانتینر اختصاص داده شده است محدود کنید. فایل های سیستم عامل و سرویس های در حال اجرا به فضای نام هر ظرف نگاشت می شوند. این نوع کانتینر از منابع به نحو احسن استفاده می‌کند و سربار را کاهش می‌دهد و بنابراین به برنامه‌ها اجازه می‌دهد متراکم‌تر قرار بگیرند. این حالت تا حدودی یادآور زندان FreeBSD یا Linux OpenVZ است.

ظروف Hyper-V با استفاده از Hyper-V سطح بیشتری از ایزوله را فراهم می کنند. به هر ظرف هسته و حافظه اختصاص داده شده است؛ جداسازی نه توسط هسته سیستم عامل، بلکه توسط Hyper-V انجام می شود. نتیجه همان سطح ایزوله ماشین های مجازی است، با سربار کمتر از ماشین های مجازی، اما سربار بیشتر از کانتینرهای ویندوز. برای استفاده از این نوع کانتینر باید نقش Hyper-V را روی هاست نصب کنید. کانتینرهای ویندوز برای استفاده در یک محیط قابل اعتماد مناسب تر هستند، مانند زمانی که برنامه های کاربردی از همان سازمان روی سرور اجرا می شوند. هنگامی که یک سرور توسط چندین شرکت استفاده می شود و سطح بیشتری از انزوا مورد نیاز است، کانتینرهای Hyper-V احتمالا منطقی تر خواهند بود.

یکی از ویژگی های مهم کانتینرها در Win 2016 این است که نوع آن نه در زمان ایجاد، بلکه در زمان استقرار انتخاب می شود. یعنی هر کانتینری را می توان هم به عنوان ویندوز و هم به صورت Hyper-V راه اندازی کرد.

در Win 2016، لایه انتزاعی پشته Container Management که تمام توابع لازم را پیاده سازی می کند، مسئولیت کانتینرها را بر عهده دارد. فرمت تصویر هارد دیسک VHDX برای ذخیره سازی استفاده می شود. کانتینرها، مانند مورد Docker، در تصاویر در مخزن ذخیره می شوند. علاوه بر این، هر یک مجموعه کاملی از داده ها را ذخیره نمی کند، بلکه تنها تفاوت بین تصویر ایجاد شده و تصویر پایه را ذخیره می کند و در زمان راه اندازی، تمام داده های لازم به حافظه نمایش داده می شود. یک سوئیچ مجازی برای مدیریت ترافیک شبکه بین کانتینر و شبکه فیزیکی استفاده می شود.

Server Core یا Nano Server را می توان به عنوان سیستم عامل در ظرف استفاده کرد. اولی، به طور کلی، برای مدت طولانی جدید نیست و فراهم می کند سطح بالاسازگاری با برنامه های موجود نسخه دوم حتی یک نسخه ساده تر برای کار بدون مانیتور است که به شما امکان می دهد سرور را در حداقل پیکربندی ممکن برای استفاده با Hyper-V، فایل سرور (SOFS) و سرویس های ابری اجرا کنید. البته رابط گرافیکی ندارد. فقط شامل ضروری ترین مؤلفه ها (.NET با CoreCLR، Hyper-V، Clustering، و غیره) است. اما در نهایت 93٪ فضای کمتری را اشغال می کند و نیاز به رفع بحرانی کمتری دارد.

بیشتر نکته جالب. برای مدیریت کانتینرها، علاوه بر PowerShell سنتی، می توانید از Docker نیز استفاده کنید. و برای ارائه توانایی اجرای ابزارهای غیربومی در Win، MS برای گسترش Docker API و جعبه ابزار شریک شده است. همه پیشرفت‌ها در GitHub رسمی پروژه Docker باز و در دسترس هستند. دستورات مدیریت داکر برای همه کانتینرها، اعم از Win و Linux اعمال می شود. اگرچه، البته، اجرای یک کانتینر ایجاد شده در لینوکس در ویندوز غیرممکن است (و همچنین بالعکس). در حال حاضر، PowerShell از نظر عملکرد محدود است و فقط به شما امکان می دهد با یک مخزن محلی کار کنید.

ظروف نصب

Azure دارای تصویر Windows Server 2016 Core with Containers Tech Preview 4 است که می توانید آن را مستقر کرده و برای کاوش کانتینرها از آن استفاده کنید. در غیر این صورت، شما باید همه چیز را خودتان پیکربندی کنید. برای نصب محلی به Win 2016 نیاز دارید و از آنجایی که Hyper-V در Win 2016 از مجازی سازی تودرتو پشتیبانی می کند، می تواند یک سرور فیزیکی یا مجازی باشد. فرآیند نصب کامپوننت خود استاندارد است. مورد مناسب را در Add Roles and Features Wizard انتخاب کنید یا با استفاده از PowerShell فرمان را صادر کنید

PS> Install-WindowsFeature Containers

در طول فرآیند، کنترل‌کننده شبکه سوئیچ مجازی نیز نصب می‌شود؛ باید فوراً پیکربندی شود، در غیر این صورت اقدامات بعدی باعث ایجاد خطا می‌شود. بیایید به نام آداپتورهای شبکه نگاه کنیم:

PS> Get-NetAdapter

برای کار به یک کنترلر با نوع External نیاز داریم. cmdlet New-VMSwitch دارای پارامترهای زیادی است، اما به خاطر این مثال، به حداقل تنظیمات اکتفا می کنیم:

PS> New-VMSwitch -Name External -NetAdapterName Ethernet0

بررسی می کنیم:

PS> Get-VMSwitch | کجا ($_.SwitchType –eq "External")

فایروال ویندوز اتصالات به کانتینر را مسدود می کند. بنابراین، لازم است یک قانون مجاز ایجاد کنیم، حداقل برای اینکه بتوانیم از راه دور با استفاده از راه دور PowerShell متصل شویم؛ برای این کار TCP/80 را مجاز می‌کنیم و یک قانون NAT ایجاد می‌کنیم:

PS> New-NetFirewallRule -Name "TCP80" -DisplayName "HTTP on TCP/80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True PS> Add-NetNatStaticMapping -NatName "ContainerNat.CP/80. -Protocol" آدرس IP داخلی 192.168.1.2 -InternalPort 80 -ExternalPort 80

گزینه دیگری برای استقرار ساده وجود دارد. توسعه دهندگان یک اسکریپت آماده کرده اند که به شما امکان می دهد تمام وابستگی ها را به طور خودکار نصب کنید و هاست را پیکربندی کنید. در صورت تمایل می توانید از آن استفاده کنید. پارامترهای داخل اسکریپت به شما کمک می کند تا تمام مکانیسم ها را درک کنید:

PS> https://aka.ms/tp4/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1 PS> C:\Install-ContainerHost.ps1

گزینه دیگری وجود دارد - استقرار یک ماشین مجازی آماده با پشتیبانی کانتینر. برای انجام این کار، یک اسکریپت روی همان منبع وجود دارد که به طور خودکار تمام عملیات لازم را انجام می دهد. دستورالعمل های دقیقلیست شده در MSDN اسکریپت را دانلود و اجرا کنید:

PS> wget -uri https://aka.ms/tp4/New-ContainerHost -OutFile c:\New-ContainerHost.ps1 PS> C:\New-ContainerHost.ps1 –VmName WinContainer -WindowsImage ServerDatacenterCore

نام را خودسرانه تنظیم می کنیم و -WindowsImage نوع تصویر جمع آوری شده را نشان می دهد. گزینه ها می توانند NanoServer، ServerDatacenter باشند. Docker نیز بلافاصله نصب می شود؛ پارامترهای SkipDocker و IncludeDocker مسئول عدم وجود یا وجود آن هستند. پس از راه اندازی، دانلود و تبدیل تصویر آغاز می شود، در طول فرآیند باید رمز عبور را برای ورود به VM مشخص کنید. خود فایل ISO بسیار بزرگ است، تقریباً 5 گیگابایت. اگر کانال کند است، فایل را می توان در رایانه دیگری دانلود کرد، سپس نام آن را به WindowsServerTP4 تغییر داد و در C:\Users\Public\Documents\Hyper-V\Virtual Hard Disk کپی کرد. ما می توانیم وارد ماشین مجازی نصب شده با مشخص کردن رمز عبور مشخص شده در هنگام اسمبلی شده و کار کنیم.

اکنون می توانید مستقیماً به استفاده از کانتینرها بروید.

استفاده از کانتینرها با PowerShell

ماژول Containers شامل 32 cmdlet PowerShell است که برخی از آنها هنوز ناقص هستند، اگرچه به طور کلی برای کار کردن همه چیز کافی است. فهرست کردن آسان است:

PS> کانتینرهای ماژول Get-Command

با استفاده از cmdlet Get-ContainerImage، containers - Get-Container می توانید لیستی از تصاویر موجود را دریافت کنید. در مورد یک کانتینر، ستون وضعیت وضعیت فعلی آن را نشان می دهد: متوقف یا در حال اجرا. اما در حالی که این فناوری در حال توسعه است، MS یک مخزن ارائه نکرده است، و همانطور که گفته شد، PowerShell در حال حاضر با یک مخزن محلی کار می کند، بنابراین برای آزمایش ها باید خودتان آن را ایجاد کنید.

بنابراین، ما یک سرور با پشتیبانی داریم، اکنون به خود کانتینرها نیاز داریم. برای انجام این کار، ارائه دهنده بسته ContainerProvider را نصب کنید.

ادامه فقط برای اعضا در دسترس است

گزینه 1. برای خواندن تمام مطالب موجود در سایت به انجمن "سایت" بپیوندید

عضویت در انجمن در مدت زمان مشخص شده به شما امکان دسترسی به تمام مطالب هکرها را می دهد، تخفیف تجمعی شخصی شما را افزایش می دهد و به شما امکان می دهد امتیاز حرفه ای Xakep را جمع آوری کنید!

اگر خطایی پیدا کردید، لطفاً یک متن را انتخاب کنید و Ctrl+Enter را فشار دهید.