よくある質問・用語集

サーバ構築のデージーネットTOP > OSS情報 > Docker〜コンテナ型仮想化〜 > Dockerとは

サーバ構築のデージーネットTOP > OSS情報 > よくある質問・用語集 > 用語集 > Dockerとは

  • もっと調べる
  • どうやって使う?

Dockerとは

Dockerはコンテナ型の仮想化を実装するソフトウェアである。Docker社が開発し、2013年にオープンソースソフトウェアとして公開している。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は、このコンテナ型仮想化を可能にするオープンソースソフトウェアの一つである。

コンテナ仕組みのイメージ

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つのコンテナ上に複数のサービスを起動することも可能だが、それは推奨されていない。複数のサービスを一つのコンテナに入れると、バージョンアップが容易に行えるというメリットを失ってしまう。

例えば、いわゆるWEB-DBの環境を作る場合には、DBとWEBを別々のコンテナに配置する。さらにミドルウェアがある場合には、そのコンテナも別に配置する。そして、コンテナ同士を通信させて処理を行う。

Dockerfileでコンテナの仕様を管理する

先ほどの例のように、Dockerでは、コンテナ名、利用するイメージ、使うポート、ホストポートとの関連付け、起動するプログラムなどを指定してサービスを起動する。これをいちいちコマンドラインで指定するのは煩雑である。そして、起動方法を忘れてしまうかもしれない。そのため、こうしたコンテナの仕様を、Dockerfileとよばれるフォーマットで記述し、コンテナを起動する。Dockerfileには、コンテナの作成方法も記述することができる。

ステートレス

コンテナイメージ内の情報は、動的に変更しないことが推奨されている。いつ起動しても同じ状態になるため、このようなコンテナはステートレスであると言われる。ただし、Dockerには、外部ストレージをコンテナにmountする機能がある。DBやログなどの更新されるデータは、コンテナイメージとは切り離して、永続ストレージに保存する。

Dockerのデメリット

入門のハードルが高い

従来の仮想化は、物理的なハードウェアのリプレースに過ぎなかった。そのため、通常のコンピュータを使うのと基本的には同じ方法が使えた。しかし、Docker利用のガイドラインを守ろうとすると、従来とは異なる考え方や知識を学ぶ必要がある。そのため、エンジニアにとっても入門のハードルが高く、導入を躊躇してしまう。

Docker HUBのセキュリティ

DockerコンテナのレジストリであるDocker HUBには、様々なコンテナが配置され公開されている。しかし、これらのコンテナが安全とは限らない。バイナリでソフトウェアが置かれているので、ウィルスが含まれている可能性もある。また、情報漏洩を引き起こすような悪意を持って配置されたコンテナもあるかもしれない。

他のホスト上のDockerとは通信ができない

Dockerのすべてのコンテナは、ホストコンピュータのネットワークやストレージを共有して利用することになる。しかし、別のホストコンピュータ上のコンテナと、これらのリソースを共有することはできない。そのため、Dockerコンテナ以外の方法で共有を行う必要がある。

コンテナの管理が煩雑

1サービス/1コンテナで動作させるため、多数のコンテナが乱立する傾向にある。すると、コンテナが増加すると、一つ一つのコンテナを管理することが難しくなる。また、コンテナ同士が連携して動作するので、連携情報も管理しなければならない。こうしたコンテナの管理は、非常に面倒である。

Dockerコンテナ管理ツール「Kubernetes」

こうしたDockerのデメリットを補うために、コンテナ・オーケストレーション・ツールと呼ばれるソフトウェアが利用される。Kubernetesは、その代表的なソフトウェアで、コンテナ管理のプラットフォームを提供する。Kubernetesを使うと、Dockerコンテナにおけるアプリケーションのデプロイ、スケール、管理を自動化することができる。また、複数のホストに跨るコンテナの連携や障害の監視と対策も自動化することができる。Amazon、Google、Microsoftなどが提供されるパブリッククラウドサービスでも、コンテナ管理のソフトウェアとしてKubernetesが採用されている。

デージーネットの取り組み

デージーネットでは、DockerやKubrnetesを提案し、構築を行っている。デージーネットでは、DockerやKubrnetesの構築や導入後の支援としてOpen Smart Assistanceを提供している。また、DockerやKubernetesの導入をスムーズに行うための研修やコンサルティングサービスも提供している。

【カテゴリ】:仮想化  仮想基盤  ビックデータ  オープンソースソフトウェア  

RHEL8新機能無料セミナー

日程: 9月20日(金)デージーネット本社
内容: 5月にリリースされたRed Hat Enterprise Linux 8と、Red Hat Enterprise Linux 8に関連するオープンソースソフトウェアについて紹介いたします。
ご興味のあるかたはぜひご参加ください。

セミナー申込

  • もっと調べる
  • どうやって使う?

関連用語

Dockerに関連するページ(事例など)


デージーネット用語集のページです。「Docker」という用語と関連情報について説明します。「Docker」について情報を収集する際、サービスをご検討いただく際などに用語集ページをお役立てください。

Dockerとは先頭へ