コンテナ

Docker とは

「Docker」は、いくつかのものを指して使われる場合があります。オープンソース・コミュニティのプロジェクト、そのプロジェクトのツール、プロジェクトを主にサポートしている企業名、そしてその企業が公式にサポートしているツールなどです。テクノロジーや企業に同じ名称が使われているので、やや紛らわしい感じがするかもしれません。

以下は、Docker に関する簡単な説明です。

  • IT ソフトウェアの「Docker」は、Linux® コンテナの作成と使用を可能にするコンテナ化テクノロジーのことです。
  • オープンソースの Docker コミュニティは、このようなテクノロジーを改善し、あらゆるユーザーが自由にそのメリットを享受できるように努めています。
  • 企業としての Docker Inc. は、Docker コミュニティの活動を基盤として、安全性をさらに高め、その成果をさらに大きなコミュニティに還元しています。そして、法人向けに改良し、強化したテクノロジーをサポートしています。

Docker により、コンテナを軽量なモジュール型仮想マシンのように扱うことができます。コンテナによって柔軟性も獲得できます。すなわち、コンテナを作成し、デプロイしたものを環境間でコピーや移動することも可能です。


Docker の仕組み

Docker のテクノロジーでは、Linux カーネルと cgroup名前空間などのカーネルの機能を採用しており、プロセスを隔離してそれぞれ独立して実行することが可能です。この独立性、つまり複数のプロセスやアプリケーションを互いに分離して実行できることがコンテナの要点です。これによりインフラストラクチャをより有効活用できると同時に、それぞれのシステムのセキュリティが担保されます。

Docker を含むコンテナツールは、イメージベースのデプロイモデルを提供します。これにより、複数の環境間での依存関係と共にアプリケーションや一連のサービスを共有することが容易になります。Docker は、コンテナ環境内のアプリケーション (または、アプリケーションを構成する一連のプロセスを組み合わせたもの) のデプロイも自動化します。

これらのツールは Linux コンテナをベースに作られているので、Docker はユーザーにとって使いやすいユニークなものです。ユーザーは、かつてない方法でアプリケーションにアクセスでき、迅速なデプロイが可能になります。また、バージョン管理や配布も制御することができます。


Docker のテクノロジーは従来の Linux コンテナと同じものですか

いいえ、違います。もともと Docker のテクノロジーは、LXC テクノロジーを基に構築されたもの (このためにほとんどの人は「従来の」 Linux コンテナと結び付ける) ですが、その後この依存関係はなくなりました。LXC は軽量な仮想化ツールとしては有用でしたが、開発者やユーザーにとって使いやすいものではありませんでした。Docker テクノロジーは、コンテナの実行を可能にするだけでなく、コンテナの作成と構築、イメージの配布、イメージやその他のバージョン管理のプロセスを容易にします。

これまでの Linux コンテナでは、複数のプロセスを管理できる init システムが使用されていました。つまり、アプリケーション全体が 1 つになって動作します。Docker テクノロジーでは、アプリケーションを個別のプロセスに分割することが推奨され、そのためのツールも提供されます。この細分化アプローチにはメリットがあります。


Docker コンテナのメリット

モジュール方式

Docker のコンテナ化アプローチは、アプリケーション全体ではなく、アプリケーションの一部だけをアップデートしたり修復したりすることを重視しています。このマイクロサービス・ベースのアプローチに加え、サービス指向アーキテクチャ (SOA) とほぼ同じ方法で、複数のアプリケーション間でプロセスを共有することも可能です。

レイヤーとイメージのバージョン管理

Docker の各イメージファイルは一連のレイヤーで構成されています。これらのレイヤーが組み合わさって 1 つのイメージになります。イメージが変わると、レイヤーが 1 つ作成されます。ユーザーが runcopy などのコマンドを指定するたびに、新しいレイヤーが増えていきます。

Docker はこれらのレイヤーを新しいコンテナの構築に再使用するので、構築プロセスのスピードが飛躍的に向上します。途中の変更はイメージ間で共有され、スピード、サイズ、効率性がさらに改善されます。レイヤーの特性が、そのままバージョン管理に活かされます。新しい変更があるたびに実質的に変更ログが付くので、コンテナイメージを完全に管理できます。

ロールバック

レイヤー化の最大のメリットは、ロールバックできる点です。各イメージがレイヤーを持っています。現在のイメージがうまくいかない場合は、以前のバージョンにロールバックできます。これにより、アジャイルなデプロイの手法がサポートされ、継続的インテグレーションおよび継続的デプロイ (CI/CD) がツールの観点から現実のものとなります。

迅速なデプロイ

ハードウェアを起動、実行、プロビジョニングして使用できるようにするために、かつては数日かかっていました。その労力とそれにかかるコストは大きな負担となっていました。Docker ベースのコンテナなら、デプロイを数秒に短縮できます。各プロセスに対してコンテナを 1 つ作成すると、同様のプロセスを新しいアプリケーションにすばやく共有できます。コンテナの追加や削除のために OS を起動する必要はないので、デプロイ時間は飛躍的に短くなります。デプロイのスピードに加えて、コンテナにより作成されたデータの作成や削除は、容易かつコスト効率の良い方法で安心して行えます。

Docker テクノロジーは、よりきめ細かい、制御可能なマイクロサービス・ベースのアプローチであり、効率性を重視しています。


Docker の使用には制限がありますか

Docker そのものは、単一のコンテナ管理に特化しています。使用するコンテナやコンテナ化されるアプリケーションが増えて数 100 にも分かれるようになると、それらを管理してオーケストレーションしていくのが困難になります。最終的には、一歩引いてコンテナをグループにまとめ、すべてのコンテナにネットワーク、セキュリティ、テレメトリーなどのサービスを提供する必要が生じます。そこで Kubernetes の出番です。

Docker には、これまでの Linux コンテナにあった UNIX のような機能はありません。これにはコンテナ内、そしてアプリケーションで、cron や syslog のようなプロセスを使用することも含まれます。また、子プロセスが終了した後の孫プロセスのクリーンアップなど (もともと従来の Linux コンテナでは処理されていたもの) にも制限があります。このような懸念は、設定ファイルを変更し、最初にこれらの機能を設定しておくことで軽減できますが、これは最初から明白な問題ではありません。

また、名前空間化されていないその他の Linux サブシステムやデバイスがあります。これには、SELinux、cgroup、/dev/sd* デバイスが含まれます。つまり、攻撃者がこれらのサブシステムの制御権を握ると、ホストが侵略されてしまいます。軽量さを保とうとしてホストカーネルをコンテナと共有すると、このようなセキュリティの脆弱性が高まる恐れがあります。コンテナは、セグメント化されホストシステムからはきちんと分離されている仮想マシンとは異なります。

Docker デーモンも、セキュリティ上の懸念になります。Docker コンテナを使用して実行するために、おそらくコンテナ用の永続ランタイムである Docker デーモン試用することになるでしょう。Docker デーモンには root 権限が必要です。それで、誰がこのプロセスにアクセスするのか、どこにそのプロセスがあるかに関して通常以上の注意を払う必要があります。例えば、ローカルデーモンの攻撃面の方が、Web サーバーのようなより公共性の高い場所の攻撃面よりも小さくなります。

コンテナのその他の多くの特徴