👌

開発系エンジニアのためのDocker絵とき入門〜第一章「仮想化とは」〜

2024/06/05に公開

はじめに

この備忘録は、新卒2年目の初学者バックエンドエンジニアの学習記録のためにつけているものです。
解釈違いや、誤情報がある可能性があります。見つけた際にはご指摘をお願いします。
開発を進める中で、すでにリリースされているサービスの開発にジョインしていたため認識していませんでしたが、Dockerとはなんなのか、新サービスを開発するためにはどのような知識が必要なのかを把握するために本書を使用して理解をしていきたいと思います。

第1章〜仮想化とは〜

物理マシンと仮想マシン

物理マシンとは

  • CPU・メモリ・ストレージ等のハドウェアで構成されるコンピュータのこと
  • PCや、データセンターに設置されたサーバ等を動かしているコンピュータのこと
  • 物理的な実態が存在する

仮想マシンと仮想化ソフトウェア

  • ハードウェアの一部をソフトウェアで実現した物理マシンのように見えるもの
  • 仮想マシンは仮想化ソフトウェアに起動され管理される
  • 物理マシンの性能の範囲内で、複数の仮想マシンを起動できる
  • 仮想「実際には無い事物を、仮にあるものとして考えてみること。仮に想定すること」
  • 仮に想定するマシンより、実質的なマシンの方が正しい解釈
  • 仮想マシンは「物理マシンではないが、同じように動く実質的なマシン」と解釈できる

仮想マシンを使うメリット

  • 仮想マシンは既存の物理マシン上に低コストで構築できm物理マシンの使用していないリソースを有効に活用することができる
  • 物理マシンによるサーバは、搬入や導入の費用に加えて、電気代や設置スペース等も必要
  • 仮想マシンは、一台の物理マシンに複数の仮想マシンを構築できその分だけコストを削減できる
  • 仮想マシンは仮想ソフトウェアに同じ設定を反映させれば同じ構成をkどうできるため、簡単に別の物理マシンで起動し直せる
  • 物理マシンに問題が発生した時に、別の物理マシンにのせかいえて機能を提供し続けることが可能

開発用の物理マシンで仮想マシンを使うメリット

  • 一台のマシンで異なるサービス全ての都合を満たすようにプログラミング言語やモジュールを準備するのは困難
    • プログラミング言語のバージョンが衝突したり、別の目的で作成した設定ファイルが意図せず他のサービスに影響を与えてしまう可能性があるため
  • 物理マシンで仮想化ソフトウェアを使い仮想マシンを複数作れば、それぞれの用途ごとに簡単に環境を独立させられる
  • 複数の開発者が集まったときの物理マシンの差異を解消することも容易にできる
  • OSの違いや、インストール先の違いも防げる

仮想化ソフトウェアの種類

  • 仮想化ソフトウェアをどこにインストールする
  • 仮想化ソフトウェアは何を管理するか

ホスト型仮想化

  • ホスト型仮想化ソフトウェアは、ホストOSにインストールしてゲストOSを管理する
  • ホストOSとゲストOSが共存できることがメリット
  • ホストOSのWebブラウザを使いながらゲストOSに何かを実行させることが可能
  • ゲストOSからハードウェアを制御するにはホストOSを経由する必要があり、ハードウェアに関する動作が遅くなることがデメリット

ハイパーバイザー型仮想化

  • ハイパーバイザー型の仮想化ソフトウェアは、物理マシンにインストールしてゲストOSを管理する
  • ハイパーバイザー型仮想化のメリットは、ホストOSが存在しないためゲストOSにリソースを多く割り当てられることと、ホストOSを通さずハードウェアを制御することができること
  • デメリットは、ホスト型仮想化のようにホストOSと共存させられないこと

コンテナ型仮想化

  • ホストOSにインストールしてコンテナという単位でアプリケーションを管理する
  • ゲストOSを起動しないのでリソース消費が少ないテント起動が高速な点がめいrっと
  • ホストOSとの共存も可能
  • ゲストOSを持たないためLinuxのコンテナを起動するにはホストマシンからLinuxカーネルを割り当てる必要があることがデメリット

コンテナ型仮想化の特徴

コンテナにゲストOSは含まれないが、あるように見える

1つのコンテナで1つのアプリケーション

  • 別サービスで使っている物理サーバだと、他のサービスを構築しようとする時に、必要な要素を物理マシンに直接インストールすると、プログラミング言語のバージョンアップがしにくくなったり、設定の依存関係が把握しにくくになる
  • コンテナの小ささは軌道の速さにも影響する
  • ゲストOSを起動する仮想化ソフトウェアと比べると、コンテナが高そうかは極めて高速に起動する

アプリケーションをコンテナにまとめると実行環境ごとに移動できる

  • 手元の物理マシンで動作確認をしたプログラムをサーバにデプロイしたらエラーが発生し、「モジュールのバージョンやインストール先が違った」といったエラーがなくなる
  • コンテナ型仮想化では、プログラムを実行環境と関連する設定を一緒にしてコンテナで管理し、実行環境を含むコンテナを丸ごとデプロイする
  • アプリケーションを動かすために必要なものを一式移動させれば、移動先でも同じように動く

Linuxマシンが必要

  • コンテナにはゲストOSが含まれていないのにLinuxのように見えるのは、ホストマシンにLinuxカーネルを借りているから
  • ホストOSにLinux仮想マシンを起動して、その上で仮想化ソフトウェアを動作させる必要がある

物理マシンのCPUアーキテクチャの違いがコンテナに影響

  • 物理マシンの違いがコンテナに影響してしまうという問題を認識しておく必要がある

Discussion