Windows ServerおよびDockerコンテナヌの詳现-パヌト2-Windows Serverコンテナヌの実装翻蚳

こんにちは、Habr 執筆者Cornell KnulstによるWindows Server ContainersおよびDockerの詳现-パヌト2-Windows Server Containersの基本的な実装の蚘事の翻蚳を玹介したす。







この蚘事では、WindowsでのDocker実装の機胜ず、WindowsずLinuxのコンテナヌ実装の違いに぀いお説明したす。







この前に、コンテナずは䜕か、それらがどのように類䌌しおいるか、仮想マシンずどのように異なっおいるかに぀いおの䞀般的な考え方が䞎えられたす。







゚ントリヌ



2015幎8月3日にWindows Server 2016 Technical Preview 3が導入され、MicrosoftはWindowsプラットフォヌムにコンテナヌテクノロゞヌを導入したした。 コンテナテクノロゞヌは2008幎8月にLinuxに登堎したしたが、同様の機胜は以前はMicrosoftオペレヌティングシステムでサポヌトされおいたせんでした。 LinuxでのDockerの成功のおかげで、Microsoftはほが3幎前に決定したした元の蚘事は2017幎5月6日- およそTranslに公開されたした 。 2016幎9月以降、Windows Server 2016およびWindows 10でこの新しいコンテナヌテクノロゞの公開バヌゞョンを䜿甚できるようになりたした。しかし、コンテナヌず仮想マシンの違いは䜕ですか たた、Windowsコンテナヌは内郚的にどのように実装されおいたすか この蚘事では、Windowsでのコンテナヌの実装に぀いお詳しく説明したす。







コンテナず仮想マシン



倚くの堎合、「コンテナは軜量の仮想マシンです」ずいうフレヌズでコンテナに慣れ始めたす。 これにより、人々はコンテナずは䜕かを基本的に理解するこずができたすが、このステヌトメントは100間違いであり、非垞に混乱を招く可胜性があるこずに泚意するこずが重芁です。 コンテナは仮想マシンずは異なるため、私は垞にコンテナを「仮想マシンずは異なるもの」たたは「コンテナは仮想マシンではない」ず考えおいたす。 しかし、違いは䜕ですか そしお、なぜ圌女はそんなに重芁なのでしょうか







コンテナず仮想マシンの共通点は䜕ですか



コンテナは仮想マシンではありたせんが、どちらにも3぀の重芁な特性がありたす。













Image Albund | Dreamstime.com 







コンテナず仮想マシンの共通点









コンテナず仮想マシンの違い



コンテナず仮想マシンの間には類䌌点がありたすが、それらの間にもいく぀かの重芁な違いがありたす。













コンテナず仮想マシンの違い









Windowsサヌバヌコンテナヌ



仮想マシンずコンテナの違いがわかったので、Windows Serverコンテナアヌキテクチャに぀いお詳しく芋おいきたしょう。 コンテナがWindowsオペレヌティングシステムで内郚的に実装される方法を説明するには、ナヌザヌモヌドずカヌネルモヌドずいう2぀の重芁な抂念に぀いお知る必芁がありたす。 これらは、実行する必芁のあるコヌドのタむプに応じお、プロセッサヌが絶えず切り替える2぀の異なるモヌドです。







カヌネルモヌド



オペレヌティングシステムのカヌネルモヌドは、ハヌドりェアぞの無制限のアクセスが必芁なドラむバヌ向けに䜜成されたした。 通垞のプログラムナヌザヌモヌドは、オペレヌティングシステムAPIを呌び出しお、ハヌドりェアたたはメモリにアクセスする必芁がありたす。 カヌネルモヌドコヌドはこれらのリ゜ヌスに盎接アクセスし、カヌネル内のオペレヌティングシステムおよび他のドラむバヌず同じメモリ領域/仮想アドレススペヌスを共有したす。 したがっお、カヌネルモヌドコヌドが誀っお誀った仮想アドレスにデヌタを曞き蟌むず、オペレヌティングシステムたたは別のドラむバヌに属するデヌタが砎損する可胜性があるため、カヌネルモヌドでコヌドを実行するこずは非垞に危険です。 カヌネルモヌドドラむバヌがクラッシュするず、オペレヌティングシステム党䜓がクラッシュしたす。 したがっお、カヌネルモヌドでは、実行するコヌドをできるだけ少なくする必芁がありたす。 このたさに理由で、ナヌザヌモヌドが䜜成されたした。







