Dockerとは
Dockerは、コンテナ型の仮想化を実装するソフトウェアである。Docker社が開発し、2013年にオープンソースとして公開している。他の仮想環境と違いDockerの仕組みは、ハードディスクの使用量が少なくて済み、起動が速く劣化が少ないといわれている。
最近では、いくつかのクラウドベンダーがコンテナ型仮想化のサービスを提供している。そして、ほとんどのサービスではDockerを利用することができる。クラウドサービス、ビッグデータ基盤などを管理するためのIT基盤としてもDockerは高く評価されている。なお、Dockerコンテナを管理するコマンド名もdockerである。この記事では仮想環境についての特徴や、Dockerを利用するメリット、デメリットについてまとめている。
仮想化とコンテナ
基本的に、通常は1台のパソコンに1つのOSが起動し、その上でアプリケーションを動かしている。これに対して仮想環境は、1つの物理的なハードウェアの中に、複数の仮想的なハードウェアを隔離し、個別のOSを動作させている。仮想マシンは、ハードウェアリソースを別の仮想マシンに模倣し、独立したサーバ環境を作り出す。そのためLinuxやWindowsといった別のOSを動かすことができる。このハードウェアを直接制御しているOSのことをホストOSやハイパーバイザと呼び、仮想マシン上のOSの事をゲストOSと呼ぶ。
仮想環境には、準仮想化、完全仮想化、コンテナ型仮想化がある。以下はそれぞれの特徴について解説している。
準仮想化
準仮想化とは、Xen、VMWare、VirtualBoxなどが採用している仮想化の技術である。ゲストOSが物理的なハードウェア上ではなく、ホストOS上で動作していることを確認して働く。ゲストOSは、特別なデバイスドライバなどを使用し、ホストOSに対してハードウェア処理を依頼する。ホストOSは、ゲストOSの要求に従ってハードウェアを操作する。準仮想化では、オーバーヘッドを最小限にし、効率よくリソースを利用することができる。しかし、単体のアプリケーションを動作させるためにゲストOSが必要になる。そのための必要なディスク容量が増え、メモリやCPU時間のオーバーヘッドが大きくなる。
完全仮想化
完全仮想化とは、KVMなどが採用している仮想化の技術である。ホストOSがハードウェアの機能をエミュレーションする。ゲストOSからは、物理サーバー上で動作しているのと同じように見える。完全仮想化はホストOSを意識せずに様々な種類のOSを動作させることができ、Windowsのインストールなども可能になる。しかし、エミュレーションのオーバーヘッドが大きいため、性能が劣化する。完全仮想化では性能劣化を最小限にするために、ハードウェアのサポート機能を利用する。つまりサポート機能があるハードウェアしか、完全仮想を利用することができない。
コンテナ型仮想化
コンテナとはOS上に他のサービスと分離させたアプリケーション環境をパッケージ化することである。コンテナ型仮想化はコンテナ内でアプリケーションを動かすため、アプリケーションに必要なファイルだけがコンテナに含まれる。各アプリケーションは、ホストコンピュータのカーネルを共有して動作する。コンテナ化することで、アプリケーションがあるコンピュータ環境から他のコンピュータ環境へ、アプリケーションの移行を早く確実に行うことが可能になる。準仮想化や完全仮想化などの従来の仮想マシンでは、ファイルシステムのイメージをそのまま保管するため、ゲストOSは物理的なハードウェアと同じだけの容量が必要である。しかし、コンテナ型仮想環境では、最低限のファイルサイズで実装することが可能で、非常に軽量である。Dockerは、このコンテナ型仮想化を実現可能にするオープンソースソフトウェアの1つである。
Dockerを利用するメリット
Dockerは、軽量なコンテナ型の仮想化を実装するだけではなく、以下のことが可能になる。
設定済みのコンテナが入手でき、すぐに使える
Dockerのリポジトリは、インターネット上で公開されている。最も一般的なDocker-HUBと呼ばれるレポジトリからは、様々な定義されたイメージを入手することが可能である。通常はソフトウェアをインストールして、その後初期設定を行い、細かな設定等をカスタマイズする必要があるが、これらのイメージはあらかじめ設定済みであるため、そのような作業を行うことなくすぐに稼働させることができる。
バージョン管理が可能
Dockerイメージとは必要なファイルのアーカイブをいい、コンテナはこのイメージとその上で動作するアプリをセットにして起動する。イメージは、リポジトリ内で階層的に管理され、どこから作成されたかも明確なのでバージョン管理にも利用が可能になる。
設定済みのコンテナをリポジトリに登録し、配布することが可能
Dockerで作成したイメージは、GitLabなどで作成した独自のレジストリサーバでも管理ができる。Dockerはイメージを集中管理することで、様々な環境でイメージをダウンロードして同じ環境を構築することができる。
別のサーバ上でも動作することが可能
Dockerは、準仮想化や完全仮想化などの別のサーバの上でも動作することができ、イメージも共通で使える。オンプレミスのサーバとクラウド上でのサーバと同じイメージを使用できるため、Dockerは、環境に左右されず運用ができる。
システムのリソースを効率的に活用が可能になる
DockerはOS(カーネル)を実行しないため、利用するメモリやCPUが少なく済む。最低限必要なファイルだけをDockerイメージに入れるため、ディスク容量も小さい。また、各コンテナに割り当てるCPU時間やメモリも設定が可能になる。そのため、システムのリソースを効率的に活用することができる。
ステージング・検証環境への利用
Dockerで構築したシステムイメージからステージング環境や検証用環境を容易に構築できる。Dockerはシステムイメージを差分で保存できるので、トラブル発生時に世代を指定したロールバックや、コンテンツだけでなくセキュリティアップデートの際などのインフラの動作検証もできるようになる。
バージョンアップが容易に行える
古いコンテナイメージを元に、ソフトウェアをバージョンアップした新しいコンテナイメージを作れば、ほとんど無停止で簡単に入れ替えができる。また、問題があれば、ロールバックすることも容易である。
Docker利用のガイドライン
Dockerの利用においては、Dockerの特徴を生かすため、次のような使い方が推奨されている。
コンテナイメージを最小化する
Dockerコンテナには、必要最小限のソフトウェアしかインストールしないようにすることが重要である。不要なソフトウェアが入ったコンテナを乱立するのは、リソースの無駄遣いである。そして、Dockerの軽量だというメリットが失われてしまう。
1サービス/1コンテナ
1つのコンテナ上に1つのサービスやプロセスだけを起動するような構成が推奨されている。例えば、Webサーバのコンテナを動作させるためには、次のように実行する。
$ docker run -d --name webserver --expose=80 --pubish 80:80 localrepo:webserver-1 /usr/sbin/httpd -d FOREGROUND ⏎
--nameではこのコンテナの管理名を指定する。--exposeではコンテナのプロセスがLISTENするポートを指定し、--publishではホストのポートとコンテナのポートを関連付ける。localrepo:webserver-1は利用するDockerイメージを指示している。そして、最後に「/usr/sbin/httpd -d FOREGROUND」とあるが、これはWebサーバのプロセスをフォアグラウンドで動作させるという指定である。
この例では、httpdという1つのプロセスとその子プロセスだけが動作する。そして、httpdが停止すると、dockerの動作も終了する。
もちろん、技術的には、1つのコンテナ上に複数のサービスを起動することも可能だが、それは推奨されていない。複数のサービスを1つのコンテナに入れると、バージョンアップが容易に行えるというメリットを失ってしまう。
例えば、いわゆるWEB-DBの環境を作る場合には、DBとWEBを別々のコンテナに配置する。さらにミドルウェアがある場合には、そのコンテナも別に配置する。そして、コンテナ同士を通信させて処理を行う。
Dockerfileでコンテナの仕様を管理する
先ほどの例のように、Dockerでは、コンテナ名、利用するイメージ、使うポート、ホストポートとの関連付け、起動するプログラムなどを指定してサービスを起動する。これをいちいちコマンドラインで指定するのは煩雑である。そして、起動方法を忘れてしまうかもしれない。そのため、こうしたコンテナの仕様を、Dockerfileとよばれるフォーマットで記述し、コンテナを起動する。Dockerfileには、コンテナの作成方法も記述することができる。
ステートレス
コンテナイメージ内の情報は、動的に変更しないことが推奨されている。いつ起動しても同じ状態になるため、このようなコンテナはステートレスであると言われる。ただし、Dockerには、外部ストレージをコンテナにmountする機能がある。DBやログなどの更新されるデータは、コンテナイメージとは切り離して、永続ストレージに保存する。
Dockerのデメリット
入門のハードルが高い
従来の仮想化は、物理的なハードウェアのリプレースに過ぎなかった。そのため、通常のコンピュータを使うのと基本的には同じ方法が使えた。しかし、Docker利用のガイドラインを守ろうとすると、従来とは異なる考え方や知識を学び、理解する必要があり、エンジニアにとって入門のハードルが高く、苦戦する人が多い。そのため、導入を躊躇してしまう。以下のページではDockerのインストール、Dockerコンテナの操作等について分かりやすく解説している。
Docker HUBのセキュリティ
DockerコンテナのレジストリであるDocker HUBには、様々なコンテナが配置され公開されている。しかし、これらのコンテナが安全とは限らない。バイナリでソフトウェアが置かれているので、ウィルスが含まれている可能性もある。また、情報漏洩を引き起こすような悪意を持って配置されたコンテナもあるかもしれない。
他のホスト上のDockerとは通信ができない
Dockerのすべてのコンテナは、ホストコンピュータのネットワークやストレージを共有して利用することになる。しかし、別のホストコンピュータ上のコンテナと、これらのリソースを共有することはできない。そのため、Dockerコンテナ以外の方法で共有を行う必要がある。
コンテナの管理が煩雑
1サービス/1コンテナで動作させるため、多数のコンテナが乱立する傾向にある。すると、コンテナが増加すると、一つ一つのコンテナを管理することが難しくなる。また、コンテナ同士が連携して動作するので、連携情報も管理しなければならない。こうしたコンテナの管理は、非常に面倒である。
コンテナ管理ツール「Kubernetes」
こうしたDockerのデメリットを補うために、コンテナ・オーケストレーション・ツールと呼ばれるソフトウェアが利用される。Kubernetesは、その代表的なソフトウェアで、コンテナ管理のプラットフォームを提供する。Kubernetesを使うと、Dockerコンテナにおけるアプリケーションのデプロイ、スケール、管理を自動化することができる。また、複数のホストに跨るコンテナの連携や障害の監視と対策も自動化することができる。Amazon、Google、Microsoftなどが提供されるパブリッククラウドサービスでも、コンテナ管理のソフトウェアとしてKubernetesが採用されているケースが多い。Kubernetesについての詳しい説明は以下のリンクから閲覧できる。
デージーネットの取り組み
デージーネットでは、コンテナ仮想化技術の導入に際し、実際に多くの企業に向けDockerやKubrnetesを提案し、構築を行っている。またコンテナ仮想化技術以外にも、デージーネットでは様々なOSSを組み合わせ、お客様に最適なシステムを提案している。デージーネットで構築サービスを提供したお客様には、導入後支援サービスとして、Open Smart Assistanceを提供している。デージーネットのOpen Smart Assistanceサービスは、「作ってから使い終わるまで」をコンセプトに、導入後も継続して運用をサポートするサービスである。またデージーネットでは、導入をスムーズに行うための研修やコンサルティングサービスも提供している。
【カテゴリ】:仮想化  仮想基盤  ビックデータ  オープンソースソフトウェア  
【Webセミナー】脱PPAPへ、パスワード付きZIPファイルに代わるセキュリティ対策セミナー
日程: | 5月19日(木)Webセミナー「BigBlueButton」を使用します。 |
内容: | パスワード付きZIPファイルのメール送信(PPAP)の代替となるセキュリティ対策をご紹介します。 |
ご興味のあるかたはぜひご参加ください。 |
関連用語
- 仮想化とは
- Kubernetesとは
- KVMとは
- VirtualBoxとは
- Xenとは
- Podとは
- podmanとは
- Deploymentとは
- ReplicaSetとは
- runcとは
- rktとは
- Kata Containerとは
- containerdとは
- gVisorとは
- CRI-Oとは
- Minikubeとは
- Microk8sとは
- Dockerfileとは