Windows серверийн контейнерууд. Контейнертэй харьцъя. Windows дээрх контейнерууд

Дуусчихлаа! Залбирал эсвэл золиослол тусалсан, гэхдээ одоо та Windows дотор Docker контейнер ажиллуулах боломжтой. Windows Server 2016 хувилбар гарсантай зэрэгцэн сайхан мэдээ ирлээ. Мөн бид ямар нэгэн ухаалаг нуугдсан виртуал машин, эсвэл Линукс цөм дээрх Windows эмуляцийн тухай яриагүй байна - жинхэнэ Windows нь Dockerfile, docker-compose болон бусад Docker-той жинхэнэ Docker дээр ажилладаг. эд зүйлс.

Хязгаарлалт

Гэхдээ энэ нь та одоо ямар ч савыг хаана ч ажиллуулж болно гэсэн үг биш юм. Docker контейнерууд үйлдлийн системийн цөмийг өөрийн хостоос "зээлдэг" учир (эсвэл тэд өөрсдийн үйлдлийн системтэй болж, виртуал машин болж хувирах ёстой) Windows контейнеруудыг зөвхөн Windows 10 Pro Anniversary Update болон хамгийн сүүлийн хувилбар дээр ажиллуулж болно. Windows Server 2016.

Хоёрдахь зүйл бол Windows дээр эх Linux контейнер ажиллуулах боломжгүй хэвээр байна. Anniversary Update нь өөрийн гэсэн Линукс дэд системтэй (жишээ нь та жинхэнэ Bash ажиллуулж болно), гэхдээ энэ нь бүрэн хэмжээний Линуксийн цөмийг багтаадаггүй тул Windows дээрх Ubuntu-тай ижил контейнерт далд виртуал машин хэрэгтэй хэвээр байна.

Эцэст нь хэлэхэд, та Windows машин дээр хоёр контейнерийг нэгэн зэрэг ажиллуулж болно, гэхдээ бага зэрэг хүндрэлтэй. Хэрэв та энэ командыг Docker суулгасан Windows Server 2016 дээр ажиллуулбал (жилийн өмнө би үүнийг илбэ гэж нэрлэх байсан) ажиллах болно:

Гэхдээ хэрэв та энэ тушаалын дараа Ubuntu контейнер ажиллуулахыг оролдвол Docker гунигтай байх болно:

Асуудал нь Windows болон Линукс контейнеруудад өөр өөр Docker дэмонууд үйлчилдэг боловч тушаалын мөртэй холбогдохын тулд ижил сувгийг ашигладаг. Өөрөөр хэлбэл, ямар ч үед зөвхөн нэг чөтгөр идэвхтэй байж болно. Албан ёсны Docker вэб сайт дээр "Windows-д зориулсан Docker" бета хувилбар байгаа бөгөөд энэ нь асуудлыг шийдвэрлэхийг оролддог (одоохондоо зөвхөн Windows 10 Pro болон Enterprise дээр). Гэсэн хэдий ч Windows-ээс Линукс контейнер руу шилжихийн тулд та тохиргооны цэс рүү очих эсвэл тушаалын мөртэй холбогдох хэрэгтэй.

PowerShell

& "C:\Program Files\Docker\Docker\DockerCli.exe" -SwitchDaemon

& "C:\Program Files\Docker\Docker\DockerCli.exe"-SwitchDaemon

Windows дүрс

Одоохондоо савласан Windows-тэй хоёр үндсэн зураг байна:

Та өөрийн үндсэн дүр төрхийг (зураастай зураг) хийж чадахгүй.

Windows Server Core дүрс нь 10 гиг хүртэл жинтэй бөгөөд ерөнхийдөө бүрэн хэмжээний Windows Server 2016 шиг ажилладаг. Жишээлбэл, MS SQL болон бүрэн хэмжээний .NET Framework-ийг тэнд ямар ч асуудалгүйгээр суулгасан. Хэрэв таны програм UI-аас ихээхэн хамаардаггүй бол түүнийг суулгах болно.

Нано сервер нь арай илүү сонирхолтой юм. Энэ нь нэг тоглолтоос ч бага жинтэй, маш оновчтой, хуучирсан Windows Server юм. Гэхдээ бас хангалттай хязгаарлалтууд байдаг: 32 битийн програм байхгүй, UI, RDP, жижиглэсэн PowerShell гэх мэт. Гэхдээ энэ нь таныг ижил IIS, .NET Core, тэр ч байтугай зарим MySQL-г Нано сервер дээр суулгахад саад болохгүй.

Хэдэн жилийн өмнө Dockerfile дотроос "Microsoft", "Windows" болон "PowerShell"-ийг нэг дор олно гэж хэн төсөөлж байсан бэ?

microsoft/windowsservercore-аас powershell гүйлгэх -Тушаал....

microsoft/windowsservercore-аас

RUN powershell - Команд. . . .

Энэ бол Docker дахь Windows! Энэ нь утгагүй сонсогдож байна.

Тусгаарлалтын зэрэг

Windows контейнеруудыг тусгаарлах хоёр горимд ажиллуулж болно:

  • Windows серверийн савнууд
  • Hyper-V савнууд

