Jump to section

Docker とは

URL をコピー

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

「Docker」を簡単に説明すると、以下のようになります。

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

「Docker でできること」を簡単に説明すると、Docker によってコンテナを軽量なモジュール型仮想マシンのように扱うことができ、複数の環境間でコンテナを作成し、デプロイし、コピーし、移動できる柔軟性が得られます。これによってアプリケーションをクラウド向けに最適化することができます。

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

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

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

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

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

モジュール式

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

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

Docker の各イメージファイルは、単一のイメージに結合された一連のレイヤーで構成されています。イメージが変更されるとレイヤーが作成されます。ユーザーが run (実行) copy  (コピー) などのコマンドを指定するたびに、新しいレイヤーが作成されます。

Docker はこれらのレイヤーを再利用して新しいコンテナを構築するため、構築プロセスを加速します。中間の変更はイメージ間で共有されるため、速度、サイズ、効率がさらに向上します。また、レイヤー化に不可欠な要素として、バージョン管理を行うこともできます。新しい変更があるたびに、基本的に変更ログが付くので、コンテナイメージを完全に管理できます。

ロールバック

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

迅速なデプロイ

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

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

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

 

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

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

 

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

関連資料

記事

コンテナと VM

Linux コンテナと仮想マシン (VM) は、さまざまな IT コンポーネントが組み合わさってシステムの他の部分から分離している、パッケージ化されたコンピューティング環境です。

記事

コンテナ・オーケストレーションとは

コンテナ・オーケストレーションは、コンテナのデプロイメント、管理、スケーリング、ネットワーキングを自動化します。

記事

Linux コンテナとは

Linux コンテナとは、システムから分離された一連のプロセスであり、そのプロセスのサポートに必要なすべてのファイルを提供する個別のイメージから実行されます。

コンテナの詳細はこちら

製品

統合されたテスト済みのサービス一式を備えたエンタープライズ・アプリケーション・プラットフォームであり、ユーザーの選ぶインフラストラクチャを使ってアプリケーションを市場に投入するために活用できます。

リソース

トレーニング

無料のトレーニングコース

Running Containers with Red Hat Technical Overview

無料のトレーニングコース

Containers, Kubernetes and Red Hat OpenShift Technical Overview

無料のトレーニングコース

Developing Cloud-Native Applications with Microservices Architectures