Dockerとは何か、メリット/デメリットまとめ

Dockerとは何か、メリット/デメリットまとめ

当ページのリンクには広告が含まれています。



✓目次


この記事の対象者


・ 「仮想化」、「Docker」、聞いたことあってなんとなくわかるけど、ちゃんと理解していない気がする人向け

・ だけど細かい内容ではなく概要レベルで何なのか、何がうれしいのかを知りたい、という人向け

仮想環境とは


シンプルに言ってしまえば、下図におけるゲストOSとアプリの部分を「仮想環境」と述べることが多いです。


仮想環境とは


ホストOSというのは、我々が普段使っているノートPCのOSを指します。

そのPCにOracle VirtualBoxとかVMWare Workstation Playerというソフトウェアをインストールし、その中にUbuntuとかCentOSと呼ばれるゲストOSを導入してアプリを動作させている、という構成の場合、ゲストOSからアプリのことを仮想環境といいます。

この辺りは、実際に環境構築して手を動かしてみるとよくわかると思います。

Dockerとは


Docker社が提供しているコンテナ型アプリケーション実行環境を指します。

Docker自体はGoで作られており、Dockerには、Docker Community Edition(Docker CE)とDocker Enterprise Edition(Docker EE)が存在します。

Docker EEは有料版で、Docker CEは無償版になります。

有料版は、Docker社が認定したコンテナやプラグインが利用できたり、イメージのセキュリティスキャンが行われる等の恩恵が受けられます。基本的なDockerの機能は、無償版と有償版、共に利用できます。また、無償版は、さらに Stable版と、Edge版の2種類が存在します。

Stable版は4半期ごとにリリースされ、Edge版は1か月ごとにリリースされます。

最新版を使いたい場合は、Edge版を選択しましょう。

従来の仮想化とコンテナ型仮想化の違い


従来のホスト型仮想化とコンテナ型仮想化の違いは、コンテナ型仮想化は、ゲストOSを持たない、という点です。


ホスト型仮想化とコンテナ型仮想化の違い

ホスト型仮想化は、ハイパーバイザというミドルウェア上に各々のアプリを動作させるために、専有されたゲストOSを用意します。

一方、コンテナ型仮想化は、ゲストOSを必要とせず、ホストOSのカーネルを用いて(共有して)動作する仕組みを取ります。

ホスト型仮想化 vs コンテナ型仮想化


以下4つの観点で比較します。

・ その①:「仮想化のオーバーヘッド」

・ その②:「アプリケーション実行の再現性」

・ その③:「OSの自由度」

・ その④: 「分離レベル」

その①:「仮想化のオーバーヘッド」

  • ホスト型仮想化
    • リソース(CPUやメモリの使用率など)の面で、オーバーヘッドが多く、起動や停止に時間がかかる
  • コンテナ型仮想化
    • コンテナは、アプリケーション実行に必要なものだけを含み、ホストOSのカーネルを使用するため、動作が速くリソースの使用率も少なくて済む。

その②: 「アプリケーション実行の再現性」

  • ホスト型仮想化
    • 仮想マシンの環境の違いにより、アプリケーションが動作しなくなることが稀に発生する。
  • コンテナ型仮想化
    • 特定のアプリケーションを動作させるために必要なものは、Dockerイメージにまとまっている。そのため、同じDockerイメージからコンテナを起動する限り、環境が変わっても同様に動作する。Dockerイメージについては後述します。

その③: 「OSの自由度」

  • ホスト型仮想化
    • 仮想マシン上で任意のOSを動作させることができる。
  • コンテナ型仮想化
    • コンテナは、ホストOSのカーネルを使用して動作する。そのため、WindowsOS上で直接Linuxコンテナを動作させることはできない。その逆の、LinuxOS上で直接Windowsコンテナも動作させることもできない。

その④: 「分離レベル」

  • ホスト型仮想化
    • ハードウェアレベルで仮想化されており、ホストOSや仮想マシン間の分離レベルが高い。そのため、先ほどの図でいうVM1がVM2に影響を与える、といったことが起こりにくい。
  • コンテナ型仮想化
    • OSの機能を使用した仮想化は、ホスト型仮想化に比べて分離レベルが低い。そのため、要求されるセキュリティレベルが高いシステムを構築するには不向きと言われている。
    • 外部から侵入されにくい設定や構成にし、不用意にパブリックなNWに公開しない点に注意する必要がある。また、不必要なパッケージをインストールしない、常にアップデートを心がけるなど、細かいケアが必要になる。