Windows-ийн эхний горимд контейнерууд нь Docker дахь бусад бүх контейнертэй адил ажилладаг: тэдгээр нь үйлдлийн системтэй нийтлэг цөмийг хуваалцдаг, контейнерийн процессууд тусгаарлагдсан боловч хостын процессын модонд харагдах хэвээр байна гэх мэт. Энэ нь анхдагч бөгөөд хамгийн хурдан арга юм. Windows дээр контейнер эхлүүлэх.

Хоёр дахь тохиолдолд савнууд нь тусгай Hyper-V виртуал машинд ордог. Энэ нь мэдээжийн хэрэг эхлүүлэх хурдад муугаар нөлөөлдөг боловч тусгаарлалт бүрэн хийгдсэн.

Дүгнэлт

Docker дээрх Windows бол гайхалтай мэдээ юм. Хэдийгээр та бүтээгдэхүүнээ саванд хийх гэж яарахгүй байсан ч энэ нь таны нэгжийн туршилт, үйлдвэрлэлийн машин, демо сервер, хамгаалагдсан хязгаарлагдмал орчин гэх мэт өмнө нь виртуал машин үүсгэх шаардлагатай байсан бүх зүйлийг тусгаарлах гайхалтай хэрэгсэл юм. Хэрэв Майкрософт наносерверийг Линукс дээр ажиллуулж чадсан хэвээр байгаа бол би хоёр сарын өмнө ухаалаг бусаар худалдаж авсан Microsoft Band 2-ыг саяхан зогсоосноо уучлах болно.

Програмыг Docker контейнерт хэрхэн багцлах вэ?

Надад NodeJS дээр бичсэн програм байна. Би үүнийг контейнер хэлбэрээр ажиллуулахын тулд Docker дүрс рүү хэрхэн багцалж болох вэ?

Docker бол POSIX-д нийцсэн үйлдлийн системд зориулсан контейнер удирдлагын систем юм (одоогоор Линукс дэмждэг). Docker-ийн нэг онцлог шинж чанар нь програмыг шаардлагатай бүх орчинтой нь багцалж, хамаарлыг суулгах эсвэл эх сурвалжаас бүтээх урт, нарийн төвөгтэй процедургүйгээр өөр систем дээр ажиллуулах боломжтой юм. Байршуулахад бэлэн багцалсан программыг "зураг" гэж нэрлэдэг. Докерын зургууд нь "загварууд" дээр суурилдаг - урьдчилан тохируулсан ажлын орчин. Та эдгээрийг үйлдлийн системийн хуваарилалт гэж үзэж болно, гэхдээ энэ нь бүхэлдээ үнэн биш юм. Та мөн Docker-ийн баримт бичгийг шалгаж өөрийн загвараа үүсгэж болно. Энэ аргын давуу тал нь таны програмын зураг нь зөвхөн програмыг өөртөө агуулсан байх бөгөөд түүнд шаардлагатай орчин нь загварын агуулахаас автоматаар татагдах болно. Docker нь chroot эсвэл bsd шоронг бага зэрэг санагдуулдаг боловч өөрөөр ажилладаг.

"Сав" ба "дүрс" гэсэн ойлголтыг ялгах нь чухал юм. Контейнер нь таны програмын ажиллаж байгаа хуулбар бөгөөд зураг нь тухайн програмыг хадгалсан файл бөгөөд үүнээс контейнер үүсгэгддэг.

Танд агуулахыг хүссэн NodeJS програм байна гэж бодъё. Таны програмыг ажиллуулж байгаа файлыг server.js гэж нэрлэе гэж бодъё, програм нь ажиллахын тулд 8000 портыг сонсдог гэж бодъё. Програмаа хадгалахын тулд та өөрийн програмын файлууд байрлах директорт "Dockerfile" файл үүсгэх хэрэгтэй бөгөөд энэ нь зураг бэлтгэх параметрүүдийг тайлбарлах болно.

$ Docker файлд хүрнэ үү

Файлын агуулга нь дараах байдалтай байж болно.

# FROM node:carbon ашиглах загвараа зааж өгнө үү # WORKDIR /usr/src/app чингэлэг дотор програмын ажлын лавлах үүсгэх # npm ашиглан програмын хамаарлыг суулгана # package.json болон package-lock.json файлуудыг хоёуланг нь хуулна, хэрэв байгаа бол COPY багц*. json ./ RUN npm install # Програмын файлуудаа зураг руу хуулна уу COPY . . # 8000 портыг EXPOSE 8000 контейнерийн гаднаас ашиглах боломжтой болгох # CMD [ "npm", "start" ] чингэлэг доторх програмыг ажиллуулах командыг гүйцэтгэнэ.

Зурган дээрх шаардлагагүй файлуудыг хасахын тулд та ".dockerignore" файлд нэрийг нь жагсааж болно. Та маск (*.log) ашиглаж болно.

Зургийг дараах тушаалаар бүтээв.

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

$ docker images # Жишээ REPOSITORY TAG ID CREATED node carbon 1934b0b038d1 5 хоногийн өмнө хэрэглэгчийн нэр/node-web-app хамгийн сүүлийн үеийн d64d3505b0d2 1 минутын өмнө

Контейнерийг дараах тушаалыг ашиглан зургаас эхлүүлнэ.

$ docker run -p 49160:8000 -d хэрэглэгчийн нэр/node-web-app

