メインコンテンツまでスキップ

Dockerの概要

Dockerは当初、フランスに拠点を置くdotCloudという企業の創設者であるSolomon Hykesによって立ち上げられた内部プロジェクトでした。dotCloudのクラウドサービス技術の数年に渡る革新の成果を活かしたものであり、2013年3月にApache 2.0ライセンスの下でオープンソース化されました。メインのプロジェクトコードはGitHubで維持されており、プロジェクト名はMobyに変更されています。後にDockerプロジェクトはLinuxFoundationに参加し、Open Container Initiative(OCI)を設立しました。

オープンソース化された後、Dockerは広く注目を集め、議論されるようになり、GitHubプロジェクトでは現在67,000以上のスターと18,000以上のフォークを集めています。Dockerプロジェクトの人気が高まったため、dotCloudは2013年後半にDockerに社名を変更することにしました。Dockerは当初Ubuntu 12.04で開発および実装されましたが、Red HatはRHEL 6.5からDockerをサポートし始め、GoogleもそのPaaSプロダクトでDockerを広く活用しています。

Dockerは、Googleが導入したプログラミング言語Goを使って開発されており、Linuxカーネルのテクノロジーであるcgroups、namespaces、OverlayFSタイプのUnion FSを活用しています。オペレーティングシステムレベルの仮想化の一形態として、プロセスをカプセル化し、分離します。分離されたプロセスはホストやその他の分離されたプロセスから独立しているため、コンテナと呼ばれます。当初の実装はLXCに基づいていましたが、バージョン0.7以降はLXCが削除され、Dockerは独自に開発したlibcontainerを使用するようになりました。さらにバージョン1.11から、runCとcontainerdを使用するようになりました。

Dockerとは

Dockerはアプリケーションの開発、出荷、実行のためのオープンなプラットフォームです。Dockerはアプリケーションをインフラストラクチャから分離することで、ソフトウェアを素早く提供できるようにします。Dockerを使えば、アプリケーションを管理する方法と同じ方法でインフラストラクチャを管理できます。Dockerのコードの出荷、テスト、デプロイの手法を活用することで、コーディングから実際の運用までの遅延を大幅に削減できます。

なぜDockerを使うのか

新しい仮想化手法として、Dockerは従来の仮想化アプローチに比べて多くの利点があります。

より効率的なリソース活用 コンテナはハードウェア仮想化やオペレーティングシステム全体の起動を必要としないため、Dockerはシステムリソースを効率的に利用します。アプリケーションの実行速度、メモリ消費量、ファイル保存の速度などの面で、Dockerは従来の仮想化技術を上回ります。したがって、仮想マシン技術と比べて、同じ構成のホストでより多くのアプリケーションを実行できる場合が多くあります。

起動時間が速い 従来の仮想マシン技術では、アプリケーションサービスの起動に数分かかることがありますが、Dockerコンテナはオペレーティングシステム全体の起動を必要とせずにホストカーネル上で直接実行されるため、ほぼ即座に、数秒またはミリ秒以内での起動が可能です。これにより、開発、テスト、デプロイの時間が大幅に短縮されます。

一貫したランタイム環境 開発プロセスで一般的な問題は、環境の不整合です。開発環境、テスト環境、本番環境の違いにより、一部のバグが開発段階で見つからないことがあります。Dockerイメージは(カーネル以外の)完全なランタイム環境を提供するため、アプリケーションのランタイム環境の一貫性が確保され、「でも私のマシンでは動作するんです」という問題を防ぐことができます。

継続的デリバリおよびデプロイ 開発者とオペレーション(DevOps)担当者にとって、理想的なシナリオは、一度作成または構成し、どこでも正しく実行できることです。

Dockerはアプリケーションイメージをカスタマイズすることで、継続的インテグレーション、継続的デリバリ、およびデプロイを可能にします。開発者はDockerfileを使ってイメージをビルドし、継続的インテグレーションシステムと統合してテストできます。その後、オペレーション担当者はこれらのイメージを本番環境に素早くデプロイできます。自動デプロイのため、継続的デリバリ/デプロイシステムに統合することさえできます。

Dockerfileを使うことで、イメージのビルドプロセスが明確になり、開発チームとオペレーションチームの両方がアプリケーションのランタイム環境とデプロイ要件を理解しやすくなるため、本番環境でのイメージデプロイがより適切に行えるようになります。

移行が簡単 Dockerがランタイム環境の一貫性を確保するため、アプリケーションの移行が簡単になります。Dockerは物理マシン、仮想マシン、パブリッククラウド、プライベートクラウド、ラップトップなど、さまざまなプラットフォームで実行でき、結果は一貫しています。ユーザーはランタイム環境の変化によりアプリケーションが正しく機能しなくなることを心配することなく、あるプラットフォーム上で実行されているアプリケーションを別のプラットフォームに簡単に移行できます。

