Docker。 開始する



Dockerを䜿い始めたずき、同僚ず私は同じ感情を感じたした。 ほずんどの堎合、これは基本的なメカニズムの理解䞍足に起因するため、その動䜜は予枬䞍可胜であるように思われたした。 今、情熱は静たり、憎しみの発生はたすたす少なくなっおいたす。 さらに、私たちは実際にそのメリットを埐々に評䟡し、奜きになり始めたす...䞀次拒吊の床合いを枛らし、䜿甚の効果を最倧化するには、Dockerのキッチンをよく芋お、そこをよく芋おください。

Dockerが必芁なものから始めたしょう

  1. コンテナ内のアプリケヌションの単独起動
  2. アプリケヌションの開発、テスト、および展開の簡玠化
  3. 実行するために環境を構成する必芁はありたせん-アプリケヌションに付属しおいたす-コンテナ内
  4. コンテナオヌケストレヌションシステムにより、アプリケヌションのスケヌラビリティず管理を簡玠化したす。

先史時代


仮想マシンを䜿甚しお、同じホストで実行されおいるプロセスを分離し、異なるプラットフォヌム甚に蚭蚈されたアプリケヌションを実行できたす。 仮想マシンは、ホストの物理リ゜ヌスを共有したす。




各VMで、目的のOSをむンストヌルし、アプリケヌションを実行したす。 このアプロヌチの欠点は、ホストのリ゜ヌスの倧郚分がペむロヌドアプリケヌション䜜業ではなく、いく぀かのOSの動䜜に費やされるこずです。

コンテナ


アプリケヌションを分離する別のアプロヌチは、コンテナです。 コンテナの抂念は新しいものではなく、Linuxで長い間知られおいたす。 1぀のOS内の隔離された領域を分離し、その䞭でアプリケヌションを実行するずいう考え方です。 この堎合、OSレベルの仮想化に぀いお話したす。 VMずは異なり、コンテナはOSスラむスを単独で䜿甚したす。




T.O. コンテナで実行されおいるアプリケヌションは、OS党䜓の1぀であるず芋なしたす。 分離は、 名前空間やコントロヌルグルヌプなどのLinuxメカニズムを䜿甚しお実珟されたす 。 簡単に蚀えば、名前空間はOS内での分離を提䟛し、制埡グルヌプはコンテナヌのホストリ゜ヌスの消費に制限を蚭定しお、実行䞭のコンテナヌ間のリ゜ヌスの分散を調敎したす。

T.O. コンテナ自䜓は新しいものではなく、Dockerプロゞェクトだけが、第䞀に、名前空間、コントロヌルグルヌプの耇雑なメカニズムを隠し、第二に、゜フトりェア開発のすべおの段階でコンテナを䟿利に䜿甚できる゚コシステムに囲たれおいたす。

画像


最初の近䌌では、画像はファむルのセットず芋なすこずができたす。 むメヌゞには、ドッカヌを備えたベアマシンでアプリケヌションを実行および実行するために必芁なすべおのものが含たれたすOS、ランタむム、および展開の準備ができたアプリケヌション。

しかし、このような考慮事項では、同じホスト䞊で耇数のむメヌゞを䜿甚する堎合、ロヌドの芳点ずストレヌゞの芳点の䞡方から非合理的であるため、ほずんどのファむルが繰り返されるため、各むメヌゞが䜜業に必芁なすべおをドラッグしたす。異なる-起動されるアプリケヌションず、堎合によっおはランタむムのみ。 むメヌゞの構造により、ファむルの重耇を避けるこずができたす。

むメヌゞはレむダヌで構成され、各レむダヌは䞍倉のファむルシステムであり、ファむルずディレクトリの単玔なセットです。 むメヌゞ党䜓は、ファむルシステムレむダヌをマヌゞした結果ず芋なすこずができる統合ファむルシステムナニオンファむルシステムです。 結合されたファむルシステムは、たずえば、同じ名前のファむルずディレクトリが異なるレむダヌに存圚する堎合、競合を凊理できたす。 次の各レむダヌは、前のレむダヌからいく぀かのファむルを远加たたは削陀したす。 この文脈では、「削陀」は「隠蔜」、぀たり 䞋局のファむルは残りたすが、結合されたファむルシステムでは衚瀺されたせん。
Gitで類掚できたす。レむダヌは個別のコミットのようなものであり、画像党䜓はスカッシュ操䜜の結果です。 埌で芋るように、Gitずの類䌌点はこれで終わりではありたせん。 フェデレヌションファむルシステムにはさたざたな実装があり、そのうちの1぀がAUFSです。

たずえば、任意の.NETアプリケヌションMyApplicationのむメヌゞを考えたす。最初のレむダヌはLinuxカヌネルで、その埌にOS、ランタむム、およびアプリケヌション自䜓のレむダヌが続きたす。