Энэ жишээ нь "хэрэглэгчийн нэр/зангилаа-вэб-апп" зургаас контейнер үүсгэж, шууд ажиллуулдаг. Програмын порт 8000 нь локал машин (localhost) дээр байдаг бөгөөд "гаднаас" хандах боломжтой байхын тулд үүнийг 49160 порт руу "дамжуулах" боломжтой. Та ямар ч үнэгүй портыг сонгож болно, үүнээс гадна програмыг дамжуулах боломжтой. "-p 8000:8000" сонголтыг зааж өгснөөр портыг "байгаагаар нь" тохируулна уу.

Та дараах тушаалыг оруулснаар контейнер ажиллаж байгааг харж болно.

$ docker ps # Жишээ ID IMAGE COMMAND ... PORTS ecce33b30ebf хэрэглэгчийн нэр/node-web-app: хамгийн сүүлийн үеийн npm эхлэл ... 49160->8000

Энэ контейнерийн ID-г зааж өгснөөр савыг янз бүрийн тушаалуудыг ашиглан удирдаж болно.

$ docker pause ecce33b30ebf - ecce33b30ebf ID бүхий контейнерийг түр зогсоох
$ docker resume ecce33b30ebf - ecce33b30ebf ID-тай контейнерийг үргэлжлүүлнэ
$ docker stop ecce33b30ebf - ecce33b30ebf ID бүхий зогсоох контейнер
$ docker rm ecce33b30ebf - савыг устгах (энэ нь контейнер доторх програмын үүсгэсэн бүх өгөгдлийг устгана)

*nix системүүд нь эхлээд олон төрлийн ажлыг хэрэгжүүлдэг бөгөөд үйл явцыг тусгаарлах, хянах боломжийг олгодог хэрэгслүүдийг санал болгодог. Файлын системийн түвшинд тусгаарлалтыг хангадаг chroot(), цөмийн бүтцэд хандах хандалтыг хязгаарладаг FreeBSD шорон, LXC болон OpenVZ зэрэг технологиуд эртнээс мэдэгдэж, өргөн хэрэглэгдэж ирсэн. Гэхдээ технологийг хөгжүүлэх түлхэц нь Docker байсан бөгөөд энэ нь програмуудыг хялбархан түгээх боломжийг олгосон юм. Одоо Windows-д ижил зүйл ирсэн.

Windows дээрх контейнерууд

Орчин үеийн серверүүд хэт их багтаамжтай байдаг бөгөөд програмууд заримдаа тэдгээрийн зарим хэсгийг ч ашигладаггүй. Үүний үр дүнд системүүд хэсэг хугацаанд "сул зогсч", агаарыг халаадаг. Энэхүү шийдэл нь виртуалчлал байсан бөгөөд энэ нь хэд хэдэн үйлдлийн системийг нэг сервер дээр ажиллуулах боломжийг олгодог бөгөөд тэдгээрийг хооронд нь салгаж, тус бүрт шаардлагатай хэмжээний нөөцийг хуваарилах баталгаатай байв. Гэвч ахиц дэвшил зогсохгүй байна. Дараагийн шат бол микро үйлчилгээ бөгөөд програмын хэсэг бүрийг бие даасан бүрэлдэхүүн хэсэг болгон тусад нь байрлуулах бөгөөд шаардлагатай ачаалалд хялбархан тохируулж, шинэчлэх боломжтой. Тусгаарлах нь бусад програмуудыг микро үйлчилгээнд саад учруулахаас сэргийлдэг. Хүрээлэн буй орчинтой хамт програмуудыг савлах, хүргэх үйл явцыг хялбаршуулсан Docker төсөл гарч ирснээр микро үйлчилгээний архитектур хөгжилд нэмэлт түлхэц өгсөн.

Контейнерууд нь үйлдлийн системийн виртуалчлал гэж нэрлэгддэг програмуудыг ажиллуулах тусдаа орчинг бүрдүүлдэг виртуалчлалын өөр нэг төрөл юм. Контейнерууд нь ажиллахад шаардлагатай бүх нөөцийг (виртуалжуулсан нэр), харилцаж болох (файл, сүлжээний порт, процесс гэх мэт) болон орхиж болохгүй тусгаарлагдсан нэрийн орон зайг ашиглан хэрэгжүүлдэг. Өөрөөр хэлбэл, үйлдлийн систем нь зөвхөн хуваарилагдсан зүйлийг л контейнерт харуулдаг. Контейнер доторх програм нь үүнийг цорын ганц гэж үздэг бөгөөд бүрэн хэмжээний OS дээр ямар ч хязгаарлалтгүйгээр ажилладаг. Хэрэв одоо байгаа файлыг өөрчлөх эсвэл шинээр үүсгэх шаардлагатай бол контейнер нь үндсэн хост үйлдлийн системээс хуулбарыг хүлээн авч, зөвхөн өөрчлөгдсөн хэсгүүдийг хадгалдаг. Тиймээс нэг хост дээр олон контейнер байрлуулах нь маш үр дүнтэй байдаг.

