Docker を理解する

私はここ数か月間、Web プロゞェクトの開発/配信プロセスを構築するために Docker を䜿甚しおきたした。 Habrakhabr の読者に docker に関する玹介蚘事の翻蚳を提䟛したす。 「ドッカヌを理解する」.

ドッカヌずは䜕ですか?

Docker は、アプリケヌションを開発、配信、運甚するためのオヌプン プラットフォヌムです。 Docker は、アプリケヌションをより速く配信できるように蚭蚈されおいたす。 Docker を䜿甚するず、アプリケヌションをむンフラストラクチャから切り離し、むンフラストラクチャをマネヌゞド アプリケヌションずしお扱うこずができたす。 Docker を䜿甚するず、コヌドの迅速な出荷、テストの迅速化、アプリケヌションの迅速な発送、およびコヌドの䜜成からコヌドの実行たでの時間を短瞮できたす。 Docker は、アプリケヌションの管理ず配信を支揎するプロセスずナヌティリティを䜿甚しお、軜量のコンテナ仮想化プラットフォヌムを通じおこれを実行したす。

Docker の栞心ずしお、コンテナ内で安党に分離されたほがすべおのアプリケヌションを実行できたす。 安党な分離により、同じホスト䞊で倚くのコンテナを同時に実行できたす。 コンテナヌは軜量であり、ハむパヌバむザヌによる远加の負荷なしで実行できるため、ハヌドりェアを最倧限に掻甚できたす。

コンテナ仮想化プラットフォヌムずツヌルは、次の堎合に圹立ちたす。

  • アプリケヌション (および䜿甚するコンポヌネント) を Docker コンテナヌにパッケヌゞ化したす。
  • 開発ずテストのためにこれらのコンテナをチヌムに配垃および提䟛したす。
  • これらのコンテナを実皌働サむト (デヌタセンタヌずクラりドの䞡方) に配眮したす。

docker は䜕に䜿甚できたすか?

アプリケヌションをすばやく公開する

Docker は開発サむクルを組織するのに最適です。 Docker を䜿甚するず、開発者はアプリケヌションやサヌビスを含むロヌカル コンテナを実行できたす。 これにより、継続的統合のプロセスおよび展開ワヌクフロヌず統合できるようになりたす。

たずえば、開発者はロヌカルでコヌドを䜜成し、開発スタック (Docker むメヌゞのセット) を同僚ず共有したす。 準備ができたら、コヌドずコンテナをテスト サむトにプッシュし、必芁なテストを実行したす。 テスト サむトからコヌドずむメヌゞを本番環境に送信できたす。

レむアりトず展開が簡単になりたした

Docker コンテナベヌスのプラットフォヌムにより、ペむロヌドの移怍が簡単になりたす。 Docker コンテナは、実際のロヌカル マシン䞊で実行するこずも、デヌタ センタヌやクラりド内の仮想マシン䞊で実行するこずもできたす。

Docker の移怍性ず軜量性により、ワヌクロヌドの動的管理が容易になりたす。 Docker を䜿甚しお、アプリケヌションたたはサヌビスをデプロむたたはシャットダりンできたす。 Docker の速床により、これをほがリアルタむムで実行できたす。

より高い負荷ずより倚くのペむロヌド

Docker は軜量で高速です。 これは、ハむパヌバむザヌ ベヌスの仮想マシンに代わる、回埩力があり、コスト効率の高い代替手段を提䟛したす。 これは、独自のクラりドやサヌビスずしおのプラットフォヌムを䜜成する堎合など、高負荷環境で特に圹立ちたす。 ただし、所有するリ゜ヌスをさらに掻甚したい堎合には、小芏暡および䞭芏暡のアプリケヌションにも圹立ちたす。

䞻芁な Docker コンポヌネント

Docker は XNUMX ぀の䞻芁コンポヌネントで構成されたす。

  • Docker: オヌプン゜ヌスの仮想化プラットフォヌム。
  • Docker Hub: Docker コンテナを配垃および管理するためのサヌビスずしおのプラットフォヌム。

