便利ツール

docker の利点と欠点

docker の利点

隔離された実行環境

docker コンテナを使うと、互いに影響しない隔離された実行環境を構築できます。
具体的には、以下のような競合を解決できます。

  • ディレクトリの競合
  • フレームワークの競合
  • ネットワークのポートの競合

 

例えば、バージョンや内容の異なるバイナリを「/usr/bin/myapp」にインストールする場合、
システムAとシステムBとで同じディレクトリにインストールすることはできません。
インストール先や、実行環境の調整が必要になります。

また、フレームワークやネットワークのポート場合も同じく、
競合を解消するために調整や変更が必要となります。

 

これらの競合は、docker のコンテナを使用することで簡単に解決できます

環境を隔離するコンテナ

環境を隔離するコンテナ

 

システムを容易に構築

docker コンテナは、それぞれ独立したシステム実行環境であることを紹介しました。
コンテナを使うには、フレームワークやライブラリ群をあらかじめインストールしておく必要がります。
ただ、コンテナを真っ新の状態から作るのは結構な手間がかかります

 

そこで docker では、「コンテナの基」となる docker イメージ という仕組みがあります。
必要なファイルを全て固めたアーカイブパッケージです。
イメージをPULLすれば、容易にコンテナを作成することができるようになっています。

 

また、docker イメージは Docker社 が運営する Docker Hub で色々公開されています。
OS の各種ディストリビューション(Ubuntu, Debian, CentOSなど)から始まり、
各種フレームワーク(Apache, PHP, MySQLなど)を備えたイメージまで、多種多様に揃っています。

参考

OpenGrok の docker イメージを使った環境構築は「dockerを使ってOpenGrokを設置」を参照。

 

Docker Hub で公開されているイメージや、GitHub で公開されているイメージ生成スクリプト等、
アプリケーション入り docker イメージを使えば、複雑なシステムを簡単に構築できます

 

ポータビリティー性が高い

Dockerfile を記述することによって、カスタムの docker イメージを作成可能です。
このイメージを基にして、いくつでも同じコンテナを作ることができます。

 

また、docker イメージ、およびコンテナは他のサーバーへのコピーも容易にできます。
Docker Hub で公開されているように、ポータビリティーが非常に高くなっています。

 

例えば、クロスコンパイルの開発環境を docker コンテナ内で1回構築すれば、
開発メンバー全員に docker イメージ/コンテナをコピーすれば同じ環境を容易に複製できます。

参考

docker イメージ・コンテナのエクスポートやインポートは
dockerイメージやコンテナのインポートとエクスポート」をご覧ください。

 

docker の欠点

Linux システムでしか動作しない

Docker は Linux の仕組みを利用しているため、Linux 以外の環境では動作しません。
Windows や Mac 向けの Docker エンジンも提供されていますが、Linux の仮想マシン上で動作させています。
Windows Server や一部の Windows では動作しない等の弊害があります

 

また、同一の Linux Kernel 上で docker エンジン、docker コンテナが動作するため、
カーネル違いの検証は別のマシンまたは仮想マシンを使う必要があります

 

完全な分離環境ではない

docker は「隔離した空間でプログラムを実行する技術」です。
仮想サーバーや Hyper-Visor と異なり、ハードウェアをエミュレートしているわけではありません

docker には、コンテナの CPU 利用率やメモリ消費量を制限する仕組みはありますが、
ソフトウェアで制御しているため完ぺきではありません。

また、Docker Engine にセキュリティーホールがあれば、そもそも隔離した部分に抜け穴が生じます。
※原理的にあり得るという話です。

 

[おまけ] 仮想サーバー/Hyper-Visor との違い

docker とよく似た技術に「仮想サーバー」や「Hyper-Visor」がありますが、
docker とは根本的な考え方が異なります。

 

仮想サーバーは、1台の物理的なサーバーの中に複数の仮想的なサーバーを作り、
物理的なハードウェアを仮想的なサーバーが分割して使います。

また、仮想サーバーにはそれぞれ異なるOSがインストールされ、その上にシステムが構築されます。
複数台のサーバーを、1台のサーバー上で仮想的に動作させる技術です。

 

一方、docker コンテナはハードウェアを分割する技術ではありません。
1台のサーバー上で、たくさんのアプリケーションが隔離して実行されるだけです。

仮想サーバーとコンテナの違い

仮想サーバーとコンテナの違い

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-便利ツール
-