Dockerとは、Docker社の提供するオープンソースのコンテナ型仮想化ソフトウェアおよび実行環境です。独立した実行環境(=コンテナおよびその集合)の内部にアプリケーションを構築することで、サービス開発/提供のアジリティを向上させることができます。
サービス開発/提供のアジリティ向上というメリットが得られる理由は、主に下記3つの観点から説明できます。
1. 環境の分離
2. 高速な動作
3. Dockerのエコシステム
環境の分離
Dockerは図1のようにアプリケーションの動作環境を「コンテナ」によって分離します。
Dockerエンジン以下のレイヤーはコンテナ間で共有しつつ、アプリケーションバイナリの動作に必要なライブラリ環境を分離しています。これによって他のアプリケーションの動作環境から影響を受ける可能性を取り除きます。
高速な動作
動作環境を分離するという意味では、ハイパーバイザーを用いたサーバ型仮想化でも同様のことが実現できることにお気付きの方もいるかもしれません。両者の違いは、「どこで動作環境を分離しているか」という点にあります。
図2 Dockerによるコンテナ型仮想化(左)とハイパーバイザーを用いたサーバ型仮想化(右)
サーバ型仮想化では、OS(Linuxカーネルなど)も含めて分離しているため、起動、停止の際にはOSの起動・停止プロセスが含まれます。一方コンテナ型仮想化では、アプリケーションバイナリの実行に必要なライブラリの部分で動作環境が分離されているため、OSの起動・停止プロセスが含まれません。短時間の「独立した動作環境の確保・破棄」「アプリケーションバイナリの起動・停止」が可能になっています。
Dockerのエコシステム
ここまでで述べた1.と2.のアジリティ向上のポイントは、技術的にはDocker以外の他のコンテナ型仮想化ソフトウェア——「chroot」「jail」「Solaris Containers」「LXC(Linux Containers)」などでも実現できます(LXCに至ってはかつてDocker自体で利用されていました)。では、なぜDockerばかりが注目されたのでしょうか。大きな違いはエコシステムにあります。
Dockerの提供するエコシステムには主に「コンテナイメージの配布方法の標準化」「コンテナイメージの構築方法の標準化」の2つのポイントがあります。
- コンテナイメージの配布方法の標準化
Dockerでは、コンテナイメージを配布するための仕組みとしてDocker Hubが提供されています。
Docker Hubにアカウントを作り、コンテナイメージをアップロードすれば、世界中の人に利用してもらえます。また、プライベートレジストリを独自に構築し組織内部に閉じた形でコンテナイメージを共有することも可能です。
- コンテナイメージの構築方法の標準化
Dockerでは、"どうやってコンテナイメージを構築するか"のDSL(Domain Specific Language)も定義されています。一般には「Dockerfile」と呼ばれ、図4のサンプルが示すように、テキストで記述されています。GitHubなどのリポジトリサービスを介してDockerfileを公開することで、コンテナイメージの構築手順をテキストベースで共有できるようになっています。
コンテナ型仮想化の本番活用に向けた課題
Dockerとそのエコシステムを用いることで、アプリケーションの動作環境の構築を簡略化できるとともに、ネットワークを介してあちらこちらに動作環境を展開できるようになりました。この結果、このような仕組みを「本番環境で活用しよう」とするのは自然なことだと思います。
しかし、Docker単独では本番環境で動かすのに困難な問題が幾つか存在します。例えば100台のDockerホスト(Dockerを導入済みのサーバ)があり、この上に本番サービスをデプロイすることを考えてみます。その際、次のような課題が生じます。
1. 複数のDockerホストをどう管理するか
2. どのDockerホストにコンテナ(アプリケーション)を立ち上げるか
3. コンテナのデプロイ方法をどう定義するか
4. 複数のコンテナ間の連携をどう実現するか
5. コンテナの死活監視をどうするか
6. コンテナの保持するデータをどう管理するか
7. 外部ネットワークからコンテナへのアクセス経路をどう設定するか
0 件のコメント:
コメントを投稿