Docker について

読み終わるまで: 約10分

Dockerは、アプリケーションを開発、公開、運用するためのオープンプラットフォームです。 Dockerを使用すると、アプリケーションをインフラから切り離すことができるので、ソフトウェアを迅速に提供することができます。アプリケーションを管理するのと同じ方法でインフラを管理することができます。コードの公開、テスト、デプロイを迅速に行うDockerの方法論を活用することで、コーディングから本番で実行するまでの時間を大幅に短縮することができます。

Docker プラットフォーム

Dockerは、コンテナと呼ばれる隔離された環境でアプリケーションをパッケージ化して実行する機能を提供します。隔離性とセキュリティにより、与えられたホスト上で多くのコンテナを同時に実行することができます。コンテナはハイパーバイザーの余分な負荷を必要とせず、ホストマシンのカーネル内で直接実行されるため、軽量です。これは、仮想マシンを使用する場合よりも、より多くのハードウェアの組み合わせでコンテナを実行できることを意味します。実際には、ホストマシン上で実行している仮想マシン内でDockerコンテナを実行することもできます!

Dockerはコンテナのライフサイクルを管理するためのツールとプラットフォームを提供します。:

  • コンテナを使ってアプリケーションとそれをサポートするコンポーネントを開発します。
  • コンテナは、アプリケーションを配布してテストするためのユニットになります。
  • 準備ができたら、コンテナまたはオーケストレーションされたサービスとして、アプリケーションを本番環境にデプロイします。これは、本番環境がローカルのデータセンター、クラウドプロバイダー、またはこれらのハイブリッドのいずれであっても同じです。

Docker エンジン

Docker エンジンは、主に、以下の様なコンポーネントで構成されたクライアント・サーバー型アプリケーションです。:

  • サーバーは、デーモンプロセス(dockerd コマンド)と呼ばれるロングランプログラムの一種です。.
  • REST APIは、インターフェースを指定します。プログラムがデーモンと対話して何をすべきかを指示するために使用できます。
  • コマンドラインインターフェース(=CLI)クライアント(docker コマンド)。

Docker エンジン コンポーネントの繋がりと流れ

CLIは、Docker REST APIを使用して、Dockerデーモンを対話的に制御し、スクリプトの実行や直接CLIコマンドを実行できます。他の多くのDockerアプリケーションは、基礎となるAPIとCLIを使用します。

Dockerデーモンは、イメージ、コンテナ、ネットワーク、ボリュームなどの Dockerオブジェクト を作成して管理します。

: DockerはオープンソースのApache 2.0ライセンスでライセンスされています。

詳細については、下記のDockerアーキテクチャを参照してください。

Dockerは何に使える?

アプリケーションを迅速かつ一貫して提供

Dockerは、アプリケーションやサービスを提供するローカルコンテナを使用して、開発者に標準化された作業環境を提供することで、開発ライフサイクルを合理化しています。コンテナは継続的インテグレーションと継続的デリバリー(CI/CD)ワークフローのため優れています。。

以下の例でシナリオを考えてみましょう。

  • 開発者はローカルでコードを書き、Dockerコンテナを使用し、同僚と作業内容を共有します。
  • 彼らはDockerを使ってアプリケーションをテスト環境にプッシュし、自動テストと手動テストを実行します。
  • 開発者がバグを見つけ場合、開発環境で修正し、テストと検証のためにテスト環境に再度デプロイします。
  • テストが完了したら、更新されたイメージを本番環境にプッシュし、同じくらいに簡単に顧客に修正を提供できます。

レスポンシブなデプロイとスケーリング

Dockerのコンテナベースのプラットフォームは、ポータブル性の高いワークロードを可能にします。Docker コンテナ は、開発者のローカルノートPC、物理的または仮想的なデータセンターにあるマシン、クラウドプロバイダーにあるマシン、またはそれらが混在した環境にあるマシンで実行できます。

Dockerの移植性と軽量性により、ワークロードを動的に管理し、ビジネスニーズに応じてアプリケーションやサービスをスケールアップしたりテアリングダウンしたりすることが、ほぼリアルタイムで容易に行えます。

同じハードウェアでより多くのワークロードを実行

Dockerは軽量で高速です。Dockerは、ハイパーバイザーベースの仮想マシンに代わる、実行可能で費用対効果の高い代替手段を提供し、より多くのコンピューター能力を使用してビジネス目標を達成することができます。Dockerは高密度な環境や、少ないリソースでより多くのことを行う必要がある中小規模のデプロイに最適です。

Docker アーキテクチャ

Dockerはクライアント・サーバー・アーキテクチャを使用しています。Dockerクライアントは、Dockerデーモンと対話し、Dockerコンテナのビルド、実行、および配布の多くの作業をこなします。Dockerクライアントとデーモンは同じシステム上で実行することもでき、DockerクライアントをリモートのDockerデーモンに接続させることもできます。DockerクライアントとデーモンはREST APIを使って通信し、UNIXソケットやネットワークインターフェースを介して行います。

Dockerアーキテクチャ図

Docker デーモン

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

Dockerクライアント

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

Docker レジストリ

DockerのレジストリにはDockerのイメージが保存されています。Docker Hubは誰でも利用できるパブリックレジストリで、DockerはデフォルトでDocker Hub上でDockerイメージを探すように設定されています。あなた自身のプライベートレジストリで実行することもできます。

docker pullまたはdocker runコマンドを使用すると、必要なイメージが設定したレジストリから取り出されます。 docker pushコマンドを使用すると、イメージは設定したレジストリにプッシュされます。

Docker オブジェクト

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

Dockerイメージ