上記の記述を表でまとめると以下の通りです。

項目 ホスト型仮想化 コンテナ型仮想化
オーバーヘッド
アプリ実行の再現性
OSの自由度
分離レベル

DockerイメージとDockerコンテナ


DockerイメージとDockerコンテナの違いを把握しておくことは、今後Dockerを実際に使ったり、kubernetesと言われるコンテナオーケストレーションツールを活用する際など、重要になってきます。

以降で簡単にまとめておきます。

Dockerイメージとは


  • Dockerイメージとは、コンテナ実行に必要なファイルをまとめたファイルシステム

    • Webサーバだったら、Apacheが既に含まれているもの。そのほかRubyの実行環境が入っていたりもする。要するに最初からパッケージ化されていて、実行環境を定義したもの。
    • aufsなどの特殊なファイルシステムが使用されている。aufs (AnotherUnionFS) は Linux のファイルシステムサービスであり、複数の異なるファイルシステム (ブランチと呼ばれる) のファイルやディレクトリ同士を透過的に重ねる (マージする) ことができる技術。
  • Dockerイメージを作成する方法は、基本的に、「ソースコードを作って、ビルドして、イメージを作る」という流れになります。

    • ソースコードというのは、Dockerfileというもので、必要なソフトウェアのインストールやアプリケーションの起動などのコマンド郡を記述したファイルです。
      • ソフトウェアのインストールやアプリケーションの起動というのは、例えば、pipコマンドでインストールしたり、所定のファイルをコピーしてコマンドを実行したり等です。
    • ビルドというのは、Docker社またはDockerコミュニティが提供しているOSのベースイメージ(CentOSやAlpine等のイメージ)に対して、Dockerfileでまとめた操作を実施することで機能を加えることを指します。そしてその結果として生成されるのが、自身で作成したDockerイメージになります。

Dockerコンテナとは


  • Dockerコンテナとは、Dockerイメージを実行してできる実際の実行環境。
  • Dockerイメージが実行環境のテンプレートであり、Dockerコンテナは、このテンプレートを用いて構築された実際の環境、と理解しておけばよい。

Docker Hubとは


  • クラウド上に展開されたDockerイメージのレジストリサービスです。

Docker Hubを使用することで以下のことを行うことができます。

  1. Dockerイメージの管理(検索、管理、取得、送信)を行うことができる。
  2. GitHubなどのレポジトリからImageの自動構築(レポジトリを自動更新)
  3. グループ作成とグループ内ユーザでのコミュニティ作成

Docker Hubには、フレームワークやツールを作成した会社やコミュニティが公式に作成したイメージも公開されています。

そのため、何らかのツールを使う場合、まずはDocker Hubに公式イメージがあるかと確認してみると良いでしょう。

まとめ

最後に本記事でまとめたDockerの特長とメリット・デメリットをまとめます。

  • Dockerとは、Docker社が提供しているコンテナ型アプリケーション実行環境
  • 従来のホスト型仮想環境との違いは、ゲストOSを持たない、という点
  • ホスト型仮想化ではなく、Dockerを活用するメリットは、「動作が速くリソースの使用率も少なくて済む」、「同じDockerイメージからコンテナを起動する限り、環境が変わっても同様に動作する」という点。
    • 一方、ホスト型仮想化と比較した場合のデメリットとしては、「OSの自由度が低い」、「分離レベルが低く、セキュリティ面でケアが必要になる」という点
  • Dockerイメージはテンプレート。DockerコンテナはDockerイメージを実行してできる実際の実行環境。

Dockerに関する基礎知識はこれで問題ないかと思います。

より専門的な内容や実装スキルを身に着けたい場合は、Udemyを活用した学習が効率的です。

30日間の返金保証、および一流講師へのQ&Aシステムが整ったオンライン学習プラットフォームです。

Udemyが提供しているDockerのベストセラー講座をご確認ください。

駆け出しエンジニアのためのDocker入門
icon


Dockerを用いてRails開発環境構築方法もまとめているので参照ください


コメント