🐳

Dockerについて調べてみる

2022/09/26に公開

コンテナって何?Dockerとバーチャルマシンの違いは何?

  • Agenda
  1. コンテナとは?
  2. Dockerとは?
  3. バーチャルマシンとは?
  4. Dockerとバーチャルマシンの違いとは?
  5. まとめ

1. コンテナとは

  • 実行可能なイメージの実体(instance)
    Docker APIやCLIを使ってコンテナの作成、開始、停止、移動、削除ができる。
  • ローカルマシン上や、仮想マシン上でも実行でき、クラウドにもデプロイできる。
  • 可搬性(portability)がある。(多くのOSで実行可能)
  • コンテナはお互いに隔離され、それぞれが自身のソフトウェア、バイナリ、設定を使って実行する。

参考: コンテナとは何?

1-1. コンテナが誕生した背景

ここ近年のIT技術の急発展と動かすサーバー機器の激増が大きな要因です。
サーバーの持ち運ぶ手間、管理などの作業全般のスピードと解消が求められました。そこで仮想化技術が誕生し、発展してきました。
その技術発展の流れでコンテナ技術も生まれました。

1-2. コンテナ技術のメリット

冒頭でコンテナの特徴を押さえましたが、従来のサーバーと違い、どういった利点があるのでしょうか。
以下のように、求められて生まれたコンテナ技術ですから、そこに起因したメリットが多数あります。

  • ITの資源(機器など)を有効活用できる
    • 仮想ですから持ち運びの手間の必要もありません
  • 多数のサーバーを同時に管理する手間が減る
  • アプリ開発作業が捗る(開発から本番環境への移行がしやすいなど)
  • 起動と動作が軽快で、ストレスを抑え、仕事が進む

1-3. コンテナ技術のデメリット

メリットが目立ちますが、デメリットも存在します。
ただし優先度の高いものから少しずつ改善されています。

  • 基本的なサーバー設定方法以外にコンテナ技術に対しての学習時間が必要となる
  • 土台となるOSとは別のOSを、コンテナとして稼働できない。
  • ぱっと見て分からないことが多い(コマンド操作が多い)
  • 構築、設定や操作がとにかく複雑なイメージがある

1-4. そもそも仮想環境とは?

引用: 仮想環境 image

例えば:

  1. MacOSの中でWindowsを起動させてWindows専用アプリを作るなど、使っているPCのOSとは別のOSを使う用途
  2. 特定のアプリだけが動いているようにするためにウィルス対策ソフトなどの常駐アプリがない環境を作ったりなど、不具合の多いアプリを使用中のOSから確率する用途
    などが挙げられます。
  • 仮想環境の用途として最も重要なこと
    **"安全で効率的なアプリの開発や運用"**です。

ローカルの環境は人それぞれ違います。
仮想環境を行うことでチームメンバーの環境を揃えられる事のメリットはとても大きいです。(自分もハッカソンで自分は動くけど他の人が動かないとなった時に仮想環境で環境を揃えました。)
また、1つのサーバやPC上に用途に応じて自由にアプリを開発できることもできます。

1-5. 従来の仮想化とコンテナの違い

従来の仮想化では、1つの仮想環境の中に必要なものをOSから全て作ってしまう方式です。異なるOS環境を使いたい場合には有用だったが、実際の開発・運用では「OS周りは同じでいいのに」というケースが多かったようです。(いちいちOSまで作ってしまうのはリソースの無駄になる)。そこで誕生したのがコンテナです。

引用: 仮想化とコンテナの違い image

従来の仮想化ソフトウェアの代わりにコンテナエンジン(これが後述するDockerのこと)がホストOS上にあります。
最大の特徴は、その上にコンテナがあり、ゲストOSを必要としないこと各コンテナは独立して動作することです。

ゲストOSの有無による違いはイメージしづらいですが、スマホやPCの起動、シャットダウンを想像すると分かりやすいです。OSの構築や正常なシャットダウンにはそれなりの時間を要します。OSが使用するリソースも馬鹿にならず、OSを必要としないことだけでもかなりの効率化に繋がっています。