メンテナンスと拡張性が簡単 Dockerの階層ストレージとイメージ技術によって、重複するアプリケーションコンポーネントを再利用しやすくなり、アプリケーションの保守と更新が簡単になります。ベースイメージに基づいてイメージを拡張することも非常に簡単です。さらに、Dockerチームと様々なオープンソースプロジェクトチームが、高品質な公式イメージの大規模なコレク ションを維持しており、そのイメージを本番環境で直接使用したり、さらにカスタマイズする元としても使用できるため、アプリケーションサービスイメージの作成コストが大幅に削減されます。

Dockerのアーキテクチャ

Dockerはクライアント・サーバーアーキテクチャを使用しています。Dockerクライアントは、Dockerコンテナのビルド、実行、配布を担当するDockerデーモンと通信します。Dockerクライアントとデーモンは同じシステム上で実行することも、DockerクライアントをリモートのDockerデーモンに接続することもできます。Dockerクライアントとデーモンは、UNIXソケットまたはネットワークインターフェイスを介してRESTAPIで通信します。別のDockerクライアントとしてDocker Composeがあり、これを使うと一連のコンテナで構成されるアプリケーションを扱えます。

Dockerデーモン

Dockerデーモン(dockerd)はDockerAPIリクエストを待ち受け、イメージ、コンテナ、ネットワーク、ボリュームなどのDockerオブジェクトを管理します。デーモンはDockerサービスを管理するため、他のデーモンとも通信できます。

Dockerクライアント

Dockerクライアント(docker)は、多くのDockerユーザーがDockerと対話する主な方法です。docker runなどのコマンドを使うと、クライアントがそれらのコマンドをdockerdに送信し、dockerdがそれらを実行します。dockerコマンドはDockerAPIを使用します。Dockerクライアントは複数のデーモンと通信できます。

Docker Desktop

Docker DesktopはMac、Windows、Linuxの環境で簡単にインストールできるアプリケーションで、コンテナ化されたアプリケーションやマイクロサービスのビルドと共有を可能にします。Docker Desktopには、Dockerデーモン(dockerd)、Dockerクライアント(docker)、Docker Compose、Docker Content Trust、Kubernetes、Credential Helperが含まれています。詳細はDocker Desktopを参照してください。

Dockerレジストリ

Dockerレジストリは、Dockerイメージを保存する場所です。Docker Hubは誰でも使える公開レジストリで、Dockerはデフォルトでそこからイメージを探します。自分専用のプライベートレジストリを運用することも可能です。 docker pullまたはdocker runコマンドを使うと、Dockerは設定されたレジストリから必要なイメージをプルします。docker pushコマンドを使うと、Dockerはイメージを設定されたレジストリにプッシュします。

Dockerオブジェクト

Dockerを使う際には、イメージ、コンテナ、ネットワーク、ボリューム、プラグインなどのオブジェクトを作成して利用します。ここではそれらのオブジェクトの概要を簡単に説明します。

イメージ

イメージはDockerコンテナの作成手順が記述された、読み取り専用のテンプレートです。多くの場合、イメージは別のイメージをベースに、さらに何らかのカスタマイズが加えられています。例えば、ubuntuイメージをベースに、Apache Webサーバーとあなたのアプリケーション、そしてアプリケーションの実行に必要な設定を行ったイメージを作成できます。

自分でイメージを作成することも、他者が作成してレジストリに公開したイメージを利用するだけでも構いません。自分のイメージを作成するには、Dockerfileというシンプルな構文を使って、イメージの作成とその実行の手順を定義します。Dockerfileのそれぞれのインストラクションがイメージのレイヤーを作成します。Dockerfileを変更してイメージを再ビルドすると、変更されたレイヤーだけが再ビルドされます。これがイメージを他の仮想化技術に比べて軽量で小さく高速にしている理由の一部です。

コンテナ

コンテナはイメージの実行可能なインスタンスです。Docker APIやCLIを使えば、コンテナの作成、開始、停止、移動、削除ができます。1つ以上のネットワークにコンテナを接続したり、ストレージを割り当てたり、現在の状態に基づいて新しいイメージを作成したりすることもできます。

デフォルトでは、コンテナは他のコンテナやホストマシンからかなり分離された状態になっています。コンテナのネットワーク、ストレージ、その他の基盤となるサブシステムが、他のコンテナまたはホストマシンからどの程度分離されるかは制御できます。

コンテナはベースのイメージと、作成または開始時に指定した設定オプションによって定義されます。コンテナが削除されると、永続ストレージに保存されていない状態変更はすべて消えてしまいます。

参考文献