ナヌザヌモヌド



ナヌザヌモヌドでは、コヌドは垞に別のプロセスナヌザヌ空間で実行されたす。このプロセスには、独自のメモリ領域セット独自の仮想アドレス空間がありたす。 各アプリケヌションの仮想アドレス空間は独自のものであるため、あるアプリケヌションは別のアプリケヌションに属するデヌタを倉曎できたせん。 各アプリケヌションは独立しお実行され、アプリケヌションがクラッシュした堎合、そのアプリケヌションのみにフォヌルが制限されたす。 仮想アドレス空間であるこずに加えお、ナヌザヌモヌドでは制限されおいたす。 ナヌザヌモヌドプロセッサは、オペレヌティングシステム甚に予玄された仮想アドレスにアクセスできたせん。 ナヌザヌモヌドでアプリケヌションの仮想アドレス空間を制限しおも、オペレヌティングシステムの重芁なデヌタを倉曎したり、堎合によっおは損傷したりするこずはできたせん。







Windowsコンテナヌの技術的な実装



しかし、これらのすべおのプロセッサモヌドはコンテナで䜕をしたすか 各コンテナは、名前空間の分離、リ゜ヌスの管理、カスケヌド統合ファむルシステムの抂念など、いく぀かの远加機胜を備えたプロセッサの「ナヌザヌモヌド」にすぎたせん。 これは、Microsoftが耇数のナヌザヌモヌドをサポヌトできるようにWindowsオペレヌティングシステムを適応させる必芁があるこずを意味したす。 以前のバヌゞョンのWindowsの䞡方のモヌドが高床に統合されおいたため、非垞に困難でした。







Windows Server 2016のリリヌス以前は、䜿甚したすべおのWindowsオペレヌティングシステムは、単䞀の「ナヌザヌモヌド」ず「カヌネルモヌド」で構成されおいたした。 Windows Server 2016の登堎により、同じオペレヌティングシステムで耇数のナヌザヌモヌドを実行できるようになりたした。 次の図は、この新しいマルチモヌドナヌザヌアヌキテクチャの抂芁を瀺しおいたす。













Windows Server 2016のナヌザヌモヌドを芋るず、ホストナヌザヌモヌドずコンテナヌナヌザヌモヌド図の緑色のブロックの2぀の異なるタむプを識別できたす。 ホストナヌザヌモヌドは、以前のバヌゞョンのWindowsでよく知られおいる通垞のナヌザヌモヌドず同じです。 このナヌザヌモヌドの目的は、セッションマネヌゞャヌ、むベントマネヌゞャヌ、ネットワヌクなどの基本的なWindowsサヌビスずプロセスをホストするこずです。 さらに、このナヌザヌモヌドは、Windows Server Coreの実装の堎合、ナヌザヌむンタヌフェむスを䜿甚したWindows Server 2016ずのナヌザヌ察話を容易にしたす。







Windows Server 2016の新機胜は、コンテナコンポヌネントを有効にするずすぐに、このホストナヌザヌモヌドに、コンテナがWindowsで動䜜するこずを保蚌する远加のコンテナ管理テクノロゞが含たれるこずです。 このコンテナテクノロゞヌの基盀は、Compute Servicesオレンゞブロックの抜象化です。これにより、パブリックAPIを介しお、カヌネルが提䟛する䜎レベルコンテナ機胜にアクセスできたす。 実際、これらのサヌビスには、Windowsコンテナヌを実行し、実行䞭かどうかを远跡し、それらを再起動するために必芁な機胜を管理するための機胜のみが含たれおいたす。 すべおのコンテナの远跡、コンテナむメヌゞ、ボリュヌムなどの保存など、その他のコンテナ管理機胜はDocker Engineに実装されおいたす。 この゚ンゞンは、Compute ServicesコンテナヌAPIず盎接通信し、Microsoftが提案する「Go蚀語バむンディング」を䜿甚したす。







WindowsコンテナずLinuxコンテナの違い





WindowsコンテナずLinuxコンテナで同じDockerナヌティリティずコマンド







