Docker入門: Docker のコンポーネント
現代のITにおいて最も重要なテクノロジーの一覧を作るとしたら、Dockerはほぼ間違いなくその中に含まれるでしょう。軽量コンテナへのアプリケーションのデプロイを容易にすることで、Dockerは多くの組織におけるアプリケーションのデリバリーとデプロイサイクルの管理方法を転換し、「クラウドネイティブ」の時代を先導する上で重要な役割を果たしました。
本記事では、Dockerの仕組み、Dockerの基本概念、Dockerのアーキテクチャ、そしてDockerが他のソフトウェアデプロイメント技術やテクノロジーと類似している点や異なる点について説明し、Dockerが革新的である理由を解説します。
Dockerとは?
Dockerは、ソフトウェアコンテナ内のアプリケーションのデプロイを自動化するオープンソースプラットフォームです。開発者は、アプリケーションとその依存関係を単一のコンテナにパッケージ化し、さまざまなコンピューティング環境に迅速かつ確実にデプロイすることができます。Dockerコンテナは、オンプレミスのデータセンターからパブリッククラウドまで、あらゆるインフラストラクチャ上でアプリケーションをパッケージ化、配布、実行するための効率的な方法を提供します。
DockerとVMやベアメタルサーバーとの比較
Dockerが注目されているのは、これまで多くのチームがアプリケーションをデプロイし実行する現実的な方法として、仮想マシン(VM)内またはベアメタルサーバー上で運用するしかなく、どちらもDockerに比べ多くの面で劣っていたからです。
VM(ベアメタルサーバーよりも柔軟性が高い)と比較すると、DockerはスタンドアローンのゲストOSを実行するのではなく、多くのリソースをホストOSと共有するため、より効率的にリソースを使用します。また、ベアメタルサーバー(VMよりもリソース消費の観点で効率的)と比較すると、Dockerは、すべてのアプリケーションを共有物理サーバー上で並行して実行する必要がなく、各アプリケーションを独自の軽量環境で実行できるため、アプリケーション間の柔軟性と分離性が高くなります。
このように、Dockerは両方の長所を活かしたアクセス;つまりVMの柔軟性と俊敏性、そしてベアメタルサーバーの効率性を提供します
Dockerコンテナは、VMまたはベアメタルサーバーのいずれの上でも実行できる(詳細は後述)ため、DockerはVMやベアメタルの代替というよりも、むしろ補完的な存在であることに注目すべきでしょう。しかし、Dockerを使用することで、エンジニアはアプリケーションのホスティングにVMやベアメタルサーバーだけに頼るよりも、より多くの選択肢と柔軟性を得ることができます。
Docker と他のコンテナプラットフォームとの比較
Docker の前に、コンテナ内でソフトウェアを実行可能にしたプラットフォームとして、Linux ベースのオペレーティングシステム用のコンテナランタイムである LXC などの技術が存在していました。(LXC は当初 Docker でも使用されていましたが、Docker は後に独自のランタイムを開発しました。) FreeBSDのjails、Solaris Zones、そして1970年代まで遡るUnixのchroot機能も、コンテナを使用してアプリケーションをパッケージ化し実行する方法を提供しています。
しかし、2013年にオープンソースプラットフォームとしてリリースされたDockerは、類似の技術と比べて際立っています。なぜなら、Dockerはコンテナプラットフォームとして初めて広く採用されたからです。LXCやFreeBSDのjailsのようなソリューションは、小規模な開発者コミュニティ以外では多くの採用には至りませんでした。
Docker が類似の技術とは異なり、なぜこれほど人気を博したのかについては議論の余地がありますが、おそらく最も重要な要因は、Docker が初めてユーザーフレンドリーなコンテナツールを提供したことです。Docker プラットフォームには、開発者や IT 運用エンジニアがコンテナ内でアプリケーションを構築、デプロイ、実行するために必要なすべてのツールが、多くの場合、わずか数個のコマンドで利用可能でした。他のコンテナプラットフォームは、より複雑なツールを備えていたり、Docker ほどコンテナのデプロイプロセスを自動化していませんでした。
したがって、DockerはLXCのようなコンテナプラットフォームと機能的にはほぼ同等ですが、使いやすさの面では優れています。
Docker の有用性とは?
Docker が現代のソフトウェアデリバリーチームにとって有用である主な要因は、次のとおりです。
- 可搬性:Docker は、アプリケーションとそのすべての依存関係を 1 つのコンテナにパッケージ化し、あらゆるサーバーやクラウドプラットフォームに迅速かつ簡単にデプロイすることができます。これにより、複雑なソフトウェアスタックをインストールおよび設定する必要がなくなり、環境間のアプリケーションの移動が容易になります。
- 軽量:コンテナは、フル機能の仮想マシンよりもはるかに軽量であるため、起動がはるかに高速で、リソース消費も抑えられます。
- スケーラビリティ:Docker を使用すると、クラスタからコンテナを追加または削除することで、迅速にスケールアップまたはスケールダウンを行うことができます。
- セキュリティ:Docker を使用すると、アプリケーションを基盤となるオペレーティングシステムから安全に分離できるため、セキュリティがさらに強化され、アプリケーションへのアクセスを監査および監視することが容易になります。Docker は、アプリケーションのセキュリティを保証するものではありませんが、コンテナを使用してアプリケーションを相互に分離することで、コンテナを使用しない場合では得られないセキュリティ上のメリットを提供します。
前述の通り、Docker はこれらの機能を提供する唯一のプラットフォームではありません。他のコンテナソリューションも同様の仕組みで動作します。しかし、Docker は、よりシンプルなツールセットにより、競合技術よりもこれらのメリットを容易に活用できる点が特徴です。
Dockerはどのように機能しますか?
Docker は、オープンソースのコンテナ化テクノロジーである Docker Engine を使用してコンテナを運用します。Docker Engine を使用すると、ユーザーは、相互に、またホスト環境からも分離されたコンテナを作成および管理することができます。コンテナが作成されると、そのコンテナに一意の ID と、アクセスできるリソースおよびコンテナに課す制限を定義する一連のパラメータが割り当てられます。
Docker プラットフォームには、コンテナのイメージをホストできる Docker Registry というレジストリも含まれています。このレジストリを使用すると、ユーザーはコンテナのイメージを保存、管理、共有することができます。Docker Registry は Docker の公式レジストリですが、Docker コンテナイメージのホストに使用できるサードパーティのレジストリも数多くあります。
さらに、Docker プラットフォームには、ユーザーがコンテナを構築、実行、および管理できるコマンドラインインターフェイスも備わっています。Docker は、ユーザー認証や認証、ロギング、監視機能などのセキュリティ機能も提供しています。
Docker は、Docker Swarm というオーケストレーションツールも提供しています。Swarm は、オプションでコンテナのスケジュール設定や、サーバーのクラスタ全体でのコンテナの運用に使用できます。しかし、Swarm は近年人気が落ち込んでおり、一部のコミュニティメンバーは「Swarm は死んだ」と懸念しています。Swarm の代わりに、Kubernetes がほとんどの Docker 環境で事実上のオーケストレーションソリューションとなっていますが、Kubernetes の代替手段を求めるチームにとっては、Swarm も依然として選択肢のひとつです。
Docker アーキテクチャ
Docker アーキテクチャのコアコンポーネントは次のとおりです。
- Docker デーモン:Docker デーモン(または「エンジン」)は、Docker アーキテクチャのコア要素です。これは、Docker コンテナを管理、構築、実行するバックグラウンドプロセスです。
- Docker クライアント:Docker クライアントは、Docker デーモンと対話するために使用されるインターフェースです。これにより、ユーザーは Docker イメージ、コンテナ、およびネットワークを作成および管理できます。
- Docker イメージ:Docker イメージは、Docker コンテナを構築するために使用される読み取り専用のテンプレートです。これは、コンテナを最初から構築するために使用できる一連の指示とファイルで構成されています。
- Docker レジストリ:Docker レジストリは、Docker イメージを保存および共有するためのリポジトリを作成するために使用できます。
- Docker ネットワーク:Docker ネットワークは、複数のコンテナを接続するために使用される仮想ネットワークです。これにより、コンテナは相互に、およびホストシステムと通信することができます。
- Docker Compose: Docker Compose は、マルチコンテナ Docker アプリケーションを定義して実行するためのツールです。ユーザーは、アプリケーションを構成するサービスを単一のファイルで定義できます。
- Docker Swarm: 上記の通り、Swarm は Docker コンテナのスケジュール設定に使用できるオプションのオーケストレーションサービスです。Docker コンテナでは、Kubernetes などの代替オーケストレーターも使用できます。
これらのツールを組み合わせることで、開発者がコンテナ化されたアプリケーションを作成および実行するために必要なすべての機能が提供されます。
Dockerは、どのような場面で使用できますか?
Docker コンテナはほぼどこでも実行できます。そのため、Docker のモットーは「一度構築すれば、どこでも実行可能」です。
より具体的には、Docker コンテナは物理サーバー、PC、またはラップトップで直接実行できます。(PC やラップトップで Docker コンテナを本番環境用に実行することはあまりないでしょうが、テストや開発目的では実行する場合があります。) ベアメタルサーバー上でコンテナを直接実行すると、ハイパーバイザーやゲストオペレーティングシステムにリソースが無駄に消費されないため、通常、最高のパフォーマンスが得られます。ベアメタル上で直接実行されるコンテナは、GPU などのハードウェアリソースにもアクセスできるため、GPU オフロードの恩恵を受ける AI/ML アプリケーションなど、特定のワークロードに有用です。
Docker コンテナは、ベアメタルサーバー上でホストされている仮想マシンでも実行できます。リソースの観点からは効率は劣りますが、VM 上で Docker を実行すると、VM を移動したり、VM のイメージを作成して別のサーバーに VM のクローンを作成したりすることができるため、コンテナ環境をサーバー間でより簡単に移植することができます。
Docker はクラウドとも完全な互換性があります。Docker コンテナは、Amazon EC2 などの IaaS サービスを使用してデプロイされたクラウド VM で直接実行できます。その場合、クラウドプロバイダがホストインフラストラクチャを提供しますが、Docker ホスト環境のセットアップと管理はユーザー自身で行う必要があります。
クラウドで Docker コンテナをより手間のかからない方法で実行したい場合は、Amazon EKS や Azure AKS などのマネージド Kubernetes サービスを利用できます。これらのサービスは、Docker コンテナの実行に必要なホストインフラストラクチャとコンテナホスト環境の両方を提供します。コンテナの作成とデプロイは引き続き必要であり、コンテナの管理方法を規定するポリシーの設定も必要になる場合がありますが、これらのサービスは、他のタイプのコンテナホスティングソリューションよりも Docker のデプロイを高度に自動化します。
Windows と Linux コンテナの比較
Docker を実行できる場所に関する主な制限は、Docker は Windows と Linux の両方をサポートしていますが、Linux システム用に作成された Docker コンテナは Windows ホスト上で直接実行できず、その逆も同様であることです。(Windows サーバー上で Linux コンテナを実行したい場合は、Windows ホスト上に Linux ベースのオペレーティングシステムを搭載した VM を作成することは可能ですが、これは Windows 上で Linux コンテナを直接実行することとは異なります。)
Android および macOS 用の Docker
Docker の Android および macOS システムへのサポートも制限されています。技術的には、これらの環境で Docker コンテナを実行することは可能ですが、この方法に対する公式サポートはごくわずかです。さらに、Android および macOS は通常、サーバーアプリケーションのホストには使用されません。Docker は主にサーバーアプリケーションの実行用に設計されているため、Android および macOS で Docker を使用する一般的なユースケースは多くありません。