Dockerとは何ですか?コンテナ革命の火花

Dockerは、コンテナーに基づいてアプリケーションを構築するためのソフトウェアプラットフォームです。これは、オペレーティングシステムカーネルを共有して使用するが、それ以外の場合は互いに分離して実行される、小型で軽量の実行環境です。概念としてのコンテナーはしばらく前から存在していましたが、2013年に開始されたオープンソースプロジェクトであるDockerは、テクノロジーの普及に役立ち 、クラウドネイティブとして知られるようになったソフトウェア開発におけるコンテナー化マイクロサービスへのトレンドを推進するのに役立ちました。開発。

コンテナとは何ですか?

最新のソフトウェア開発の目標の1つは、同じホストまたはクラスター上のアプリケーションを互いに分離して、互いの操作や保守に過度に干渉しないようにすることです。パッケージ、ライブラリ、およびそれらを実行するために必要なその他のソフトウェアコンポーネントのおかげで、これは難しい場合があります。この問題の解決策の1つは、同じハードウェア上のアプリケーションを完全に分離し、ソフトウェアコンポーネント間の競合やハードウェアリソースの競合を最小限に抑える仮想マシンです。ただし、仮想マシンはかさばり、それぞれに独自のOSが必要なため、通常はギガバイトのサイズであり、保守とアップグレードが困難です。

対照的に、コンテナはアプリケーションの実行環境を互いに分離しますが、基盤となるOSカーネルを共有します。これらは通常、メガバイト単位で測定され、VMよりもはるかに少ないリソースを使用し、ほぼ即座に起動します。彼らは、同じハードウェア上ではるかに高密度に充填し、スピンアップとダウンすることができ大挙はるかに少ない労力やオーバーヘッドで。コンテナは、ソフトウェアコンポーネントを現代の企業で必要とされる種類のアプリケーションおよびサービススタックに結合し、それらのソフトウェアコンポーネントを更新および維持するための、非常に効率的で非常にきめ細かいメカニズムを提供します。

Docker

Dockerとは何ですか?

Dockerは、コンテナーとコンテナーベースのアプリを簡単に作成できるようにするオープンソースプロジェクトです。Dockerは元々Linux用に構築されていましたが、現在はWindowsとMacOSでも動作します。Dockerがどのように機能するかを理解するために、Dockerコンテナ化されたアプリケーションを作成するために使用するコンポーネントのいくつかを見てみましょう。

Dockerfile

各DockerコンテナはDockerfileで始まります。Dockerfileは、理解しやすい構文で記述されたテキストファイルであり、Dockerイメージを構築するための手順が含まれています(これについては後で詳しく説明します)。Dockerfileは、コンテナーの基礎となるオペレーティングシステムを、言語、環境変数、ファイルの場所、ネットワークポート、および必要なその他のコンポーネントとともに指定します。もちろん、コンテナーを実行すると、コンテナーが実際に実行することも指定します。

ITNextのPaigeNiedringhausは、Dockerfileの構文の優れた内訳を持っています。

Dockerイメージ

Dockerfilebuildを作成したら、Dockerユーティリティを呼び出して、そのDockerfileに基づいてイメージを作成します。Dockerfileはbuildイメージの作成方法を指示する一連の命令ですが、Dockerイメージは、コンテナーが実行されるソフトウェアコンポーネントとその方法の仕様を含むポータブルファイルです。Dockerfileには、オンラインリポジトリから一部のソフトウェアパッケージを取得する手順が含まれている可能性があるため、適切なバージョンを明示的に指定するように注意する必要があります。そうしないと、Dockerfileが呼び出されるタイミングによっては一貫性のないイメージが生成される可能性があります。ただし、イメージが作成されると、静的になります。Codefreshは、イメージを構築する方法をより詳細に説明しています。

Dockerの実行

Dockerのrunユーティリティは、実際にコンテナを起動するコマンドです。各コンテナはイメージのインスタンスです。コンテナは一時的かつ一時的に設計されていますが、停止して再起動することもできます。これにより、コンテナは停止時と同じ状態になります。さらに、同じイメージの複数のコンテナインスタンスを同時に実行できます(各コンテナに一意の名前がある場合)。コードレビューには、runコマンドのさまざまなオプションの詳細が記載されており、コマンドがどのように機能するかを理解できます。

DockerHub

コンテナの構築は簡単ですが、すべてのイメージを最初から構築する必要があるとは思わないでください。Docker Hubは、コンテナーを共有および管理するためのSaaSリポジトリであり、オープンソースプロジェクトおよびソフトウェアベンダーからの公式のDockerイメージと、一般の人々からの非公式のイメージを見つけることができます。便利なコードを含むコンテナイメージをダウンロードするか、独自のコードをアップロードするか、オープンに共有するか、代わりにプライベートにすることができます。必要に応じて、ローカルのDockerレジストリを作成することもできます。(Docker Hubには、過去にバックドアが組み込まれた状態でアップロードされた画像に問題がありました。)