Контейнер болон виртуал машинуудын ялгаа нь контейнерууд нь үйлдлийн систем, номын сан, системийн файл гэх мэт өөрийн хуулбарыг ачаалдаггүй явдал юм. Үйлдлийн систем нь контейнертэй хуваалцсан мэт. Шаардлагатай цорын ганц нэмэлт зүйл бол програмыг саванд ажиллуулахад шаардагдах нөөц юм. Үүний үр дүнд контейнер хэдхэн секундын дотор эхэлж, виртуал машин ашиглахаас бага системийг ачаалдаг. Докер одоогоор репозитор дахь 180 мянган програмыг санал болгож байгаа бөгөөд форматыг Open Container Initiative (OCI) нэгдмэл болгосон. Гэхдээ цөмөөс хамааралтай байгаа нь контейнер өөр үйлдлийн систем дээр ажиллахгүй гэсэн үг юм. Линукс контейнерууд нь Linux API шаарддаг тул Windows Линукс дээр ажиллахгүй.

Саяхан болтол Windows хөгжүүлэгчид виртуалчлалын хоёр технологийг санал болгож байсан: виртуал машинууд болон Server App-V виртуал програмууд. Тус бүр өөрийн гэсэн хэрэглээний талбар, давуу болон сул талуудтай. Одоо хүрээ улам өргөн болсон - Windows Server 2016 дээр контейнеруудыг зарлав. TP4-ийн үед хөгжүүлэлт хараахан дуусаагүй байсан ч шинэ технологийг ажиллаж байгааг харж, дүгнэлт хийх боломжтой болсон. MS-ийн хөгжүүлэгчид бэлэн технологиудыг гүйцэж, гартаа барьж авснаар зарим асуудалд бага зэрэг ахисан бөгөөд ингэснээр савны хэрэглээ илүү хялбар, түгээмэл болсон гэдгийг тэмдэглэх нь зүйтэй. Гол ялгаа нь Windows-ийн сав, Hyper-V гэсэн хоёр төрлийн савыг санал болгож байна. TP3-д зөвхөн эхнийх нь байсан.

Windows контейнерууд нь үйлдлийн системтэй нэг цөмийг ашигладаг бөгөөд энэ нь хоорондоо динамик байдлаар хуваагддаг. Түгээлтийн процессыг (CPU, RAM, сүлжээ) үйлдлийн систем хариуцдаг. Шаардлагатай бол та саванд хуваарилагдсан нөөцийн дээд хэмжээг хязгаарлаж болно. OS файлууд болон ажиллаж байгаа үйлчилгээнүүд нь контейнер бүрийн нэрийн талбарт дүрслэгдсэн байдаг. Энэ төрлийн чингэлэг нь нөөцийг үр ашигтай ашиглаж, ачааллыг бууруулж, улмаар програмуудыг илүү нягт байрлуулах боломжийг олгодог. Энэ горим нь FreeBSD Jail эсвэл Linux OpenVZ-г санагдуулдаг.

Hyper-V савнууд нь Hyper-V ашиглан нэмэлт тусгаарлалтыг хангадаг. Контейнер бүрт өөрийн цөм хуваарилагдсан бөгөөд санах ойг OS цөм биш, харин Hyper-V hypervisor гүйцэтгэдэг. Үр дүн нь виртуал машинтай ижил түвшний тусгаарлалт бөгөөд VM-ээс бага ачаалалтай боловч Windows-ийн контейнерээс илүү ачаалалтай байдаг. Энэ төрлийн контейнер ашиглахын тулд та Hyper-V үүргийг хост дээр суулгах хэрэгтэй. Windows контейнерууд нь сервер дээр нэг байгууллагын програмуудыг ажиллуулах гэх мэт найдвартай орчинд ашиглахад илүү тохиромжтой. Олон компаниуд серверийг хуваалцаж, илүү их тусгаарлалт хийх шаардлагатай үед Hyper-V контейнерууд илүү утга учиртай байх магадлалтай.

Win 2016-ийн савны чухал онцлог нь төрлийг үүсгэх үед биш, харин байршуулах үед сонгосон явдал юм. Өөрөөр хэлбэл ямар ч контейнерийг Windows болон Hyper-V хэлбэрээр ажиллуулж болно.

Win 2016-д шаардлагатай бүх функцийг хэрэгжүүлдэг Container Management стекийн хийсвэрлэх давхарга нь контейнеруудыг хариуцдаг. Хадгалахад VHDX хатуу дискний зургийн форматыг ашигладаг. Докерын нэгэн адил контейнерууд нь репозитор дахь зургуудад хадгалагддаг. Түүнээс гадна тус бүр нь өгөгдлийн бүрэн багцыг хадгалдаггүй бөгөөд зөвхөн үүсгэсэн зураг ба үндсэн зургийн хоорондох ялгааг хадгалдаг бөгөөд эхлүүлэх үед шаардлагатай бүх өгөгдлийг санах ойд тусгасан болно. Виртуал шилжүүлэгчийг чингэлэг болон физик сүлжээний хоорондох сүлжээний урсгалыг удирдахад ашигладаг.

Server Core эсвэл Nano Server-ийг контейнерт үйлдлийн систем болгон ашиглаж болно. Эхнийх нь ерөнхийдөө удаан хугацааны туршид шинэ зүйл биш бөгөөд одоо байгаа програмуудтай өндөр түвшний нийцтэй байдлыг хангадаг. Хоёрдахь хувилбар нь мониторгүйгээр ажиллахад зориулсан бүр ч илүү задарсан хувилбар бөгөөд Hyper-V, файлын сервер (SOFS) болон үүлэн үйлчилгээнд ашиглах боломжтой хамгийн бага тохиргоонд серверийг ажиллуулах боломжийг олгодог. Мэдээжийн хэрэг, график интерфейс байхгүй. Зөвхөн хамгийн шаардлагатай бүрэлдэхүүн хэсгүүдийг агуулдаг (CoreCLR-тэй .NET, Hyper-V, Clustering гэх мэт). Гэхдээ эцэст нь энэ нь 93% бага зай эзэлдэг бөгөөд цөөн тооны чухал засваруудыг шаарддаг.