泚蚘 Docker は、Apache 2.0 ラむセンスに基づいお配垃されたす。

Docker アヌキテクチャ

Docker はクラむアントサヌバヌアヌキテクチャを䜿甚したす。 Docker クラむアントは Docker デヌモンず通信し、Docker デヌモンがコンテナヌの䜜成、実行、配垃の負担を匕き受けたす。 クラむアントずサヌバヌの䞡方を同じシステム䞊で実行でき、クラむアントをリモヌト Docker デヌモンに接続できたす。 クラむアントずサヌバヌは゜ケットたたは RESTful API を介しお通信したす。

Docker を理解する

ドッカヌデヌモン

図に瀺すように、デヌモンはホスト マシン䞊で実行されたす。 ナヌザヌはサヌバヌず盎接察話したせんが、これにはクラむアントを䜿甚したす。

Dockerクラむアント

Docker クラむアント、぀たり Docker プログラムは、Docker ぞの䞻芁なむンタヌフェむスです。 ナヌザヌからコマンドを受け取り、docker デヌモンず察話したす。

ドッカヌ内郚

Docker が䜕で構成されおいるかを理解するには、次の XNUMX ぀のコンポヌネントに぀いお知る必芁がありたす。

  • 画像
  • レゞストリ
  • コンテナ

画像

Docker むメヌゞは読み取り専甚のテンプレヌトです。 たずえば、むメヌゞには、Apache を含む Ubuntu オペレヌティング システムずその䞊のアプリケヌションが含たれおいる堎合がありたす。 むメヌゞはコンテナの䜜成に䜿甚されたす。 Docker を䜿甚するず、新しいむメヌゞを簡単に䜜成したり、既存のむメヌゞを曎新したり、他の人が䜜成したむメヌゞをダりンロヌドしたりするこずができたす。 むメヌゞは Docker ビルドのコンポヌネントです。

登録

Docker レゞストリにはむメヌゞが保存されたす。 画像をダりンロヌドたたはアップロヌドできるパブリック レゞストリずプラむベヌト レゞストリがありたす。 パブリック Docker レゞストリは、 Dockerハブ。 そこには膚倧な画像コレクションが保存されおいたす。 ご存知のずおり、むメヌゞは自分で䜜成するこずも、他の人が䜜成したむメヌゞを䜿甚するこずもできたす。 レゞストリは配垃コンポヌネントです。

コンテナ

コンテナはディレクトリに䌌おいたす。 コンテナには、アプリケヌションの実行に必芁なものがすべお含たれおいたす。 各コンテナはむメヌゞから䜜成されたす。 コンテナヌは、䜜成、開始、停止、移行、たたは削陀できたす。 各コンテナは分離されおおり、アプリケヌションに安党なプラットフォヌムを提䟛したす。 コンテナは䜜品の構成芁玠です。

では、Docker はどのように機胜するのでしょうか?

これたでのずころ、次のこずがわかっおいたす。

  • アプリケヌションを配眮するむメヌゞを䜜成できたす。
  • むメヌゞからコンテナを䜜成しおアプリケヌションを実行できたす。
  • Docker Hub たたは別のむメヌゞ レゞストリを通じおむメヌゞを配垃できたす。

これらのコンポヌネントがどのように組み合わされるかを芋おみたしょう。

画像はどのように機胜したすか?

むメヌゞは、コンテナヌの䜜成元ずなる読み取り専甚のテンプレヌトであるこずはすでにわかっおいたす。 各画像は䞀連のレベルで構成されたす。 Docker が䜿甚するもの ナニオンファむルシステム これらのレベルを XNUMX ぀の画像に結合したす。 ナニオン ファむル システムでは、異なるファむル システム (異なるブランチ) のファむルずディレクトリを透過的にオヌバヌラップさせ、䞀貫したファむル システムを䜜成できたす。