Dockerエンジン

Docker Engineは、コンテナーを作成および実行する基盤となるクライアントサーバーテクノロジーであるDockerのコアです。一般的に言って、誰かがDockerを一般的に言って、会社やプロジェクト全体について話していない場合、それらはDockerEngineを意味します。Docker Engineには、Docker EngineEnterpriseとDockerEngineCommunityの2つの異なるバージョンが提供されています。

Docker CommunityEdition

Dockerは2017年にEnterpriseEditionをリリースしましたが、Docker Community Editionに名前が変更された元の製品はオープンソースのままで無料であり、その過程で機能が失われることはありませんでした。代わりに、ノードあたり年間1,500ドルの費用がかかるEnterprise Editionは、クラスターとイメージの管理の制御、脆弱性の監視などの高度な管理機能を追加しました。BoxBoatブログには、エディション間の違いの概要があります。

Dockerがコンテナの世界を征服した方法

特定のプロセスを他のオペレーティング環境からある程度分離して実行できるという考えは、BSDやSolarisなどのUnixオペレーティングシステムに何十年も組み込まれています。オリジナルのLinuxコンテナテクノロジーであるLXCは、単一のホスト上で複数の分離されたLinuxシステムを実行するためのOSレベルの仮想化手法です。 LXCは、2つのLinux機能によって可能になりました。名前空間。システムリソースのセットをラップし、プロセスに提示して、そのプロセス専用のように見せます。およびcgroupsは、プロセスのグループのCPUやメモリなどのシステムリソースの分離と使用を管理します。

コンテナーは、アプリケーションをオペレーティングシステムから切り離します。つまり、ユーザーはクリーンで最小限のLinuxオペレーティングシステムを使用して、他のすべてを1つ以上の分離されたコンテナーで実行できます。また、オペレーティングシステムはコンテナーから抽象化されているため、コンテナーランタイム環境をサポートする任意のLinuxサーバー間でコンテナーを移動できます。

DockerはLXCにいくつかの重要な変更を導入し、コンテナーをよりポータブルで柔軟に使用できるようにしました。Dockerコンテナーを使用すると、仮想マシンを使用する場合よりもさらに迅速かつ簡単にワークロードをデプロイ、複製、移動、およびバックアップできます。Dockerは、コンテナーを実行できるインフラストラクチャにクラウドのような柔軟性をもたらします。DockerのコンテナイメージツールもLXCよりも進歩しており、開発者はイメージのライブラリを構築し、複数のイメージからアプリケーションを作成し、ローカルまたはリモートのインフラストラクチャでそれらのコンテナとアプリケーションを起動できます。

Docker Compose、Docker Swarm、Kubernetes

Dockerを使用するとコンテナー間の動作の調整も簡単になり、コンテナーをつなぎ合わせてアプリケーションスタックを構築できます。 Docker Composeは、マルチコンテナーアプリケーションの開発とテストのプロセスを簡素化するためにDockerによって作成されました。これは、Dockerクライアントを彷彿とさせるコマンドラインツールであり、特別にフォーマットされた記述子ファイルを取り込んで、複数のコンテナーからアプリケーションをアセンブルし、単一のホスト上で協調して実行します。 (詳細については、のDocker Composeチュートリアルを確認してください。)

これらの動作のより高度なバージョン(コンテナオーケストレーションと呼ばれる)は、DockerSwarmやKubernetesなどの他の製品によって提供されます。しかし、Dockerは基本を提供します。SwarmはDockerプロジェクトから生まれましたが、Kubernetesは事実上のDockerオーケストレーションプラットフォームとして選ばれています。

Dockerの利点

Dockerコンテナーは、従来のコンテナーよりも組み立て、保守、および移動が容易なエンタープライズおよび基幹業務アプリケーションを構築する方法を提供します。 

Dockerコンテナーにより、分離とスロットルが可能になります

Dockerコンテナーは、アプリを相互に分離するだけでなく、基盤となるシステムからも分離します。これにより、ソフトウェアスタックがクリーンになるだけでなく、特定のコンテナ化されたアプリケーションがシステムリソース(CPU、GPU、メモリ、I / O、ネットワーキングなど)をどのように使用するかを簡単に決定できます。また、データとコードを分離しておくことも簡単になります。(以下の「Dockerコンテナーはステートレスで不変です」を参照してください。)

Dockerコンテナは移植性を可能にします