Өөр нэг сонирхолтой зүйл. Контейнеруудыг удирдахын тулд уламжлалт PowerShell-ээс гадна Docker ашиглаж болно. Win дээр уугуул бус хэрэгслүүдийг ажиллуулах боломжийг олгохын тулд MS нь Docker API болон багаж хэрэгслийг өргөтгөх чиглэлээр хамтран ажиллаж байна. Бүх хөгжүүлэлтүүд нээлттэй бөгөөд Docker төслийн албан ёсны GitHub дээр байдаг. Докерын удирдлагын командууд нь Win болон Linux хоёрын аль алинд нь хамаатай. Мэдээжийн хэрэг, Windows дээр Линукс дээр үүсгэсэн контейнер ажиллуулах боломжгүй (мөн эсрэгээр). Одоогоор PowerShell нь функцээр хязгаарлагдмал бөгөөд зөвхөн локал репозитортой ажиллах боломжийг танд олгоно.

Суурилуулах савнууд

Azure-д шаардлагатай Windows Server 2016 Core with Containers Tech Preview 4 дүрс байгаа бөгөөд та үүнийг байрлуулж, контейнеруудыг судлахад ашиглаж болно. Үгүй бол та бүх зүйлийг өөрөө тохируулах хэрэгтэй. Орон нутгийн суулгацын хувьд танд Win 2016 хэрэгтэй бөгөөд Win 2016-д Hyper-V нь үүрлэсэн виртуалчлалыг дэмждэг тул энэ нь физик эсвэл виртуал сервер байж болно. Бүрэлдэхүүн хэсгүүдийг суулгах процесс нь өөрөө стандарт юм. Үүрэг ба онцлог нэмэх шидтэн дотроос тохирох зүйлийг сонгох эсвэл PowerShell-ийг ашиглан тушаалыг өгнө

Жич> Суулгах-WindowsFeature Контейнер

Процессын явцад Virtual Switch сүлжээний хянагчийг нэн даруй тохируулах шаардлагатай, эс тэгвээс цаашдын үйлдэл нь алдаа гаргах болно. Сүлжээний адаптеруудын нэрийг харцгаая.

PS>Get-NetAdapter

Ажиллахын тулд бидэнд гадаад төрлийн хянагч хэрэгтэй. New-VMSwitch командлет нь олон параметртэй боловч энэ жишээний хувьд бид хамгийн бага тохиргоог хийх болно:

PS> New-VMSwitch -Нэр гадаад -NetAdapterName Ethernet0

Бид шалгаж байна:

Жич> Get-VMSwitch | хаана ($_.SwitchType –eq "Гадаад")

Windows галт хана нь контейнерт холбогдох холболтыг хаах болно. Тиймээс, зөвшөөрлийн дүрмийг бий болгох шаардлагатай бөгөөд дор хаяж PowerShell алсын удирдлага ашиглан алсаас холбогдох боломжтой байхын тулд бид TCP/80-г зөвшөөрч, NAT дүрмийг бий болгоно.

PS> New-NetFirewallRule -Нэр "TCP80" -DisplayName "HTTP on TCP/80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True PS> Add-NetNatStaticMapping -NatName "ContainerNat" -ProtocolA TCPd0.0.External. InternalIPAddress 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 Disks руу хуулж болно. Бид суулгасан виртуал машин руу нэвтэрч, угсрах явцад заасан нууц үгээ зааж, ажиллах боломжтой.

Одоо та савыг шууд ашиглах боломжтой.

PowerShell-тэй контейнер ашиглах

Контейнерын модуль нь 32 PowerShell команд агуулсан бөгөөд тэдгээрийн зарим нь бүрэн бус хэвээр байгаа ч ерөнхийдөө бүх зүйлийг хэвийн болгоход хангалттай. Үүнийг жагсаахад хялбар:

Жич> Get-Command -модуль Контейнер

Та Get-ContainerImage команд, контейнерууд - Get-Container ашиглан боломжтой зургийн жагсаалтыг авах боломжтой. Савны хувьд Статус баганад одоогийн статусаа харуулна: зогссон эсвэл ажиллаж байна. Гэхдээ технологийг боловсруулж байх үед MS нь репозитор хангаагүй бөгөөд дээр дурдсанчлан PowerShell одоогоор локал репозитортой ажилладаг тул туршилтын хувьд та үүнийг өөрөө үүсгэх хэрэгтэй болно.

Тиймээс, бидэнд дэмжлэгтэй сервер байгаа тул одоо бидэнд контейнерууд хэрэгтэй байна. Үүнийг хийхийн тулд ContainerProvider багц үйлчилгээ үзүүлэгчийг суулгана уу.

Үргэлжлэлийг зөвхөн гишүүд үзэх боломжтой

Сонголт 1. Сайтын бүх материалыг уншихын тулд "сайт" нийгэмлэгт нэгдээрэй

