環境構築

0.章の概要

環境構築は、AIモデルやアプリケーションを動作させるために必要なソフトウェアやライブラリ、依存関係を適切に整備する作業です。 ここでは、現代の開発環境で欠かせない仮想化技術(主にDocker)についてをメインに扱っていきます。

1. コンテナ型仮想化

学習キーワード: 仮想化環境、ホスト型、ハイパーバイザー型、コンテナ型、Docker、Dockerfile

概要

仮想化環境とは、1つの物理的なハードウェア上で、複数の独立した計算環境を構築する技術です。 これにより、1台のサーバーを仮想的に分割して複数のOSやアプリケーションを同時に実行できるようになります。

※ちなみに、今となっては考えられないですが、仮想化技術が普及する以前は、サーバーは各用途に応じて専用のハードウェアを必要としていたため、サーバーの種類や数が増えるにつれて保有するハードウェアの台数も増加していました。

以下に仮想化の特徴をいくつか挙げておきます。

  • メリット:
    • リソースの効率的な使用:物理サーバーが持つリソースを複数の仮想サーバーに自由配分でき、効率的に使用できる。(例:メールサーバーはたまにしか使わないが、Webサーバーはよく使うので多くのリソースを割りあてる、など)
    • 環境の再現性が高い:仮想サーバーの設定を簡単に複製でき、環境の再現性が高まる。(故障時の復旧も簡単)
    • ハードウェアの削減:仮想化によって、物理サーバーの数を削減でき、ハードウェアのコストを削減することが可能。
  • デメリット:
    • セキュリティの懸念:仮想サーバー間のセキュリティを確保する必要があり、従来のセキュリティ対策では不十分。
    • パフォーマンスの低下:リソースの分配によっては、システムのパフォーマンスが低下する可能性がある。

仮想化技術には、ホスト型仮想化ハイパーバイザー型仮想化コンテナ型仮想化が挙げられ、特に、コンテナ型仮想化は、高速な起動時間やリソース効率、環境の再現性が高いことから、近年のAI開発環境で主流となっています。その代表例が、後述するDockerになります。


仮想化環境の種類

まずは、ホスト型仮想化ハイパーバイザー型仮想化コンテナ型仮想化の概要を下記に示します。

仮想化環境の種類

一般的に、ホストOSは、仮想環境をつくるベースとなるOSを指し、ゲストOSは仮想環境上のOSを指します。

ホスト型仮想化
ホスト型仮想化の構造を示す図。ホストOS上に仮想環境作成ソフトウェアが動作し、その中でゲストOSが稼働している様子を示しています。

ホスト型仮想化は、ホストOSに仮想環境作成ソフトウェアをインストールする方法で、パソコンにホストOSをインストールし、そのOS上で仮想環境を作成します。手軽に始められるメリットがありますが、ホストOSを起動しなければならない点や、ホストOSと仮想マシン間のオーバーヘッドが大きくなるという欠点もあります。

オーバーヘッドとは・・・
仮想環境の実行に伴い追加される計算リソースや、ホストOSと仮想環境間のデータ転送にかかる処理負荷を指します。

ホスト型仮想化の例: VMware Workstation、VirtualBox。

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

ハイパーバイザー型仮想化は、ハイパーバイザーを直接ハードウェアにインストールする方法で、ホストOSの起動を要しないため、起動が早く、リソースの効率化にもつながります。ただし、既存のハードウェアを流用できないため、新規のハードウェア購入など、コストがかかることに注意が必要です。

ハイパーバイザー型仮想化の例: VMware ESXi、Microsoft Hyper-V、KVM(Kernel-based Virtual Machine)。

コンテナ型仮想化
コンテナ型仮想化

コンテナ型仮想化は新しいタイプの仮想化技術で、ホストOSに「コンテナエンジン」とよばれる仮想化ソフトウェアをインストールし、その中でコンテナと呼ばれる環境を作り、アプリケーションを実行させる方法です。コンテナはホストOSのカーネルを共有して利用するため、従来の仮想化と違いゲストOSという概念はありません。そのため、余分なリソースが不要であり、軽快な環境が構築できます。

コンテナ型仮想化の例: Docker、Kubernetes(Dockerを管理するためのツール)。


Dockerの仕組み

Dockerはコンテナ型仮想化の代表的なツールで、軽量な仮想化環境を構築できます。各コンテナは、ホストOSから隔離された環境として、アプリ開発環境を構築する事できるため、複数人での開発環境の統一が簡単に実現できます。

  • Dockerの特徴:
    • 高速なデプロイ:コンテナの起動が数秒で完了する。
    • 再現性の高い環境:異なるマシンでも同じ動作を行える。
    • リソース効率:複数のコンテナが同一OSを共有する。
  • 基本構成要素:
    • Dockerイメージ: 実行環境を定義した、編集可能なテンプレートファイルで、アプリケーション実行に必要な情報を持っています。Docker Hubに公式のものや、他人が作成したイメージが公開されています。(SQLのテンプレートやPythonのテンプレートなどを作成しておき、仮想環境で必要なファイルを組み合わせて使用するイメージ。)
    • Dockerコンテナ: Dockerで構築される仮想環境のことで、Dockerコンテナは独立した環境として存在しています(Dockerイメージの内容を元に作成)。
    • Dockerfile: Dockerイメージを作成するための設定ファイルを指します。

Dockerを使った基本的な流れ(新しく自作コンテナを作成する場合)
docker使用の流れ
  1. Dockerfileの作成: 必要な環境やパッケージを定義します。
  2. Dockerイメージのビルド: `docker build -t <イメージ名> .` を実行。
  3. コンテナの起動: `docker run -it <イメージ名>` を実行。

Dockerfileの記述例

以下は、Python環境をセットアップするDockerfileの例です。

docker使用の流れ
  • FROM: ベースとなるOSイメージを指定。
  • WORKDIR: 作業ディレクトリを指定。
  • COPY: 必要なファイルをコンテナ内にコピー。
  • RUN: コマンドを実行(例: パッケージのインストール)。
  • CMD: コンテナ起動時の実行コマンド。

関連用語の補足
  • カーネル: OSの中核部分で、ハードウェアとソフトウェアを仲介。
  • Docker Compose: 複数のコンテナを一元管理する仕組みで、各コンテナの設定や依存関係を「.yml」ファイルで記述する。これにより、複数のサービスを連携させて容易に起動・停止可能になる。
  • Kubernetes: コンテナを管理・スケーリングするためのツール。
  • Docker Hub: Dockerイメージを管理するリポジトリ

キーワードまとめ

仮想化環境、ホスト型、ハイパーバイザー型、コンテナ型、Docker、Dockerfile