Dockerイメージは、Dockerコンテナを作成するための手順が記載された読み取り専用のテンプレートです。多くの場合、Dockerイメージは別のDockerイメージをベースにして、いくつか追加でカスタマイズが施されています。例えば、ubuntuimageをベースにしたDockerイメージを構築して、Apacheウェブサーバとアプリケーションをインストールし、アプリケーションを動作させるために必要な設定の詳細もインストールすることができます。

自分でDockerイメージを作成することもできますし、他の人が作成したDcokerイメージのみを使用してレジストリで公開することもできます。オリジナルのDockerイメージを構築するには、Dockerイメージの作成と実行に必要な手順を定義するためのシンプルな構文を持つDockerfileを作成します。Dockerfile内の各命令は、Dockerイメージ内にレイヤーを作成します。Dockerfileを変更してイメージを再構築すると、変更したレイヤーのみが再構築されます。これは、他の仮想化技術と比較して、Dockerイメージが軽量、小型、高速である理由のひとつです。

Dockerコンテナ

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

デフォルト設定では、Dockerコンテナは他のDockerコンテナやホストマシンと比較してより隔離されています。Dockerコンテナのネットワーク、ストレージ、またはその他の基礎となるサブシステムが、他のDockerコンテナやホストマシンからどの程度隔離させるかを設定できます。

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

docker runコマンドの例

次のコマンドはubuntuコンテナを実行し、あなたのローカルコマンドラインセッションに対話的に接続し、/bin/bashを実行します。

<div class="language-bash highlighter-rouge"> <div class="highlight"> <span class="nv">$ </span>docker run <span class="nt">-i</span> <span class="nt">-t</span> ubuntu /bin/bash

</div></div>

このコマンドを実行すると、以下のようなことが起こります(デフォルトのレジストリ設定を使用していることを想定しています)。

  1. ubuntuのDockerイメージがローカルにない場合、Dockerは、あなたが手動でdocker pull ubuntu実行したかのように、設定されているレジストリからubuntuのDockerイメージを取得します。
  2. Dockerは、手動でdocker container createコマンドを実行したかのように、新しいDockerコンテナを作成します。
  3. DockerはDockerコンテナの最終層として、読み書き可能なファイルシステムを割り当てます。これにより、実行中のコンテナがローカルファイルシステム内のファイルやディレクトリに変更を加えたり、作成したりすることができます。
  4. ネットワークオプションを指定していないので、DockerはDockerコンテナをデフォルトのネットワークに接続するためにネットワークインターフェースを作成します。これには、DockerコンテナにIPアドレスを割り当てることも含まれます。デフォルトでは、Dockerコンテナはホストマシンのネットワーク接続を使用して外部ネットワークに接続できます。
  5. Dockerがコンテナを起動し、/bin/bashを実行します。コンテナは対話的に実行されており、ターミナルに(-i-tフラグによって)接続されているので、出力がターミナルに表示されている間はキーボードを使って入力することができます。
  6. exitと入力して/bin/bashコマンドを終了すると、コンテナは停止しますが、削除されません。再度起動するか、削除してください。

サービス

サービスを利用することで、複数のDockerデーモンにまたがってコンテナをスケーリングすることができます。スウォームの各メンバーはDockerデーモンであり、すべてのデーモンはDocker APIを使用して通信を行います。デフォルトでは、サービスはすべてのワーカー ノード間で負荷分散されています。消費者には、Dockerサービスはひとつのアプリケーションのように見えます。Docker エンジンはDocker 1.12以降でスウォームモードをサポートしています。

Docker自体の開発技術

DockerはGoプログラミング言語で書かれており、Linuxカーネルのいくつかの機能を利用して機能を提供しています。

ネームスペース

Dockerは、コンテナと呼ばれる隔離されたワークスペースを提供するために、ネームスペースと呼ばれる技術を使用しています。コンテナを実行すると、Dockerはそのコンテナ用の名前空間のセットを作成します。

これらのネームスペースは隔離の層を提供します。コンテナの各側面は別のネームスペースで実行され、そのアクセスはそのネームスペースに制限されます。

Docker EngineはLinuxでは以下のようなネームスペースを使用しています。

  • **pid**ネームスペース:プロセス分離(PID:Process ID)。
  • **net**ネームスペース:ネットワークインターフェイスの管理 (NET: Networking)。
  • **ipc**ネームスペース:IPCリソース(IPC: InterProcess Communication)へのアクセスを管理します。
  • **mnt**ネームスペース:ファイルシステムのマウントポイントを管理する(MNT: Mount)。
  • **uts**ネームスペース:カーネルとバージョン識別子を分離します。(UTS: Unix Timesharing System)

コントロールグループ

Linux上のDocker Engineもコントロールグループcgroups)と呼ばれる別の技術に依存しています。コントロールグループは、Docker Engineが利用可能なハードウェアリソースをコンテナに共有し、オプションで制限や制約を課すことを可能にします。例えば、特定のコンテナに利用可能なメモリを制限することができます。

ユニオンファイルシステム

ユニオンファイルシステム(UnionFS)は、レイヤーを作成して動作するファイルシステムで、非常に軽量で高速です。Docker EngineはUnionFSを使用してコンテナのビルディングブロックを提供しています。Docker Engineでは、AUFS、btrfs、vfs、DeviceMapperなど、複数のUnionFSを利用することができます。

コンテナフォーマット

Docker Engineは、ネームスペース、コントロールグループ、UnionFSをコンテナフォーマットと呼ばれるラッパーの形式で組み合わせています。デフォルトのコンテナフォーマットはlibcontainerです。将来的には、DockerはBSD JailやSolaris Zonesなどのウィットテクノロジーを統合することで、他のコンテナフォーマットをサポートする可能性があります。

次のステップ