1-6. コンテナのまとめ

  • コンテナはその名の通り、「入れ物」だった
    物流業でのコンテナやDokcerの絵の「くじらがコンテナを積んでいる」のが意味する事と同じように、コンテナとはアプリの実行環境をひとまとめにして「入れ物」に入れているということです。

  • メリットが多いが、使いこなすまでにはある程度の学習コストが必要
    コンテナ技術を使いこなすには、基本的なサーバー設定方法以外にコマンド操作やネットワークに関する知識などを学ばなければなりません。

1-7. DockerとVirtualMachine

仮想マシンである"Virtual Machine"と比較しないとコンテナ技術のメリットを全て抑えることはできません。
事項からDockerとVirtualMachineを学び、比較検討したいと思います。

2. Docker

Dockerは、Docker社が開発したコンテナという概念を管理するソフトウェアで、サーバを起動する方法がシンプルで、かつ起動や処理が速いことが特徴。

従来の仮想化での仮想化ソフトウェアの代わりがコンテナエンジンになっていました。このコンテナエンジンがDockerであり、コンテナを動かすソフトウェアということです。

3. Virtual Machine

読み進める上で必要な前提知識

  • ハイパーバイザー
    コンピュータを仮想化するためのソフトウェア
    また、VirtualMachine(以降VMと表記)は、一般的な仮想マシンとします。

VMは、ハードウェアのリソース(資源)をハイパーバイザーを介してLinuxやWindowsなど複数のOS環境に分けて、それぞれでVMが稼働する。
仮想マシンごとにOSを用意するため、アプリに合わせてOSを選択できる。VMは物理環境で実装可能な機能はほぼ全て実現できるという点では、信頼の厚い手法と言われている。

4. Docker VirtualMachine 比較

Dockerはソフトウェアなので、Docker≒コンテナ技術として比較します。

4-1. Dockerのメリット・デメリット

  • メリット

    • 高速起動
    • 軽量なリソース
    • 可搬性
  • デメリット

    • カーネル共有によるセキュリティ課題

4-2. VirtualMachineのメリット・デメリット

  • メリット

    • ハードウェア集約によるコスト削減
      • (UPS, 電力, 業務効率化含めて)
    • 物理環境に比べた拡張性の高さ
    • 耐障害性
      • (1つのファイルとしてバックアップを取得可能)
  • デメリット

    • メモリ、CPUなどの物理的リソースの分割により、物理環境よりも性能が劣る可能性がある
    • 運用、セキュリティ管理の複雑さ

4-3. 比較検討

  1. 仮想化単位
    Docker -> プロセス単位での仮想化。
    VM -> マシン単位での仮想化。

  2. 自由度
    Docker -> OSとホストを共有するため、低い。
    VM -> 自由度が高い。

  3. 軽量さ(速度)
    Docker -> 軽量かつ高速起動。
    VM -> OSの起動などを伴うため、重い。

  4. セキュリティ面
    Docker -> セキュリティ面は1番の懸念点に挙げられる。
    複数のコンテナが1つのOS上で稼働するため、特権を奪取されると全てのコンテナに影響が出る。
    コンテナイメージのパプリックなレジストリ「Docker Hub」はイメージにセキュリティの脆弱性をはらんでいると言われている。

VM -> 物理システムと同様のセキュリティリスクがある。
仮想マシンのセキュリティと、「セキュリティ設定ガイド」にベストプラクティスが記載されている。

5. Docker, VMの違い まとめ

アプリケーション開発を個人開発ではなくチーム開発と想定した場合、Dockerの方が適しています。
主な理由としては"開発環境の共有のしやすさ"の部分が当たると思います。
セキュリティ面ではDocker(コンテナ技術)特有の脆弱性に気をつけなければいけません。

仮想化の技術発展から生まれたコンテナ技術ですが、コンテナ技術にも上で挙げたような課題があり、それを解決するためにまた新たなVMwareが開発されています。(VMware NSX-T 3.0が2020年に発表されました。)
今後また状況が変わっていくかもしれません。

現時点の開発現場では、様々な開発・導入・実行が行えるプラットフォームが提供されるDockerが好まれているのが現状だと思われます。

Discussion