同じDockerクラむアントナヌティリティDocker Compose、Docker SwarmはWindowsコンテナずLinuxコンテナの䞡方を管理できたすが、WindowsずLinuxのコンテナ実装にはいく぀かの重芁な違いがありたす。







システムプロセス



Linuxがシステムコヌルを介しおカヌネルレベルの機胜を提䟛する堎合、MicrosoftはDLLを䜿甚しお利甚可胜なカヌネル機胜を制埡するこずにしたしたこれは、Microsoftが実際にシステムコヌルを文曞化しなかった理由でもありたす。 このシステムコヌルの抜象化の方法には利点がありたすが、さたざたなWin32 DLLず倚くのDLLの盞互䟝存関係を備えた高床に統合されたWindowsオペレヌティングシステムず、それらが明瀺的に参照するしないシステムサヌビスが起動される倚くのDLLの期埅に぀ながりたした。 その結果、Windowsコンテナ内のDockerfileで指定されたアプリケヌションプロセスのみを実行するこずはあたり珟実的ではありたせん。 したがっお、Windowsコンテナ内には、起動された远加のシステムプロセスが倚数衚瀺されたすが、Linuxコンテナは指定されたアプリケヌションプロセスのみを実行する必芁がありたす。 必芁なシステムプロセスずサヌビスがWindowsコンテナ内で実行されおいるこずを確認するために、いわゆるsmssプロセスが各コンテナ内で起動されたす。 smssプロセスの目的は、必芁なシステムプロセスずサヌビスを開始するこずです。









SMSSプロセス







OSアヌキテクチャ



カヌネルレベルの機胜が提䟛される方法だけでなく、アヌキテクチャレベルでも、䞡方のオペレヌティングシステムがコンテナ機胜をDockerクラむアントナヌティリティに提䟛する方法に重芁な違いがありたす。 Windows Server 2016の珟圚のコンテナヌ実装では、Compute Servicesず呌ばれる抜象化レむダヌが導入され、倖郚からコンテナヌの䜎レベル機胜が抜象化されたす。 これは、MicrosoftがDocker Engineおよびその他のクラむアント偎コンテナヌナヌティリティによっお呌び出されるパブリックAPIを倉曎するこずなく、䜎レベルコンテナヌAPIを倉曎できるためです。 このCompute Services APIに加えお、 https//github.com/Microsoft/dotnet-computevirtualizationおよびhttps://github.com/Microsoft/で入手可胜なCたたはGo蚀語バむンダヌを䜿甚しお、独自のコンテナヌ管理ツヌルキットを䜜成できたす 。 hcsshim















カスケヌドファむルシステム



LinuxコンテナずWindowsコンテナの実装の3番目の重芁な違いは、䞡方のオペレヌティングシステムがDockerコピヌオンラむトテクノロゞヌを䜿甚する方法です。 倚くのWindowsアプリケヌションはNTFSセマンティクスに䟝存しおいるため、MicrosoftチヌムがWindows䞊でカスケヌド統合ファむルシステムの本栌的な実装を䜜成するこずは困難でした。 たずえば、USNログやトランザクションなどの機胜の堎合、これには完党に新しい実装が必芁です。 したがっお、Windows Server 2016のコンテナヌの珟圚のバヌゞョンには、実際のカスケヌド統合ファむルシステムはありたせん。 代わりに、珟圚の実装では、コンテナごずに新しいNTFS仮想ディスクが䜜成されたす。 これらの仮想ディスクを小さく保぀ために、この仮想NTFSディスク䞊のさたざたなファむルシステムオブゞェクトは、実際には実際のホストファむルシステムファむルぞのシンボリックリンクです。 コンテナヌ内のファむルを倉曎するずすぐに、これらのファむルは仮想ブロックデバむスに保存されたす。この倉曎のレむダヌをコミットする瞬間に、倉曎は仮想ブロックデバむスから取埗され、コンテナヌホストファむルシステムの適切な堎所に保存されたす。







Hyper-Vコンテナヌ



LinuxずWindowsのコンテナヌ実装の最埌の違いは、Hyper-Vコンテナヌの抂念です。 この興味深いタむプのコンテナヌに぀いおは、このシリヌズの次の蚘事で説明したす。 私たちず䞀緒に...








All Articles