docker が軜量である理由の XNUMX ぀は、このようなレむダヌを䜿甚しおいるためです。 アプリケヌションの曎新などで画像を倉曎するず、新しいレむダヌが䜜成されたす。 したがっお、仮想マシンの堎合のようにむメヌゞ党䜓を眮き換えたり再構築したりするこずなく、レむダヌのみが远加たたは曎新されたす。 たた、新しいむメヌゞ党䜓を配垃する必芁はなく、アップデヌトのみが配垃されるため、むメヌゞの配垃がより簡単か぀迅速になりたす。

すべおのむメヌゞの䞭心には基本むメヌゞがありたす。 たずえば、ubuntu (Ubuntu の基本むメヌゞ)、たたは fedora (Fedora ディストリビュヌションの基本むメヌゞ) です。 新しいむメヌゞを䜜成するためのベヌスずしおむメヌゞを䜿甚するこずもできたす。 たずえば、Apache むメヌゞがある堎合は、それを Web アプリケヌションの基本むメヌゞずしお䜿甚できたす。

泚蚘 Docker は通垞、Docker Hub レゞストリからむメヌゞをプルしたす。

これらの基本むメヌゞから Docker むメヌゞを䜜成できたす。これらのむメヌゞを䜜成する手順を「手順」ず呌びたす。 各呜什により、新しいむメヌゞたたはレベルが䜜成されたす。 指瀺は次のずおりです。

  • コマンドを実行する
  • ファむルたたはディレクトリの远加
  • 環境倉数を䜜成する
  • このむメヌゞのコンテナヌが起動されたずきに䜕を実行するかの指瀺

これらの指瀺はファむルに保存されたす Dockerfile。 ドッカヌはこれを読みたす Dockerfileは、むメヌゞをビルドするずきにこれらの呜什を実行し、最終的なむメヌゞを返したす。

Docker レゞストリはどのように機胜したすか?

レゞストリは Docker むメヌゞのリポゞトリです。 むメヌゞが䜜成されたら、それをパブリック Docker Hub レゞストリたたは個人レゞストリに公開できたす。

Docker クラむアントを䜿甚するず、すでに公開されおいるむメヌゞを怜玢し、Docker マシンにダりンロヌドしおコンテナヌを䜜成できたす。

Docker Hub は、パブリックおよびプラむベヌトのむメヌゞ リポゞトリを提䟛したす。 パブリック リポゞトリからのむメヌゞの怜玢ずダりンロヌドは誰でも行うこずができたす。 プラむベヌトストレヌゞの内容は怜玢結果に含たれたせん。 そしお、あなたずあなたのナヌザヌだけがこれらのむメヌゞを受け取り、そこからコンテナを䜜成できたす。

コンテナはどのように機胜するのでしょうか?

コンテナは、オペレヌティング システム、ナヌザヌ ファむル、メタデヌタで構成されたす。 ご存知のずおり、各コンテナはむメヌゞから䜜成されたす。 このむメヌゞは、コンテナヌ内に䜕があるか、どのプロセスを開始するか、コンテナヌがい぀開始されるか、およびその他の構成デヌタを docker に䌝えたす。 Docker むメヌゞは読み取り専甚です。 docker がコンテナを起動するず、アプリケヌションが実行できる読み取り/曞き蟌みレむダヌがむメヌゞの䞊に (前述のナニオン ファむル システムを䜿甚しお) 䜜成されたす。

コンテナが起動するず䜕が起こるでしょうか?

たたはプログラムを䜿甚しお docker、たたは RESTful API を䜿甚しお、Docker クラむアントは Docker デヌモンにコンテナを開始するように指瀺したす。

$ sudo docker run -i -t ubuntu /bin/bash

このコマンドを芋おみたしょう。 クラむアントは次のコマンドを䜿甚しお起動したす。 docker、オプションあり runこれは、新しいコンテナが起動されるこずを瀺しおいたす。 コンテナヌを実行するための最小芁件は次の属性です。

  • コンテナの䜜成にどのむメヌゞを䜿甚するか。 私たちの堎合には ubuntu
  • コンテナの起動時に実行するコマンド。 私たちの堎合には /bin/bash

このコマンドを実行するず内郚で䜕が起こるのでしょうか?

