Dockerとは
Dockerは、コンテナ型の仮想化を実装するソフトウェアである。Docker社が開発し、2013年にオープンソースとして公開している。Dockerを使うことで、システムに対する設定手続きなどがすべてコード化され、コンテナが扱いやすくなる。そのため、アプリケーション開発者の間でも注目され、現在まで普及が進んでいる。
他の仮想環境と違いDockerの仕組みは、ハードディスクの使用量が少なくて済み、起動が速く劣化が少ないといわれている。Dockerは、主要なOSでも標準でサポートされており、コンテナ型仮想化としては事実上のデファクトスタンダードとなっている。
最近では、いくつかのクラウドベンダーがコンテナ型仮想化のサービスを提供している。そして、ほとんどのサービスではDockerを利用することができる。クラウドサービス、ビッグデータ基盤などを管理するためのIT基盤としても、Dockerは高く評価されている。なお、Dockerコンテナを管理するコマンド名もdockerである。この記事では、仮想化とコンテナについて解説し、Dockerを利用するメリット・デメリット、Docker利用のガイドラインについてまとめている。
仮想化とコンテナ
Dockerとコンテナの関係は、仮想マシンを使った仮想化と比較されることが多い。今回はDockerのメリットを解説する前に、まずは基礎知識として仮想化とコンテナとは何かを解説する。
従来の仮想化
通常、1台のパソコンに1つのOSが起動し、その上でアプリケーションを動かすという構成が基本である。これに対して仮想化の環境では、1つの物理的なハードウェアの中に、複数の仮想的なハードウェアを隔離し、個別のOSを動作させている。従来の仮想化では、この複数の仮想的なハードウェアを動作させるマシンとして、仮想マシンを利用していた。仮想マシンは、ハードウェアリソースを別の仮想マシンに模倣し、独立したサーバ環境を作り出す。そのためLinuxやWindowsといった別のOSを動かすことができる。ハードウェアを直接制御するOSのことをホストOS、仮想化ソフトやハイパーバイザー上で動作するOSの事をゲストOSと呼ぶ。仮想マシンの手法には、次のようなホスト型とハイパーバイザ型が存在する。
ホスト型
ホスト型とはホストOS上に仮想化ソフトウェアをインストールし、その上でゲストOSを動かすことをいう。ホスト型では、ホストOSとゲストOSで異なるOSを利用することが可能である。つまりホストOSにwindowsをダウンロードした場合に、ゲストOSはLinuxやMacを動かすこともできる。ホスト型を利用できるソフトウェアとしてVMware Player、VMware Fusion、Oracle VirtualBoxなどがある。
ハイパーバイザー型
ハイパーバイザー型とは、ホストOSを使用せず、直接サーバ上に仮想化のソフトウェアをインストールし動作させることをいう。ホストOSがないため、ハードウェアを直接制御することができ、処理速度を向上させることができる。そして複数の仮想マシンを効率よく動作させることも可能である。
コンテナ型仮想化
対して、コンテナ型ではゲストOSを起動せず、ホストOS上のコンテナエンジンから、他のサービスと分離させたアプリケーション環境をパッケージ化して作成する。コンテナ内でアプリケーションを動かすため、アプリケーションに必要なファイルだけがコンテナに含まれる。従来の仮想マシンでは、ファイルシステムのイメージをそのまま保管するため、ゲストOSは物理的なハードウェアと同じだけの容量が必要であった。一方コンテナ型仮想環境は、最低限のファイルサイズで実装することが可能で、非常に軽量である。また、コンテナ化することで、アプリケーションがあるコンピュータ環境から他のコンピュータ環境へ、アプリケーションの移行を早く確実に行うことも可能になる。Dockerは、このコンテナ型仮想化を実現可能にするオープンソースソフトウェアの1つである。
Dockerを利用するメリット
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コンテナで動作させるため、多数のコンテナが乱立する傾向にある。すると、コンテナが増加するにつれて、一つ一つのコンテナを管理することが難しくなる。また、コンテナ同士が連携して動作するので、連携情報も管理しなければならない。こうしたコンテナの管理は、非常に面倒である。なお、Docker composeという仕組みを利用すれば、複数のコンテナで構成されるシステムの運用管理がしやすくなる。Docker composeでは、YAML形式のcomposeファイルに、コンテナのビルド情報、ネットワークの情報、起動方法などのコンテナの情報を記載する。
Dockerコンテナを管理しやすくするOSS
先で述べたように、Dockerコンテナ単体では、各コンテナのネットワーク情報や連携情報の管理に非常に手間がかかる。こうしたデメリットを解決するために、コンテナを管理しやすくする機能を持ったOSSを組み合わせて利用することが多い。以下では、コンテナ管理をより便利に行うためのOSSを紹介する。
コンテナ管理ツール「Kubernetes」
Dockerのコンテナ管理の煩雑さを補うために、コンテナ・オーケストレーション・ツールと呼ばれるソフトウェアが利用される。Kubernetesは、その代表的なソフトウェアで、コンテナ管理のプラットフォームを提供する。Kubernetesを使うことで、サービスを高速で起動でき、Dockerコンテナにおけるアプリケーションのデプロイ、スケール、管理の自動化が可能となる。また、複数のホストに跨るコンテナの連携や障害の監視と対策も自動化することができる。Amazon(AWS)、Google、Microsoftなどで提供されるパブリッククラウドサービスでも、コンテナ管理のソフトウェアとしてKubernetesが採用されているケースが多い。
Kubernetesの詳細は以下のリンクから閲覧できる。
「Kubernetes〜コンテナ管理の課題を解決するOSS〜」へ
コンテナ管理ツール「Portainer」
さらに、DockerやKubernetesのコンテナ環境を管理するGUIツールとして、オープンソースソフトウェアのPortainerがある。あらかじめPortainerに準備されているテンプレートなどを使用して、ウェブインタフェースにあるImagesのボタンからコンテナイメージの一覧を表示したり、コンテナイメージのダウンロードや削除を行うことができる。このように、シンプルな操作でコンテナを簡単に構成、監視することができるため、コマンド操作に慣れていないユーザでも扱いやすくなっている。
Kubernetesでも管理用のダッシュボードが用意されているが、Kubernetesの場合、最低3~5台のコンテナ実行環境が必要になる。一方、Portainerは、小規模なシステムのコンテナ環境にも対応しているため、1台のサーバしか利用しないといった場合もコンテナを管理することが可能である。
Portainerについての詳しい説明は以下のリンクから閲覧できる。
デージーネットの取り組み
デージーネットでは、コンテナ仮想化技術の導入に際し、実際に多くの企業に向けDockerやKubrnetesを提案し、構築を行っている。またコンテナ仮想化技術以外にも様々なOSSを組み合わせ、お客様に最適なシステムを提案している。弊社で構築サービスを提供したお客様には、導入後支援サービスとして、Open Smart Assistanceを提供している。
Open Smart Assistanceサービスは、「作ってから使い終わるまで」をコンセプトに、導入後も継続して運用をサポートするサービスである。ソフトウェアの使い方やインストール方法等にお答えするQ&Aや、障害調査、セキュリティ情報などのサポートを提供している。また、導入をスムーズに行うための研修やコンサルティングサービスも提供している。
【カテゴリ】:仮想化  仮想基盤  ビックデータ  オープンソースソフトウェア  
【Webセミナー】自社でOSSを採用しよう!今更聞けないOSSの基本セミナー
日程: | 11月22日(金)Webセミナー「BigBlueButton」を使用します。 |
内容: | OSSを導入したいけど、どこから手をつければいいかわからない方必見! |
ご興味のあるかたはぜひご参加ください。 |
関連用語
- 仮想化とは
- Kubernetesとは
- KVMとは
- VirtualBoxとは
- Xenとは
- Podとは
- podmanとは
- Deploymentとは
- ReplicaSetとは
- runcとは
- rktとは
- Kata Containerとは
- containerdとは
- gVisorとは
- CRI-Oとは
- Minikubeとは
- Microk8sとは
- Dockerfileとは