これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.
OS仮想化技術基礎
1 - OS仮想化技術の基礎
1.1. OS仮想化とは
仮想化とは1台の物理的なハードウェアの中に仮想化ソフトウェアを稼働させることで複数の仮想的なハードウェアを隔離し、個別のOSを動作させることを指す。
仮想化のメリットは以下の通り。
- 用意する物理マシンを減らすことができる
- 物理的資源の管理にかかる手間が省ける
- リソースの配分も状況に応じて柔軟に設定できる
1.1.1. ホストOSとゲストOS
ホストOSは仮想環境を提供するプログラムを動作させる基盤のことで、ゲストOSは仮想環境上で動作するOSのことを言う。
ホストOSはハイパーバイザーとも呼ばれる場合がある。
1.1.2. 仮想化基盤の種類
仮想サーバは仮想化基盤により仮想化されたサーバのことを言う。
仮想化されたサーバでは1つの物理サーバ上に複数の異なるOSを動かすことができる。
仮想化基盤にはハイパーバイザ型、ホスト型、コンテナ型がある。
ハイパーバイザ型
ハイパーバイザは仮想化のためのOSのようなものを指し、サーバにインストールし、そのOSの上で仮想マシンを稼働させるのが特徴となる。
ハイパーバイザー型はホストOSが不要な仮想化基盤であり、現在は主流の基盤となっている。
ホストOSを必要としないためハードウェアを直接制御することができ仮想マシンの速度低下を最小限に抑えることができる。
また特徴としてはライブマイグレーションが可能なことがある。(他のハイパーバイザーで稼働している仮想サーバに瞬時に機能を移動させる機能)が
有名なものにはVMware ESXI、KVM、XeN、Hyper-Vなどがある。
- メリット
- ホストOSが不要でハードウェアの直接制御が可能
- システム全体から見るとリソース使用効率が良い
- 管理サーバの台数の削減が見込める
- デメリット
- 仮想化環境の高度な管理を実現するツールが標準でない場合がある
- ハードウェアのスペックが低かった場合は処理能力不足となる
ホスト型
ホスト型はハードウェアの中にOS上に土台となる仮想化ソフトウェアをインストールし仮想化ソフトウェアで仮想マシンを稼働させるのが特徴。
この環境では仮想化ソフトウェアを動作させるのでハードウェアにかかるリソースは余計に消費をしやすい。
そのため本番環境には適していないため、検証環境/実験環境によく使用される。
ホスト型の仮想化ソフトウェアにはVMware Workstation Player、VirualBoxなどがある。
- メリット
- 既存マシンを維持したまま仮想化ができる
- テスト環境の作成に便利
- デメリット
- 仮想マシンの実行速度がほかの方式より遅い
- ホストOSに物理リソースが必要
- ゲストOSの本格運用には処理速度が限定的
コンテナ型
コンテナ型では「アプリケーションを実行するための領域」であるコンテナの実行環境を仮想化するのが特徴。
つまりコンテナ型ではアプリケーション実行環境を仮想化していると言える。
有名なものにはDocker、LXCがある。
- メリット
- 必要最小限のCPUやメモリしか使用しないので負荷が小さく高速な動作が実現可能
- コピーも簡単なので作業時間の大幅な短縮が可能
- 開発と運用の相性がよい
- デメリット
- 複数のホストでのコンテナ運用が煩雑になる
- カーネルを他のコンテナと共有するため個別に変更できない
1.2. 仮想化基盤のプラットフォーム/製品
1.2.1. ハイパーバイザ型
VMware vSphere/ESXI
VMware vSphere/ESXIはVMware社が提供するハイパーバイザ型仮想化プラットフォーム。
vSphereにより、大規模な仮想化環境の管理が容易になり、冗長性や拡張性が向上する。
項目 | VMware ESXI | VMware vSphere |
---|---|---|
役割 | ハイパーバイザー型仮想化プラットフォーム。仮想マシンの作成、実行、管理を担当する。 | VMware ESXiハイパーバイザーを基盤にした仮想化プラットフォームの管理および拡張機能を提供する |
概要 | ESXiは高いパフォーマンスとセキュリティを提供し、さまざまなオペレーティングシステムをサポートしている | 仮想化環境の中央管理、クラスタリング、バックアップ、監視、セキュリティ、およびリソース管理などの高度な機能を提供する管理ツール |
Proxmox VE
Proxmox VEはの仮想化とコンテナ仮想化を統合したOSSのハイパーバイザ型仮想化プラットフォーム
中小規模から大規模な仮想化環境を構築し、管理するのに適している。
特徴は以下の通り。
- KVMハイパーバイザーベース
- LXCコンテナのサポート
- Webベースの管理インターフェイス
- コミュニティバージョンあり
Hyper-V
Hyper-VはMicrosoftのハイパーバイザ型仮想化プラットフォームでWindows上で動作する。
またHyper-Vはサーバー仮想化のために設計されている。
特徴は以下の通り。
- Hyper-Vマネージャーを使用して仮想マシンの管理が行える
- スナップショット機能
XenServer
XenServerはOSSの仮想化プラットフォームであるXenをベースにしたハイパーバイザ型仮想化プラットフォーム。
クラウド環境での使用に適しているためクラウドプロバイダーやデータセンター環境で使用される。
特徴は以下の通り。
- Xenハイパーバイザーベース
- 高可用性とクラスタリング
- コミュニティバージョンあり
- クラウド基盤への対応
KVM
KVM(Kernel-based Virtual Machine)はLinuxカーネルをハイパーバイザーとして動作させるハイパーバイザ型仮想化プラットフォーム。
動作にはIntel VT や AMD-V のようなハードウェア仮想化拡張を持つプロセッサが必要という特徴がある。
またフルバーチャル化とパラバーチャル化の両方の仮想マシンを実行可能。
KVMはLinux、Windows、Haiku、OS Xなど多くのゲストOSにハードウェア支援型の仮想化を提供している。
Xen
XenはLinux FoundationとIntelにより開発されたハードウェア上で直接実行されるタイプの仮想化技術。
XenではゲストOSをパラバーチャル化することができるため、ゲストOSがハードウェアリソースに直接アクセスできる。
そのためパフォーマンスが高い。
1.2.2. ホスト型
VirtualBox
OSSのホスト型の仮想化ソフトウェア。
Windows、Linux、macOSなどのホストOSで動作し、さまざまなゲストOSをサポートする。
以下の機能をサポートしている。
- 仮想ディスクイメージのサポート
- スナップショット機能
- 仮想ネットワーク機能
VMware Player
VMwareが提供するホスト型の仮想化ソフトウェア。
Windows、Linux、macOSなどのホストOSで動作し、さまざまなゲストOSをサポートする。
1.2.3. コンテナ型
Docker
Dockerはアプリケーションコンテナを作成、管理、およびデプロイするためのOSSのプラットフォーム。 DockerではDockerイメージと呼ばれる再利用可能なコンテナテンプレートを使用し、これらのイメージをコンテナとして実行する。
コンテナは非常に軽量で、高速に起動でき、オーバーヘッドが少ないため、開発、テスト、デプロイメントなどに使用できる。 またDockerコンテナはLinuxおよびWindowsベースのホストOSで実行できる。
Dockerはアプリケーションコンテナを中心に設計されている。
LXC
LXC(Linux Containers)はプロセス間の仮想化技術を使用して軽量な仮想環境を提供するOSSプラットフォーム。
LXCコンテナは、ホストOSのリソースを共有し、カーネルを共用するため、他のコンテナに比べて比較的軽量となる。
またLXCはアプリケーションを隔離し、リソースを分割するための環境を提供し、システムレベルの仮想化を実現している。 LXCはOSレベルでの分離に使用される。
1.3. その他の仮想化ツール
1.3.1. コンテナ管理/オーケストレーションツール
Kubernetes
Kubernetes(k8s)はコンテナ化されたアプリケーションのデプロイ、スケーリング、管理、およびオーケストレーションするためのOSSプラットフォーム。
アプリケーションコンテナを効果的に管理するために、クラスタリング、自動スケーリング、セルフヒーリング、サービスディスカバリ、ロードバランシングなどの機能を提供する。
Kubernetesのマニフェストファイル(YAML形式)を使用して、アプリケーションのデプロイと管理を定義する。
Kubernetesは大規模なコンテナオーケストレーション環境/複雑なマイクロサービスアーキテクチャを構築するために使用される。
Podman
Podmanはコンテナを管理するためのCLIツール。
PodmanはシンプルでDockerと互換性があり、コンテナをビルド、実行、管理するためのコマンドを提供している。
Podmanはよりシンプルで個別のコンテナの管理に適している。
1.3.2. クラウド基盤構築ツール
OpenStack
OpenStackはOSSのクラウド基盤を構築するためのツールとプロジェクト。
具体的には各種ハイパーバイザ(KVM/Xen/VMware Serverの無償製品版であるESXi/Hyper-Vなど)と組み合わせ、クラウドサービスの環境を構築することができる。
OpenStackを用いることでプライベートクラウド、パブリッククラウド、ハイブリッドクラウドなどが構築できる。
CloudStack
CloudStackはOSSのクラウド基盤を構築するためのツールとプロジェクト。
シンプルな構成のクラウド環境の構築に適している。
2 - VirtualBox/Vagrant基礎
2.1. VirtualBox
2.1.1. VirtualBoxとは
VirtualBoxはホスト型の仮想化ソフトウェア。 ホスト型ではVMは仮想化ソフトウェア上で仮想化される。
2.1.2. VirtualBoxのネットワーク設定
ネットワーク設定ごとに通信が可能な方向は以下の通り。
種類 | ゲストOS=>ホストOS | ホストOS=>ゲストOS | ゲストOS=>外部 | 外部=>ゲストOS | ゲストOS同士 |
---|---|---|---|---|---|
NAT | ○ | × | ○ | × | × |
ホストオンリーアダプタ | ○ | ○ | ○ | × | × |
内部ネットワーク | ○ | × | ○ | × | ○ |
ブリッジアダプタ | ○ | ○ | ○ | ○ | ○ |
NATネットワーク | ○ | × | ○ | × | ○ |
NAT
ゲストOSがホストOSの外部 (インターネットなど) にアクセスするために利用する。 内部的にはホストOSのルーティングにより接続される。
ホストオンリーアダプタ
ホストオンリーアダプタは、ゲストOS-ホストOS間、ゲストOS間の通信を実現するネットワーク。 内部的にはホストOSの仮想アダプタを開始接続される。
ブリッジアダプタ
ブリッジアダプタではVMがホストPCとは完全に独立しているかのように振舞える。 ホストOSの物理アダプタを経由して接続される。外部アクセス可能。
外部からVMに直接アクセスできる。
NATネットワーク
VirtualBox内に内部ネットワークが形成される。 なおNATネットワークでは使用する前に事前にネットワーク名やサブネット情報を設定する必要がある。
内部ネットワーク
VirtualBoxがスイッチのように機能する。ゲストOS同士のみ接続可能。
2.2. Vagrant
2.2.1. Vagrantとは
Vagrantは仮想マシンの構築設定などをRuby言語で記述し構築できるツール。言い換えると仮想マシンなどを簡単に構築/操作するためのソフトウェア。
VirtualBoxやVMwareを直接操作せずともエージェントで操作可能となっており、記述はvgarantfileに行う。
利用できるイメージはコチラから。
2.2.2. Vagrantの基本コマンド
以下に、Vagrantを使用してVirtualBoxを対象とする基本的なコマンドを以下に示す。
vagrant init <イメージ名> # イメージを基に初期化
vagrant box list # イメージの確認
vagrant box add <イメージ名> # イメージの追加(local)
vagrant box remove <イメージ名> # イメージの削除(local)
vagrant up # イメージのデプロイ(デフォルトでは1イメージあたり1GBメモリ割り当て)
vagrant status # イメージの状態確認
vagrant global-status # イメージの状態確認(どのディレクトリでも使用可能)
vagrant ssh <host名> # 仮想マシン接続
vagrant up <host名> # 仮想マシンの起動/再開
vagrant halt <host名> # 仮想マシンの停止
vagrant destroy <id> # 仮想マシンの削除
3 - Docker基礎
Docker入門
DockerはDocker社が開発しているコンテナ型仮想化技術を実現するためのプラットフォームの1つ。
DockerではホストOSの上に動作しているDocker Engineからコンテナと呼ばれるミドルウェアの環境構築がされた実行環境を作成し、その中でアプリケーションを動作させる。
そのためホスト型やハイパーバイザ型の仮想化よりも圧倒的に軽量に動作する特徴がコンテナ型仮想化技術にはある。
Dockerを使う最大のメリットは以下の通りです。
- ソフトウェアの実行環境が複雑なアーキテクチャであっても、Dockerを使って管理することで簡単にどんなマシン上でも共有できる(誰でも同じ環境が作れる)
- 作成した環境を配布しやすい
- スクラップ&ビルドが容易にできる
Docker(コンテナ型)とハイパーバイザ型の仮想化の違い
Dockerは1度に1つのコンテナしか操作できないため、同時に複数のコンテナを操作したい場合はDocker-Composeを用います。
複数のDockerコンテナを定義し実行するができる特徴があります。
LinuxにおいてはDLや作成したdocker imageはデフォルトでは /var/lib/docker/
配下に保存される。
参考資料
名称 | URL |
---|---|
Dockerイメージ内のコードを直接編集する方法 | https://blog.yfsakai.com/posts/2021-08-16-change-code-in-docker-image-directly/ |
1. Dockerの基本知識
各OSへのDockerのインストール方法や起動方法の説明は割愛します。
1.1. 動作確認コマンド
docker version #インストールされたDockerのバージョンを確認する
docker ps #動作しているコンテナを確認する
docker ps -a #取得済みのイメージを一覧表示する
docker images #ダウンロードしたDockerイメージを一覧表示する
docker rmi イメージID #dockerイメージの削除
1.2. 基本コマンド
Dockerコンテナ作成用コマンド
docker run コンテナ名 #コンテナを起動状態で作成するコマンド
docker create コンテナ名 #コンテナを停止状態で作成するコマンド
その他の基本コマンド
docker search [OPTIONS]
#イメージ名//キーワードからオンライン上のDockerイメージを探す
docker pull [OPTIONS]
#イメージ名:[TAG]//イメージをダウンロードする
docker images [OPTIONS]
#// ダウンロードしたDockerイメージを一覧表示する
docker inspect [OPTIONS]
#イメージID//イメージを確認する
docker rmi [OPTIONS]
#イメージID//イメージを削除する
docker history [OPTIONS]
#イメージID//ヒストリーを確認する
コンテナに関するコマンド
docker run [OPTIONS] イメージ名[:TAG] [ARG]
#コンテナを起動する
docker ps [OPTIONS]
#稼働コンテナを一覧表示
docker stop [OPTIONS] コンテナID
#コンテナを停止する
docker kill [OPTIONS] コンテナID
#コンテナを終了する
docker rm [OPTIONS] コンテナID
#コンテナを削除する
docker restart [OPTIONS] コンテナID
#コンテナを再起動する
その他のコマンド
docker info
#システム情報を表示する
docker help
#ヘルプを表示する
オプション
-d #:バックグラウンドで実行
–name #コンテナ名:コンテナに名前をつける
-v #:ホストとコンテナ間でディレクトリやファイルを共有する
–rm #: コンテナ終了時にコンテナを削除するため、コマンドを試したい時にオススメ
-a #:停止中のコンテナまで含めて表示する
–filter “status=exited” #:停止中のコンテナのみ表示するオプション。
-i #: コンテナの標準入力を開くことができ、コマンドが打てる
-t #: ttyを利用する
#上記2つを合わせて、-itとすることが多い
1.3. 基本操作
Dockerコンテナの起動方法
- Docker-compose.ymlのあるディレクトリ(Dockerコンテナ構成のルートディレクトリ)に移動し以下コマンドを実行
docker-compose build
- 以下コマンドを実行することでdocker projectが生成されバックグラウンドで起動する(オプション等要注意)
# -d オプションをつけることでバックグラウンドで container が稼働するようになります。
# -d をつけないとメインスレッド処理となってしまうため注意しますしょう。
docker-compose up -d
1.4. Docker基本ファイル
1.4.1. Docker-Compose.yml
Docker-Compose.ymlはDocker Projectで作成する container と Host OS の関連付け、 つまりcontainer の初期設定を定義するファイルです。
サンプル
version: '3.3' # Docker-Compose.yml を実行するにあたっての docker build の version 指定
services: # コンテナを定義する親要素
app:
container_name: sample_web_app # コンテナ名の設定
build: ./docker/app # DockerFile の参照先
volumes: # HostOS のディレクトリやファイルとコンテナ内でシンボリックリンクを繋げる
- ./www:/var/www
networks: # ローカルネットワークにおける IP アドレスの指定
web_segment:
ipv4_address: 172.240.0.2
gw:
image: nginx # DockerFile を使用しない場合は Docker-Compose.yml で直接 image を指定できる。
container_name: sample_web_gw
ports: # ポートフォワーディング この例なら HostOS への 10080 ポートアクセスをこのコンテナの 80 番ポートにフォワードする。
- 10080:80
volumes:
- ./www:/var/www
- ./docker/gw/default.conf:/etc/nginx/conf.d/default.conf # conf ファイルの紐付け
depends_on: # 依存関係の定義 この例なら app container が作成されてから構築の意味
- app
networks:
web_segment:
ipv4_address: 172.240.0.3
db:
build:
context: .
dockerfile: docker/mysql/Dockerfile
volumes:
- ./docker/mysql/db:/docker-entrypoint-initdb.d
- db-store:/var/lib/mysql # DB データの永続化。本ファイルの例の場合、末尾の「volumes: db-store:」を使用している。詳しい解説はそこで。
- ./logs:/var/log/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- "33306:3306"
environment: # MySQL の場合初期 DB の作成と root password 及び mysql user account の登録が可能
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: administrator
MYSQL_PASSWORD: password
MYSQL_DATABASE: default_database
TZ: "Asia/Tokyo"
networks:
web_segment:
ipv4_address: 172.240.0.4
networks: # docker 仮想ネットワークの作成
web_segment:
driver: bridge # driver の選択
ipam:
config:
- subnet: 172.240.0.0/24 # subnet mask の指定。 この例なら、この Docker Project に所属する container は 172.240.0.0~254 の範囲を同一ネットワークとして判定可能となる。
volumes: # Docker MySQL のデータは再起動で消えてしまいます。そのため他の container と同じく volume 定義を皆試すと思いますが、Docker の仕様上エラーになります。Docker の「名前付きボリューム」と呼ばれる領域を構築し、データの永続化を行います。
db-store:
1.4.2. DockerFile
Docker FileにはLinux で環境を構築する時と同じようなコマンドをいくつか記述したり、環境変数などの定義が可能なファイルです。 内部の実装は通常のサーバ構築(EC2やLinux)とほぼ同じでような記述を行います。
1.4.3. Docker Image
Docker ImageはDocker container の構築を想定し最適化されたcontainerのtemplateファイルです。
1.5. Dockerの使い方(windows(私の場合)入りLinuxによる使用方法)
- WSL2をONにしてインストールしたUbuntuにコマンドラインで入る
Docker -v
でDocker使用可能か確認- 起動したコマンドラインで使う