Нийгэмлэгт заасан хугацаанд гишүүнээр элсэх нь танд Хакерын БҮХ материалд хандах боломжийг олгож, хувийн хуримтлагдсан хөнгөлөлтөө нэмэгдүүлж, мэргэжлийн Xakep онооны үнэлгээг хуримтлуулах боломжийг олгоно!

2013 оны 3-р сард Soloman Hikes нь дараа нь Docker нэртэй болсон нээлттэй эхийн төсөл эхэлснээ зарлав. Дараагийн саруудад Линуксийн нийгэмлэгээс хүчтэй дэмжлэг авсан бөгөөд 2014 оны намар Microsoft Windows Server 2016 дээр контейнеруудыг хэрэгжүүлэхээр төлөвлөж байгаагаа зарлав. Миний үүсгэн байгуулсан WinDocks компани нээлттэй эхийн Docker-ийн бие даасан хувилбарыг гаргасан. 2016 оны эхээр Windows-д зориулагдсан бөгөөд SQL Server дээрх нэгдүгээр зэрэглэлийн контейнерийн дэмжлэгт анхаарлаа хандуулсан. Контейнер нь салбарын анхаарлын төвд хурдан орж байна. Энэ нийтлэлд бид контейнерууд болон тэдгээрийн SQL Server хөгжүүлэгчид болон DBA-уудын хэрэглээг авч үзэх болно

Контейнерын зохион байгуулалтын зарчим

Сав баглаа боодлын хэрэглээний шинэ аргыг хэрэглэгч болон процессын тусгаарлалттай хослуулан олон түрээслэгчийн хэрэглээнд зориулж тодорхойлдог. Линукс болон Windows-д зориулсан төрөл бүрийн контейнерийн хэрэгжилт олон жилийн турш оршин тогтнож ирсэн боловч Windows Server 2016 гарснаар бид бодит Docker стандарттай болсон. Өнөөдөр Docker API болон контейнер форматыг олон нийтэд нээлттэй AWS, Azure, Google Cloud, бүх Linux болон Windows түгээлтүүд дээр дэмждэг. Docker-ийн гоёмсог бүтэц нь чухал давуу талтай.

  • Зөөврийн чадвар. Контейнер нь хэрэглээний программ хангамжийн хамаарлыг агуулсан бөгөөд хөгжүүлэгчийн зөөврийн компьютер, хуваалцсан тест сервер болон нийтийн үйлчилгээнд өөрчлөгдөөгүй ажилладаг.
  • Контейнерийн экосистем. Docker API нь хяналт, бүртгэл, өгөгдөл хадгалах, кластер зохион байгуулалт, менежментийн шийдэл бүхий салбарын шинэчлэлийн гэр юм.
  • Төрийн үйлчилгээтэй нийцдэг. Контейнерууд нь микро үйлчилгээний архитектур, цар хүрээг багасгах, түр зуурын ажлын ачаалалд зориулагдсан. Савыг нөхөж, шинэчлэхээс илүүтэй, хэрэв хүсвэл арилгаж, сольж болохуйцаар зохион бүтээсэн.
  • Хурд ба хэмнэлт. Савыг бий болгоход хэдхэн секунд шаардлагатай; олон захиалгат үр дүнтэй дэмжлэг үзүүлдэг. Ихэнх хэрэглэгчдийн хувьд виртуал машинуудын тоо 3-5 дахин багасдаг (Зураг 1).

SQL серверийн савнууд

SQL Server нь арван жилийн турш нэрлэсэн инстанцын олон түрээслэлтийг дэмжсэн тул SQL Server контейнеруудын үнэ цэнэ юу вэ?

Үнэн хэрэгтээ SQL Server контейнерууд нь хурд, автоматжуулалтын ачаар илүү практик байдаг. SQL серверийн контейнерууд нь хэдхэн секундын дотор өгөгдөл болон тохиргоог хийдэг инстанцууд гэж нэрлэгддэг. SQL серверийн контейнеруудыг хэдхэн секундын дотор үүсгэх, устгах, солих чадвар нь тэдгээрийг боловсруулах, чанарын баталгаа болон доор авч үзсэн бусад хэрэглээний тохиолдлуудад илүү практик болгодог.

SQL Server контейнеруудын хурд, автоматжуулалт нь тэдгээрийг үйлдвэрлэлийн хөгжүүлэлт болон QA орчинд хамгийн тохиромжтой болгодог. Багийн гишүүн бүр тусгаарлагдсан контейнеруудыг хуваалцсан виртуал машинд ажиллуулж, виртуал машины тоог 3-5 дахин багасгадаг. Үүний үр дүнд бид виртуал машинуудын засвар үйлчилгээ болон Microsoft-ын лицензийн зардлаас ихээхэн хэмнэлт авдаг. Хадгалалтын хуулбар болон мэдээллийн сангийн клон ашиглан хадгалах талбайн сүлжээний (SAN) массивуудад чингэлэгүүдийг хялбархан нэгтгэж болно (Зураг 2).