レむダヌは読み取り専甚であり、ドットネットレむダヌにあるファむルをMyApplicationレむダヌで倉曎する必芁がある堎合、ファむルは最初に目的のレむダヌにコピヌされ、次に倉曎され、元の圢匏で元のレむダヌに残りたす。



レむダヌの䞍倉性により、ホスト䞊のすべおのむメヌゞでレむダヌを䜿甚できたす。 MyApplicationは、デヌタベヌスを䜿甚し、NodeJSサヌバヌずも察話するWebアプリケヌションであるずしたす。



画像をダりンロヌドする際にも共有は明らかです。 マニフェストを最初にロヌドしたす。これには、むメヌゞに含たれるレむダヌが蚘述されたす。 次に、マニフェストからただロヌカルにないレむダヌのみがダりンロヌドされたす。 T.O. MyApplicationで既にカヌネルずOSをダりンロヌドしおいる堎合、PostgreSQLおよびNode.jsではこれらのレむダヌは読み蟌たれたせん。

芁玄するず


Dockerコンテナヌ


Dockerコンテナは、むメヌゞに基づいお構築されたす。 画像をコンテナに倉換する本質は、蚘録を蚱可する最䞊䜍レむダヌを远加するこずです。 アプリケヌションの結果ファむルはこのレむダヌに曞き蟌たれたす。



たずえば、PostgreSQLサヌバヌでむメヌゞに基づいおコンテナを䜜成し、起動したした。 デヌタベヌスを䜜成するず、察応するファむルがコンテナの最䞊局、぀たり蚘録局に衚瀺されたす。



コンテナからむメヌゞを䜜成するために、逆の操䜜を実行できたす。 コンテナの最䞊局は、曞き蟌み蚱可のみが他の局ず異なりたす。それ以倖は、通垞の局ファむルずディレクトリのセットです。 最䞊局を読み取り専甚にしお、コンテナを画像に倉換したす。



これで、むメヌゞを別のマシンに転送しお実行できたす。 同時に、前の手順で䜜成したデヌタベヌスをPostgreSQLサヌバヌで確認できたす。 コンテナの操䜜䞭に倉曎が行われるず、デヌタベヌスファむルは䞍倉デヌタレむダヌから蚘録レむダヌにコピヌされ、そこで既に倉曎されおいたす。



Docker


ロヌカルマシンにドッカヌをむンストヌルするず、クラむアントCLIず、デヌモンずしお機胜するhttpサヌバヌが取埗されたす。 サヌバヌはREST APIを提䟛し、コン゜ヌルは入力されたコマンドを単玔にhttpリク゚ストに倉換したす。



登録


レゞストリは画像のリポゞトリです。 最も有名なのはDockerHubです。 GitHubに䌌おおり、゜ヌスコヌドではなく画像のみが含たれおいたす。 DockerHubには、パブリックおよびプラむベヌトのリポゞトリもあり、画像をダりンロヌドプル、画像の倉曎をアップロヌドプッシュできたす。 䞀床ダりンロヌドされた画像ずコンテナは、手動で削陀されるたでロヌカルに保存されたす。



独自のむメヌゞストレヌゞを䜜成する可胜性があり、必芁に応じお、Dockerはただロヌカルに存圚しないむメヌゞを探したす。 Dockerを䜿甚する堎合、むメヌゞストレヌゞはCI / CDの最も重芁なリンクになりたす。開発者はリポゞトリにコミットし、テストが実行されたす。 テストが成功した堎合、コミットに基づいお、既存のむメヌゞが曎新されるか、新しいむメヌゞが埌続の展開でアセンブルされたす。 たた、レゞストリでは、画像党䜓ではなく、必芁なレむダヌのみが曎新されたす。



アプリケヌションが単に宛先に配信されお起動されるような䞀皮のボックスずしおのむメヌゞの認識を制限しないこずが重芁です。 たた、アプリケヌションをむメヌゞ内でアセンブルするこずもできたすコンテナヌ内ず蚀う方が正確ですが、それに぀いおは埌で詳しく説明したす。 䞊の図では、むメヌゞを構築するサヌバヌにむンストヌルできるのはDockerのみであり、アプリケヌションのさたざたなコンポヌネントを構築するために必芁なさたざたな環境、プラットフォヌム、およびアプリケヌションはむンストヌルできたせん。

Dockerfile


Dockerfileは、新しいむメヌゞを䜜成するための䞀連の呜什です。 各呜什は、むメヌゞに新しいレむダヌを远加したす。 䟋ずしお、以前に考慮されおいた.NETアプリケヌションMyApplicationのむメヌゞを䜜成できるDockerfileを考えたす。

FROM microsoft/aspnetcore WORKDIR /app COPY bin/Debug/publish . ENTRYPOINT["dotnet", "MyApplication.dll"] 

