言語|国を設定する

各国のポータルページを見る

各国の最新情報は、以下の国別ポータルページからご確認ください。

コンテナ

Doker とは

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

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

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

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


Docker の仕組み

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

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

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


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

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

従来の Linux コンテナ vs Docker

これまでの Linux コンテナでは、複数のプロセスを管理できる初期システムが使用されていました。つまり、アプリケーション全体が 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、Cgroups、/dev/sd* デバイスが含まれます。つまり、攻撃者がこれらのサブシステムの制御権を握ると、ホストが侵略されてしまいます。軽量さを保とうとしてホストカーネルをコンテナと共有すると、このようなセキュリティの脆弱性が高まる恐れがあります。コンテナは、セグメント化されホストシステムからはきちんと分離されている仮想マシンとは異なります。


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

コンテナについてより詳しく知る