Контейнер дээр нэг минут хүрэхгүй хугацаанд 1TB холбогдсон мэдээллийн сан үүсдэг. Энэ нь тусгай зориулалтын нэрлэсэн тохиолдлуудтай серверүүд эсвэл хөгжүүлэгч бүрийн хувьд виртуал машинуудыг бэлтгэсэнтэй харьцуулахад мэдэгдэхүйц сайжруулалт юм. Нэг компани 20 400 ГБ хүртэлх SQL Server контейнерт үйлчлэхийн тулд найман цөмт сервер ашигладаг. Өмнө нь виртуал машин бүрийг хангахад нэг цаг гаруй хугацаа шаардагддаг байсан бөгөөд контейнерийн жишээг хоёр минутын дотор хангадаг байсан. Ингэснээр виртуал машинуудын тоог 20 дахин бууруулж, процессорын цөмийн тоог 5 дахин багасгаж, Microsoft-ын лицензийн төлбөрийг эрс бууруулах боломжтой болсон. Үүнээс гадна бизнесийн уян хатан байдал, хариу үйлдэл үзүүлэх чадвар нэмэгдсэн.

SQL серверийн савыг ашиглах

Контейнерийг Dockerfile скрипт ашиглан тодорхойлдог бөгөөд энэ нь савыг бүтээх тодорхой алхмуудыг өгдөг. Зураг 1-д үзүүлсэн Dockerfile нь SQL Server 2012-ыг контейнерт хуулсан мэдээллийн бааз болон сонгосон хүснэгтүүдийг далдлах SQL Server скриптийг зааж өгсөн болно.

Контейнер бүр нь дэмжлэг болон бүртгэлийн файл бүхий олон арван мэдээллийн санг агуулж болно. Өгөгдлийн санг хуулж, саванд хийж ажиллуулж эсвэл MOUNTDB командыг ашиглан холбож болно.

Контейнер бүр хост нөөцөөс тусгаарлагдсан хувийн файлын системийг агуулдаг. Зураг 2-т үзүүлсэн жишээн дээр контейнерийг MSSQL-2014 болон venture.mdf ашиглан бүтээсэн. Өвөрмөц ContainerID болон контейнер портыг үүсгэсэн.


Дэлгэц 2. SQL Server 2014 болон venture.mdf дээр суурилсан контейнер

SQL Server контейнерууд нь гүйцэтгэл, автоматжуулалтын шинэ түвшнийг өгдөг боловч тэдгээрийн зан төлөв нь ердийн нэртэй зайтай яг адилхан юм. Нөөцийн менежментийг SQL Server хэрэгслийг ашиглан эсвэл контейнерийн нөөцийн хязгаарлалтаар дамжуулан хэрэгжүүлж болно (Зураг 3).

Бусад програмууд

Контейнер нь хөгжүүлэлт, чанарын хяналтыг зохион байгуулах хамгийн түгээмэл хэрэгсэл боловч бусад хэрэглээ бий болж байна. Гамшгаас хамгаалах туршилт нь энгийн боловч ирээдүйтэй хэрэглээний тохиолдол юм. Бусад нь SAP эсвэл Microsoft Dynamics зэрэг хуучин програмуудад зориулсан дотоод SQL серверийн орчныг багтаасан болно. Дэмжлэг, байнгын засвар үйлчилгээ хийх ажлын орчинг бүрдүүлэхийн тулд чингэлэгжүүлсэн арын хэсгийг ашигладаг. Үнэлгээний савыг мөн байнгын мэдээллийн сан бүхий үйлдвэрлэлийн орчныг дэмжихэд ашигладаг. Ирээдүйн нийтлэлд би байнгын мэдээллийн талаар дэлгэрэнгүй ярих болно.