Dockerコンテナーは、コンテナーのランタイム環境をサポートする任意のマシンで実行されます。アプリケーションをホストオペレーティングシステムに関連付ける必要がないため、アプリケーション環境と基盤となるオペレーティング環境の両方をクリーンで最小限に抑えることができます。

たとえば、MySQL for Linuxコンテナは、コンテナをサポートするほとんどすべてのLinuxシステムで実行されます。アプリのすべての依存関係は、通常、同じコンテナーで提供されます。

コンテナベースのアプリは、ターゲットシステムがDockerと、Dockerで使用されている可能性のあるサードパーティのツール(次のような)をサポートしている限り、オンプレミスシステムからクラウド環境または開発者のラップトップからサーバーに簡単に移動できます。 Kubernetes(以下の「Dockerコンテナによりオーケストレーションとスケーリングが容易になる」を参照)。

通常、Dockerコンテナイメージは特定のプラットフォーム用にビルドする必要があります。たとえば、WindowsコンテナはLinuxでは実行できません。その逆も同様です。以前は、この制限を回避する1つの方法は、必要なオペレーティングシステムのインスタンスを実行する仮想マシンを起動し、仮想マシンでコンテナーを実行することでした。

ただし、Dockerチームは、マニフェストと呼ばれるより洗練されたソリューションを考案しました 。これにより、複数のオペレーティングシステムのイメージを同じイメージに並べてパックできます。マニフェストはまだ実験的なものと見なされていますが、コンテナがクロスプラットフォームアプリケーションソリューションおよびクロス環境ソリューションになる方法を示唆しています。 

Dockerコンテナは構成可能性を可能にします

ほとんどのビジネスアプリケーションは、スタックに編成されたいくつかの個別のコンポーネント(Webサーバー、データベース、メモリ内キャッシュ)で構成されています。コンテナは、これらの部品を簡単に交換可能な部品を備えた機能ユニットに構成することを可能にします。各ピースは異なるコンテナーによって提供され、他のピースとは独立して保守、更新、交換、および変更できます。

これは本質的に、アプリケーション設計のマイクロサービスモデルです。マイクロサービスモデルは、アプリケーションの機能を個別の自己完結型サービスに分割することで、従来の開発プロセスや柔軟性のないモノリシックアプリを遅らせるための解毒剤を提供します。軽量でポータブルなコンテナーにより、マイクロサービスベースのアプリケーションの構築と保守が容易になります。

Dockerコンテナーは、オーケストレーションとスケーリングを容易にします

コンテナーは軽量でオーバーヘッドがほとんどないため、特定のシステムでさらに多くのコンテナーを起動することができます。ただし、コンテナーを使用して、システムのクラスター全体でアプリケーションを拡張したり、サービスを増減して需要の急増に対応したり、リソースを節約したりすることもできます。

コンテナーのデプロイメント、管理、およびスケーリングのためのツールの最もエンタープライズグレードのバージョンは、サードパーティのプロジェクトによって提供されます。その中で最も重要なのは、GoogleのKubernetesです。これは、コンテナのデプロイ方法とスケーリング方法だけでなく、コンテナの接続方法、負荷分散方法、管理方法も自動化するシステムです。Kubernetesは、マルチコンテナアプリケーション定義または「ヘルムチャート」を作成して再利用する方法も提供するため、複雑なアプリスタックをオンデマンドで構築および管理できます。

Dockerには、独自の組み込みオーケストレーションシステムであるSwarmモードも含まれています。これは、それほど要求の厳しいケースでも引き続き使用されます。そうは言っても、Kubernetesはデフォルトの選択肢になっています。実際、KubernetesはDocker EnterpriseEditionにバンドルされています。

Dockerの警告

コンテナは非常に多くの問題を解決しますが、すべてを解決できるわけではありません。それらの欠点のいくつかは設計によるものですが、他の欠点はそれらの設計の副産物です。

Dockerコンテナは仮想マシンではありません

コンテナに関して人々が犯す最も一般的な概念上の間違いは、コンテナを仮想マシンと同一視することです。ただし、コンテナと仮想マシンは異なる分離メカニズムを使用するため、明らかに異なる長所と短所があります。

仮想マシンは、オペレーティングシステムの独自のインスタンスで実行されるため、プロセスを高度に分離します。そのオペレーティングシステムは、ホストで実行されているものと同じである必要もありません。Windows仮想マシンはLinuxハイパーバイザーで実行でき、その逆も可能です。

対照的に、コンテナはホストオペレーティングシステムのリソースの制御された部分を使用します。多くのアプリケーションは、高度に管理された方法で同じOSカーネルを共有します。その結果、コンテナー化されたアプリは仮想マシンほど完全に分離されていませんが、大部分のワークロードに対して十分な分離を提供します。

Dockerコンテナーはベアメタル速度を提供しません