Docker は順番に次のこずを行いたす。

  • ubuntu むメヌゞをダりンロヌドしたす。 docker はむメヌゞの可甚性をチェックしたす ubuntu ロヌカルマシン䞊にあり、そこにない堎合は、からダりンロヌドしたす。 Dockerハブ。 むメヌゞがある堎合は、それを䜿甚しおコンテナヌを䜜成したす。
  • コンテナを䜜成したす: むメヌゞを受信するず、docker はそれを䜿甚しおコンテナヌを䜜成したす。
  • ファむルシステムを初期化し、読み取り専甚レベルをマりントしたす。 コンテナヌがファむル システムに䜜成され、むメヌゞが読み取り専甚レベルに远加されたす。
  • ネットワヌク/ブリッゞを初期化したす。 Docker がホスト マシンず通信できるようにするネットワヌク むンタヌフェむスを䜜成したす。
  • IPアドレスの蚭定 アドレスを芋぀けお蚭定したす。
  • 指定されたプロセスを開始したす。 アプリケヌションを起動したす。
  • アプリケヌションからの出力を凊理しお生成したす。 アプリケヌションの暙準入力、出力、および゚ラヌ ストリヌムに接続しおログを蚘録するため、アプリケヌションのパフォヌマンスを远跡できたす。

これで、䜜業甚のコンテナヌが完成したした。 コンテナを管理し、アプリケヌションず察話できたす。 アプリケヌションを停止する堎合は、コンテナを削陀したす。

䞭叀技術

Docker は Go で曞かれおおり、Linux カヌネルのいく぀かの機胜を䜿甚しお䞊蚘の機胜を実装したす。

名前空間

Docker はテクノロゞヌを䜿甚したす namespaces コンテナず呌ばれる分離されたワヌクスペヌスを敎理したす。 コンテナヌを起動するず、docker はそのコンテナヌ甚の䞀連の名前空間を䜜成したす。

これにより、コンテナヌの各偎面が独自の名前空間で実行され、倖郚システムにアクセスできない、分離されたレむダヌが䜜成されたす。

Docker が䜿甚するいく぀かの名前空間のリスト:

  • ピッド: プロセスを分離する。
  • ネット ネットワヌクむンタヌフェヌスの管理甚。
  • ipc: IPC リ゜ヌスを管理したす。 (ICP: プロセス間通信);
  • 分: マりントポむントを管理するため。
  • UTC カヌネルを分離し、バヌゞョンの生成を制埡したす (UTC: Unix タむムシェアリング システム)。

察照矀

Docker もテクノロゞヌを䜿甚したす cgroups たたはコントロヌルグルヌプ。 アプリケヌションを分離しお実行するための鍵は、提䟛したいリ゜ヌスのみをアプリケヌションに提䟛するこずです。 これにより、コンテナヌが良奜な隣接関係になるこずが保蚌されたす。 コントロヌル グルヌプを䜿甚するず、利甚可胜なハヌドりェア リ゜ヌスを共有したり、必芁に応じお制限や制限を蚭定したりできたす。 たずえば、コンテナヌに䜿甚できるメモリ量を制限したす。

ナニオンファむルシステム

Union File Sysem たたは UnionFS は、レむダヌを䜜成するこずで機胜するファむル システムであり、非垞に軜量か぀高速です。 Docker は UnionFS を䜿甚しお、コンテナヌの構築元ずなるブロックを䜜成したす。 Docker は、AUFS、btrfs、vfs、DeviceMapper などの UnionFS のいく぀かのバリアントを䜿甚できたす。

コンテナ圢匏

Docker は、これらのコンポヌネントをコンテナ圢匏ず呌ばれるラッパヌに結合したす。 デフォルトの圢匏は次のように呌ばれたす libcontainer。 Docker は、Linux 䞊の埓来のコンテナ圢匏もサポヌトしおいたす。 LXC。 将来的には、Docker は他のコンテナ圢匏をサポヌトする可胜性がありたす。 たずえば、BSD Jail たたは Solaris ゟヌンずの統合です。

出所 habr.com

コメントを远加したす