WinDocks нь вэб интерфэйсээр дамжуулан контейнер ашиглахыг илүү хялбар болгох зорилготой. Өөр нэг төсөл нь Jenkins эсвэл Team City дээр суурилсан CI/CD дамжуулах шугамтай DevOps эсвэл Continuous Integration процесст SQL Server контейнеруудыг шилжүүлэхэд чиглэгддэг. Өнөөдөр та Windows 8 болон Windows 10, Windows Server 2012 эсвэл Windows Server 2016-ийн бүх хувилбарууд дээр WinDocks Community Edition (https://www.windocks. com)-ийн хуулбарыг ашиглан SQL Server 2008-аас эхлэн бүх хувилбаруудын дэмжлэгтэйгээр контейнер ашиглаж болно. / community-docker-windows).

Савны технологийг судалж байна
Windows Server 2016

Windows Server 2016-д нэвтрүүлсэн онцлох шинэ боломжуудын нэг бол контейнеруудыг дэмжих явдал юм. Түүнийг илүү сайн мэддэг болцгооё

Орчин үеийн системүүд нэг үйлдлийн систем - нэг серверийн зарчмаас удаан хугацаагаар холдсон. Виртуалчлалын технологи нь серверийн нөөцийг илүү үр ашигтай ашиглах боломжийг олгодог бөгөөд хэд хэдэн үйлдлийн системийг ажиллуулах, тэдгээрийг хооронд нь хувааж, удирдлагыг хялбаршуулах боломжийг олгодог. Дараа нь микро үйлчилгээнүүд гарч ирснээр тусгаарлагдсан програмуудыг тусдаа, хялбар удирдаж, өргөтгөх боломжтой бүрэлдэхүүн хэсэг болгон ашиглах боломжтой болсон. Докер бүх зүйлийг өөрчилсөн. Аппликейшныг хүрээлэн буй орчинтой хамт хүргэх үйл явц нь эцсийн хэрэглэгчийн сонирхлыг татахгүй байхын аргагүй хялбар болсон. Контейнер доторх програм нь бүрэн хэмжээний OS ашиглаж байгаа мэт ажилладаг. Гэхдээ виртуал машинуудаас ялгаатай нь тэд үйлдлийн систем, номын сан, системийн файл гэх мэт өөрийн хуулбарыг ачаалдаггүй. Аппликейшн нь шаардлагатай бүх нөөцөд хандах боломжтой, гэхдээ тэдгээрээс хэтэрч чадахгүй тусгаарлагдсан нэрийн орон зайг чингэлэг хүлээн авдаг. Хэрэв та тохиргоог өөрчлөх шаардлагатай бол зөвхөн үндсэн үйлдлийн системийн ялгааг хадгална. Тиймээс контейнер нь виртуал машинуудаас ялгаатай нь маш хурдан ажиллаж, системд бага ачаалал өгдөг. Контейнерууд серверийн нөөцийг илүү үр дүнтэй ашигладаг.

Windows дээрх контейнерууд

Windows Server 2016-д одоо байгаа виртуалчлалын технологиуд болох Hyper-V ба Server App-V виртуал программуудаас гадна Windows Server Containers контейнерт зориулсан дэмжлэг нэмэгдсэн бөгөөд Container Management стекийн хийсвэр давхаргаар дамжуулан шаардлагатай бүх функцийг хэрэгжүүлдэг. Технологийг Техникийн урьдчилсан 4-р хувилбар дээр дахин зарласан боловч тэр цагаас хойш хялбаршуулах чиглэлд их зүйл өөрчлөгдсөн бөгөөд та өмнө нь бичсэн зааврыг унших шаардлагагүй болсон. Үүний зэрэгцээ хоёр төрлийн "тэдний" савыг санал болгосон - Windows сав, Hyper-V сав. Бас нэг гол боломж бол контейнер удирдахын тулд PowerShell командлуудаас гадна Docker хэрэгслийг ашиглах явдал юм.

Windows-ийн контейнерууд нь зарчмын хувьд FreeBSD Jail эсвэл Linux OpenVZ-тэй төстэй бөгөөд тэдгээр нь бусад нөөцийн (RAM, сүлжээ) хамт нэг цөмийг ашигладаг; Үйлдлийн систем болон үйлчилгээний файлуудыг контейнер бүрийн нэрийн орон зайд тусгасан болно. Энэ төрлийн чингэлэг нь нөөцийг үр ашигтай ашиглаж, ачааллыг бууруулж, улмаар програмуудыг илүү нягт байрлуулах боломжийг олгодог. Үндсэн контейнерийн зургууд нь зангилаатай ижил цөмтэй "байдаг" тул тэдгээрийн хувилбарууд таарч байх ёстой, эс тэгвээс ажиллах баталгаа байхгүй.

Hyper-V савнууд нь нэмэлт тусгаарлах түвшинг ашигладаг бөгөөд сав бүр өөрийн цөм болон санах ойг хуваарилдаг. Тусгаарлах нь өмнөх төрлөөс ялгаатай нь үйлдлийн системийн цөм биш харин Hyper-V гипервизор (Hyper-V үүрэг шаардлагатай) хийгддэг. Үр дүн нь виртуал машинуудаас бага зардалтай боловч Windows-ийн контейнерээс илүү тусгаарлалт юм. Энэ тохиолдолд савыг ажиллуулахын тулд ижил үйлдлийн системийн цөмтэй байх хэрэгтэй. Эдгээр контейнеруудыг Windows 10 Pro/Enterprise дээр байрлуулж болно. Савны төрлийг бүтээх явцад биш харин байрлуулах явцад сонгогддог гэдгийг тэмдэглэх нь зүйтэй. Өөрөөр хэлбэл, ямар ч контейнерийг Windows болон Hyper-V хувилбар болгон ажиллуулж болно.

Уг контейнер нь тайрсан Server Core эсвэл Nano Server-ийг үйлдлийн систем болгон ашигладаг. Эхнийх нь Windows Sever 2008 дээр гарч ирсэн бөгөөд одоо байгаа програмуудтай илүү нийцтэй байдаг. Хоёрдахь нь Server Core-тэй харьцуулахад бүр ч багассан бөгөөд мониторгүйгээр ажиллахад зориулагдсан бөгөөд энэ нь танд серверийг Hyper-V, файл сервер (SOFS) болон үүлэн үйлчилгээнд ашиглах боломжтой хамгийн бага тохиргоонд ажиллуулах боломжийг олгодог бөгөөд 93% -ийг шаарддаг. бага зай. Зөвхөн хамгийн шаардлагатай бүрэлдэхүүн хэсгүүдийг (.Net with CoreCLR, Hyper-V, Clustering гэх мэт) агуулдаг.

Хадгалахад VHDX хатуу дискний зургийн форматыг ашигладаг. Докерын нэгэн адил контейнерууд нь репозитор дахь зургуудад хадгалагддаг. Түүнээс гадна тус бүр нь өгөгдлийн бүрэн багцыг хадгалдаггүй бөгөөд зөвхөн үүсгэсэн зураг болон үндсэн зургийн хоорондох ялгааг л хадгалдаг. Мөн эхлүүлэх үед шаардлагатай бүх өгөгдлийг санах ойд тусгасан болно. Virtual Switch нь контейнер болон физик сүлжээний хоорондох сүлжээний урсгалыг удирдахад ашиглагддаг.