ログイン / 登録 アカウント

コンテナ

Docker とは

「Docker」とは、Linux コンテナの作成と使用を可能にするオープンソース・ソフトウェアのこと。また、Docker を改良するオープンソース・コミュニティと、Docker を企業向けにセキュリティ強化する会社の Docker Inc. も「Docker」と呼ばれます。

  • Docker (IT ソフトウェア):Linux® コンテナの作成と使用を可能にするオープンソースのコンテナ化テクノロジーです。
  • Docker (オープンソース・コミュニティ):Docker のテクノロジーを改善し、あらゆるユーザーが自由にそのメリットを享受できるように取り組むコミュニティです。
  • Docker Inc. (企業):Docker コミュニティの成果物をベースに、Docker のセキュリティをさらに高め、機能改善コミュニティへ還元。さらに、法人向けに改良し・強化した Docker テクノロジーをサポートする企業です。

Docker を使用するメリット:

  • コンテナを軽量なモジュール型仮想マシンのように扱える
  • コンテナの柔軟性を得られる
  • コンテナを作成し、デプロイしたものを環境間でコピーや移動することが可能
  • 上記の特性を活用し、アプリケーションをクラウド向けに最適化できる

Docker の仕組みと目的

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

Docker でできること

Docker などのコンテナツールは、イメージを使用するデプロイモデルを提供します。この手法では、アプリケーションやサービス群をそれぞれの依存関係と一緒に、複数の環境間で容易に共有できるようになります。さらに Docker は、コンテナ環境内におけるアプリケーション (または、アプリケーションを構成するプロセス群の組み合わせ) のデプロイも自動化します。

Linux コンテナの恩恵

これらのコンテナツールは Linux コンテナをベースに作られており、使いやすいという特徴があります。Docker を使用することで、アプリケーションへのアクセス性が劇的に向上し、迅速なデプロイ、バージョン管理、バージョンごとの提供をコントロールできるようになります。


Docker と Linux コンテナの違い

Docker は元々 LXC (Linux コンテナ) 技術をベースに構築されたものであるため、従来の Linux コンテナを連想する人も多いですが、これらは異なる技術です。

  • LXC:軽量な仮想化ツールとしては有用でしたが、開発者やユーザーにとって使いにくいものでした。
  • Docker:コンテナを実行できるだけでなく、コンテナの作成とビルド、イメージの配布、バージョン管理のプロセスを容易にします。

従来の Linux コンテナと Docker の比較

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


Docker コンテナのメリット

モジュール方式

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

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

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

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

ロールバック

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

迅速なデプロイ

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

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


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

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

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

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

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

コンテナについてさらに詳しく