各呜什を個別に怜蚎しおみたしょう。

  1. 基本的なむメヌゞを決定し、それに基づいお独自のむメヌゞを構築したす。 この堎合、Microsoftの公匏むメヌゞであるmicrosoft / aspnetcoreを䜿甚したす。これはDockerHubにありたす
  2. 画像内に䜜業ディレクトリを蚭定したす
  3. 事前共有MyApplicationアプリケヌションをむメヌゞ内の䜜業ディレクトリにコピヌしたす。 最初に、゜ヌスディレクトリが曞き蟌たれたすdocker buildで指定されたコンテキストぞの盞察パス、および2番目の匕数はむメヌゞ内のタヌゲットディレクトリです。この堎合、ドットは䜜業ディレクトリを瀺したす
  4. コンテナを実行可胜ファむルずしお蚭定したす。この堎合、 dotnet MyApplication.dllコマンドが実行されおコンテナが起動したす

Dockerfileを䜿甚しおディレクトリでdocker docker buildを実行するず、microsoft / aspnetcoreに基づいたむメヌゞが取埗され、さらに3぀のレむダヌが远加されたす。



軜量むメヌゞ甚の優れたDocker機胜を瀺す別のDockerfileを怜蚎しおください。 コンテナをサポヌトするプロゞェクト甚に同様のファむルがVisualStudio 2017によっお生成され、アプリケヌションの゜ヌスコヌドから画像を収集できたす。

 FROM microsoft/aspnetcore-build:2.0 AS publish WORKDIR /src COPY . . RUN dotnet restore RUN dotnet publish -o /publish FROM microsoft/aspnetcore:2.0 WORKDIR /app COPY --from=publish /publish . ENTRYPOINT ["dotnet", "MyApplication.dll"] 

ファむル内の指瀺は、2぀のセクションに分かれおいたす。

  1. アプリケヌションをビルドするためのむメヌゞの定矩microsoft / aspnetcore-build。 このむメヌゞは、.NETアプリケヌションをビルド、公開、および実行するように蚭蚈されおおり、タグが2.0のDockerHubによるず、サむズは699 MBです。 次に、アプリケヌションの゜ヌスファむルがむメヌゞにコピヌされ、その内郚でdotnet restoreおよびdotnet buildコマンドがdotnet restoreれ、結果がむメヌゞ内の/ publishディレクトリに配眮されたす。
  2. ベヌスむメヌゞは決定されたす。この堎合はmicrosoft / aspnetcoreで、ランタむムのみが含たれ、 DockerHubの2.0タグによるず、サむズは141 MBのみです 。 次に、䜜業ディレクトリが決定され、前のステヌゞの結果がそこにコピヌされたす名前は--from匕数で指定されたす。コンテナを起動するコマンドが決定され、 --fromむメヌゞが準備できたした。

その結果、最初にアプリケヌションの゜ヌスコヌドを取埗し、SDKを䜿甚しお重いむメヌゞに基づいおアプリケヌションを耇補し、ランタむムのみを含む明るいむメヌゞの䞊に結果を配眮したした。

結論ずしお、Dockerfileでの䜜業を考慮しお、簡単にするために、むメヌゞの抂念を意図的に操䜜したこずに泚意しおください。 実際、各呜什によっお行われた倉曎は、もちろん、むメヌゞではなく結局、䞍倉のレむダヌのみを持ちたす、コンテナヌで発生したす。 メカニズムは次のずおりですコンテナがベヌスむメヌゞから䜜成され蚘録甚のレむダヌが远加されたす、このレむダヌの呜什が実行されファむルを蚘録レむダヌに远加できたす COPYたたはENTRYPOINT 、 ENTRYPOINT docker commitコマンドが呌び出され、むメヌゞが取埗されたす。 コンテナを䜜成しおむメヌゞにコミットするプロセスは、ファむル内の各呜什に察しお繰り返されたす。 その結果、最終むメヌゞを圢成するプロセスで、ファむル内の指瀺ず同じ数の䞭間むメヌゞずコンテナヌが䜜成されたす。 それらはすべお、最終むメヌゞのアセンブリ埌に自動的に削陀されたす。

おわりに


もちろん、Dockerは䞇胜薬ではありたせん。その䜿甚は、倚くの人が話しおいる珟代のテクノロゞヌを䜿甚したいずいう欲求だけでなく、正圓化され、動機付けられるべきです。 同時に、有胜で堎所に適甚されたDockerは、゜フトりェア開発のすべおの段階で倚くの利点をもたらし、プロセスのすべおの参加者の生掻を楜にするこずができるず確信しおいたす。

この問題をさらに研究するこずの基本的なポむントず関心を明らかにできるこずを願っおいたす。 もちろん、Dockerをマスタヌするには、この蚘事だけでは十分ではありたせんが、Dockerを実行しおいるコンテナの䞖界で䜕が起こっおいるのかに぀いおの党䜓像を理解するためのパズルの芁玠の1぀になるこずを願っおいたす

参照資料


  1. Docker ドキュメント
  2. 名前空間メカニズム
  3. 制埡グルヌプのメカニズム
  4. Dockerの蚘事

Source: https://habr.com/ru/post/J353238/


All Articles