インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

仮想マシンとDockerコンテナの違い・virshとdockerコマンドの使い方【LinuC 101試験対策】

公開
,
LinuC Level 1 第06回 主題1.05 仮想化とコンテナ



LinuCレベル1(101試験)の現行バージョン「Version 10.0」において、近年のクラウドネイティブ環境の普及に伴い大幅に出題強化された最重要テーマが「主題1.01 Linuxのインストールと仮想マシン・コンテナの利用」に含まれる「1.01.2 仮想マシン・コンテナの概念と利用(重要度4)」です。

かつて主流であった物理サーバー単体での運用から、ハードウェアリソースを論理的に分割する「仮想マシン(Hypervisor型)」、そしてLinuxカーネルの機能を利用してアプリケーション単位で軽量にプロセスを隔離する「コンテナ(OSレベル仮想化)」へとインフラ基盤は進化しました。本記事では、両者のアーキテクチャの決定的な差異から、仮想マシン管理ツール virsh、コンテナエンジン docker(および podman)の基本操作コマンド体系までを実機検証を交えて体系的に解説します。

本記事の到達目標

  • ハイパーバイザー型仮想化(Type 1: ベアメタル型 vs Type 2: ホスト型)の仕組みとKVMの特徴を説明できる
  • コンテナ型仮想化の基本概念と、仮想マシンに対する利点(軽量性・高速起動・リソース効率)を比較できる
  • コンテナの隔離を支えるLinuxカーネル要素技術(Namespaces, cgroups, OverlayFS)の役割を理解できる
  • 仮想マシン管理コマンド virsh を用いてVMの一覧表示・起動・停止・詳細情報確認を行える
  • コンテナ管理コマンド docker を用いてイメージ取得・コンテナ起動・状態確認・停止・削除のライフサイクルを操作できる
  • LinuC 101試験の記述式問題(コマ問)で頻出する仮想化・コンテナ関連コマンドやオプションを正確に記述できる

検証環境情報

  • ディストリビューション:AlmaLinux 9.8 (Olive Jaguar)
  • カーネルバージョン:Linux 5.14.0-570.el9.x86_64
  • 仮想化管理ツール:libvirt-client 11.10.0 (virsh)
  • コンテナ管理エンジン:Podman 5.8.2 (Docker互換CLI)
  • 検証ホスト:linuc-node01 (192.168.2.138)
目次
  1. 1. 仮想化技術の分類とアーキテクチャ比較
    1. 1.1 ハイパーバイザー型仮想化(Type 1: ベアメタル型 vs Type 2: ホスト型)
    2. 1.2 Linux標準ハイパーバイザー「KVM」の特徴と仕組み
    3. 1.3 コンテナ型仮想化(OSレベル仮想化)の基本原理
    4. 1.4 仮想マシンとコンテナの性能・リソース消費・起動速度の対比
  2. 2. コンテナを支えるLinuxカーネル要素技術
    1. 2.1 Namespaces(名前空間)によるリソースの独立分離
    2. 2.2 cgroups(コントロールグループ)によるハードウェアリソース制限
    3. 2.3 chrootとオーバーレイファイルシステム(OverlayFS)
  3. 3. KVM仮想マシンの基本操作(virshコマンド)
    1. 3.1 libvirtとvirshコマンドの役割
    2. 3.2 仮想マシンの一覧確認と状態把握(virsh list, dominfo)
    3. 3.3 仮想マシンの起動・停止・強制終了(virsh start, shutdown, destroy)
  4. 4. Dockerコンテナの基本操作とライフサイクル
    1. 4.1 コンテナイメージとコンテナインスタンスの関係
    2. 4.2 イメージの取得と一覧表示(docker pull, docker images)
    3. 4.3 コンテナの起動・実行・一覧確認(docker run, docker ps)
    4. 4.4 コンテナの停止・削除とイメージ削除(docker stop, docker rm, docker rmi)
  5. 5. 実機ハンズオン演習:AlmaLinux 9で仮想化・コンテナコマンドを体験
    1. 5.1 実機検証環境の確認
    2. 5.2 演習1:virsh コマンドによる仮想マシン管理サブコマンドの確認
    3. 5.3 演習2:コンテナのライフサイクル(実行・停止・削除)コマンドの検証
  6. 6. LinuC 101試験対策まとめとコマ問頻出チェック
    1. 6.1 コマ問(記述式)頻出キーワード一覧表
    2. 6.2 Ping-t演習へのブリッジ(対象分野と推奨学習順)
  7. 7. まとめと次回予告

1. 仮想化技術の分類とアーキテクチャ比較

1.1 ハイパーバイザー型仮想化(Type 1: ベアメタル型 vs Type 2: ホスト型)

1台の物理サーバー上で、複数の独立したOS(仮想マシン / ゲストOS)を同時に稼働させる技術を「ハイパーバイザー型仮想化」と呼びます。ハイパーバイザーには、動作階層の違いによって2つのタイプが存在します。

分類 Type 1:ベアメタル型(ネイティブ型) Type 2:ホスト型
構成階層 ハードウェア ➔ ハイパーバイザー ➔ 仮想ハードウェア ➔ ゲストOS ハードウェア ➔ ホストOSハイパーバイザー ➔ ゲストOS
特徴・性能 OSを介さずにハードウェア上で直接ハイパーバイザーが動作するため、オーバーヘッドが極めて小さく高性能 汎用OS上でアプリケーションの1つとして動作するため導入が容易だが、ホストOSを挟むためオーバーヘッドが大きい
代表製品 ・Linux KVM(カーネル組み込み)
・VMware ESXi
・Microsoft Hyper-V
・Xen
・Oracle VM VirtualBox
・VMware Workstation / Fusion
・QEMU(単体エミュレーション)
主な用途 エンタープライズ本番環境、パブリッククラウド基盤 開発用PC環境、学習・検証環境

1.2 Linux標準ハイパーバイザー「KVM」の特徴と仕組み

Linux環境における標準的なハイパーバイザーが「KVM(Kernel-based Virtual Machine)」です。KVMはLinuxカーネルモジュール(kvm.ko, kvm-intel.ko / kvm-amd.ko)として提供され、LinuxカーネルそのものをType 1ハイパーバイザーへと変貌させます。

各仮想マシンは、ホストLinuxから見ると「通常の1つのLinuxプロセス」としてCPUスケジューリングされます。また、仮想デバイス(ディスクやNIC等)のエミュレーションには「QEMU」が連携して利用されます。

1.3 コンテナ型仮想化(OSレベル仮想化)の基本原理

ハイパーバイザー型仮想化がハードウェアを仮想化し、仮想マシンごとに「独立したカーネル(ゲストOS)」を丸ごと起動するのに対し、「コンテナ型仮想化」はホストOSのLinuxカーネルをすべてのコンテナで共有します。

仮想マシンとコンテナのアーキテクチャ比較
図1:ハイパーバイザー型仮想マシンとコンテナ型仮想化のアーキテクチャ対比

1.4 仮想マシンとコンテナの性能・リソース消費・起動速度の対比

LinuC試験では、仮想マシンとコンテナのトレードオフ(長所と短所)に関する比較問題が頻出します。

比較項目 仮想マシン(VM) コンテナ(Container)
ゲストOSの有無 あり(仮想マシンごとに完全なOSが必要) なし(ホストOSのカーネルを共有)
起動速度 数分程度(OS全体のブートプロセスが必要) 1秒未満〜数秒(プロセスの起動とほぼ同等)
リソース消費 大(メモリやディスク容量をギガバイト単位で消費) (必要なライブラリとプロセス分のみ消費)
集約密度 1台の物理サーバーあたり数十台が限界 1台の物理サーバーあたり数百〜数千コンテナ可能
OS種別の柔軟性 ホストと異なるOS(Linux上でWindows等)も稼働可能 ホストと同じLinuxカーネルで動作するバイナリのみ稼働可能
セキュリティ隔離性 ハードウェア仮想化による強固な完全隔離 同一カーネルを共有するため、カーネル脆弱性の影響を受けるリスク

2. コンテナを支えるLinuxカーネル要素技術

コンテナは魔法の技術ではなく、Linuxカーネルが長年培ってきた標準的なリソース隔離・制限機能の組み合わせによって実現されています。

2.1 Namespaces(名前空間)によるリソースの独立分離

「名前空間(Namespaces)」は、特定のプロセス群に対して「システムリソースの見え方」を分離・仮想化するカーネル機能です。コンテナ内部からは、自身がシステム全体の専有環境にいるように見えます。

名前空間の種類 隔離対象のリソース コンテナ内での見え方・効果
PID(プロセスID) プロセスツリー コンテナ内のメインプロセスが PID 1 として見え、ホスト上の他プロセスは見えない
NET(ネットワーク) ネットワークデバイス・IP・ルーティング・ポート コンテナごとに独自のIPアドレスや仮想インターフェース(eth0)が割り当てられる
MNT(マウント) ファイルシステムのマウントツリー コンテナごとに独立したルートファイルシステム(/)が見える
UTS(ホスト名) ホスト名・ドメイン名 コンテナごとに独立したホスト名を設定できる
IPC(プロセス間通信) 共有メモリ、セマフォ、メッセージキュー コンテナ間でIPC通信が混ざることを防ぐ
USER(ユーザーID) ユーザーUID・グループGID コンテナ内の root(UID 0)をホスト側の一般ユーザーにマッピングして安全性を高める

2.2 cgroups(コントロールグループ)によるハードウェアリソース制限

「コントロールグループ(cgroups: Control Groups)」は、プロセスグループごとに物理ハードウェアリソースの使用量を計量・制限・優先順位付けするカーネル機能です。

特定のコンテナが暴走してCPUを100%専有したり、メモリを食いつぶしてホスト全体をダウン(OOM: Out Of Memory)させることを防ぎます。CPU使用率制限(コア数・クォータ)、メモリ使用量上限、ディスクI/O帯域幅、ネットワークパケットの制限などが可能です。

2.3 chrootとオーバーレイファイルシステム(OverlayFS)

プロセスのルートディレクトリを特定のディレクトリ配下に隔離する古典的な「chroot」の概念を進化させ、コンテナでは軽量な多層ファイルシステム(OverlayFSなど)が採用されています。読み取り専用の共通ベースイメージ層の上に、変更分のみを記録する書き込み層(Copy-on-Write)を重ねることで、高速な生成とディスク容量の節約を実現しています。

3. KVM仮想マシンの基本操作(virshコマンド)

3.1 libvirtとvirshコマンドの役割

KVMやXenなどの仮想マシンを統合管理するための標準APIライブラリが「libvirt」です。管理者は、端末から virsh(Virtual Shell)コマンドを実行して仮想マシンの操作を行います。

3.2 仮想マシンの一覧確認と状態把握(virsh list, dominfo)

仮想マシン(ドメイン)の一覧表示やスペック確認を行う主要サブコマンドです。

コマンド書式 機能 主要オプション・説明
virsh list 稼働中(running)の仮想マシンのみを一覧表示 停止中の仮想マシンは表示されない
virsh list --all 停止中を含む全仮想マシンを一覧表示 試験の最頻出オプション
virsh dominfo [ドメイン名/ID] 指定した仮想マシンの詳細情報を表示 CPUコア数、メモリ割り当て量、稼働状態等を確認

3.3 仮想マシンの起動・停止・強制終了(virsh start, shutdown, destroy)

コマンド書式 機能 動作仕様・注意点
virsh start [ドメイン名] 仮想マシンを起動する 電源ONに相当
virsh shutdown [ドメイン名] 仮想マシンを安全に正常停止する ゲストOSへACPIシグナルを送り、OSのシャットダウン処理を実行させる
virsh destroy [ドメイン名] 仮想マシンを即座に強制停止する 「ファイルの破壊(destroy)」ではなく、マシンの電源プラグを引っこ抜く(強制電源OFF)動作
virsh reboot [ドメイン名] 仮想マシンを再起動する ACPI経由での安全な再起動
virsh console [ドメイン名] 仮想マシンのシリアルコンソールに接続する 切断は Ctrl + ]

virsh destroy の語感による誤解に注意

virsh destroy という単語から「仮想マシンファイルが削除される」と誤解しやすいですが、実際には「仮想マシンの強制電源OFF」を実行するコマンドです。ディスクイメージ自体が消去されるわけではありません。試験で頻出の引っかけポイントです。

4. Dockerコンテナの基本操作とライフサイクル

4.1 コンテナイメージとコンテナインスタンスの関係

Docker環境では、「コンテナイメージ(金型・テンプレート)」と「コンテナ(実行実体・インスタンス)」を明確に区別します。1つのイメージから、独立した複数のコンテナインスタンスを瞬時に起動できます。

Docker コンテナのライフサイクルと主要コマンド
図2:Dockerコンテナのライフサイクルフローと対応する管理コマンド

4.2 イメージの取得と一覧表示(docker pull, docker images)

コマンド書式 機能 説明
docker pull [イメージ名]:[タグ] リモートレジストリ(Docker Hub等)からイメージをダウンロード タグを省略した場合はデフォルトで :latest が取得される
例: docker pull nginx:latest
docker images(または docker image ls ローカルホスト上に保存されているイメージ一覧を表示 REPOSITORY, TAG, IMAGE ID, SIZE 等を確認
docker rmi [イメージ名/ID] 不要になったローカルイメージを削除 該当イメージから派生したコンテナが存在する場合は削除できない

4.3 コンテナの起動・実行・一覧確認(docker run, docker ps)

コマンド書式 機能 主要オプション・解説
docker run [オプション] [イメージ名] イメージから新規コンテナを作成し、直ちに起動する -d: バックグラウンド実行(デタッチモード)
--name [名前]: コンテナに識別名を付与
-p [ホスト側]:[コンテナ側]: ポートフォワーディング(例: -p 8080:80
-it: 対話型ターミナルを割り当ててシェルを起動
docker ps(または docker container ls 現在稼働中のコンテナのみを一覧表示 CONTAINER ID, IMAGE, STATUS, PORTS, NAMES 等
docker ps -a 停止中を含む全コンテナを一覧表示 終了ステータス(Exited)を確認する必須オプション
docker exec -it [コンテナ名] /bin/bash 稼働中のコンテナ内で追加のコマンドやシェルを実行 コンテナ内のデバッグ・調査で多用

4.4 コンテナの停止・削除とイメージ削除(docker stop, docker rm, docker rmi)

コマンド書式 機能 動作仕様
docker stop [コンテナID/名前] 稼働中のコンテナに SIGTERM を送信し、安全に停止する プロセス終了後、ステータスが Exited に変化
docker start [コンテナID/名前] 停止している既存コンテナを再起動する 設定やファイル状態を保持したまま再開
docker rm [コンテナID/名前] 停止中のコンテナを破棄(削除)する 稼働中のコンテナは -f を付けない限り削除不可
docker rm -f $(docker ps -aq) すべてのコンテナを一括強制削除 検証環境の初期化テクニック

5. 実機ハンズオン演習:AlmaLinux 9で仮想化・コンテナコマンドを体験

5.1 実機検証環境の確認

AlmaLinux 9環境で、カーネルのcgroups v2および名前空間(Namespaces)のファイル構造、ならびに仮想化パッケージを確認します。

[user01@linuc-node01 ~]$ mount | grep cgroup2
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate...)

[user01@linuc-node01 ~]$ ls -l /proc/$$/ns/
合計 0
lrwxrwxrwx. 1 user01 user01 0  9月  8 07:08 cgroup -> cgroup:[4026531835]
lrwxrwxrwx. 1 user01 user01 0  9月  8 07:08 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 user01 user01 0  9月  8 07:08 mnt -> mnt:[4026531841]
lrwxrwxrwx. 1 user01 user01 0  9月  8 07:08 net -> net:[4026531840]
lrwxrwxrwx. 1 user01 user01 0  9月  8 07:08 pid -> pid:[4026531836]
lrwxrwxrwx. 1 user01 user01 0  9月  8 07:08 user -> user:[4026531837]
lrwxrwxrwx. 1 user01 user01 0  9月  8 07:08 uts -> uts:[4026531838]

各プロセス($$ は現在のシェルPID)が独立した名前空間リンクを保持していることが実機上でも確認できます。

5.2 演習1:virsh コマンドによる仮想マシン管理サブコマンドの確認

virsh コマンドのバージョンと主要オプションを実行し、出力構造を把握します。

[user01@linuc-node01 ~]$ virsh --version
11.10.0

[user01@linuc-node01 ~]$ virsh list --help | head -n 8
  NAME
    list - ドメインのリスト

  SYNOPSIS
    list [--inactive] [--all] [--transient] [--persistent] [--with-snapshot]...

virsh list --all により、稼働中のドメインだけでなく非アクティブ(inactive)な停止中VMも含めて一覧表示できる構文が確認できます。

5.3 演習2:コンテナのライフサイクル(実行・停止・削除)コマンドの検証

Docker互換CLIを提供する podman(または docker)を用いて、コンテナの操作を確認します。

  1. コンテナエンジンバージョンの確認
    [user01@linuc-node01 ~]$ podman --version
    podman version 5.8.2
  2. コンテナ一覧の確認(全件)
    [user01@linuc-node01 ~]$ podman ps -a
    CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

    -a オプションにより、稼働中・停止中問わず全コンテナのテーブルが出力されます。

  3. ローカルイメージ一覧の確認
    [user01@linuc-node01 ~]$ podman images
    REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

6. LinuC 101試験対策まとめとコマ問頻出チェック

6.1 コマ問(記述式)頻出キーワード一覧表

管理対象 コマンド / サブコマンド / 用語 出題の論点・記述ポイント
VM全件一覧 virsh list --all ハイフン2つの --all オプション
VM起動 virsh start [vm名] 起動サブコマンド start
VM正常停止 virsh shutdown [vm名] ACPI経由の安全停止 shutdown
VM強制停止 virsh destroy [vm名] 電源切断を表す destroy(削除ではない)
VM詳細情報 virsh dominfo [vm名] ドメイン情報を表示する dominfo
コンテナ生成起動 docker run イメージからコンテナを作成して実行するコマンド
コンテナ全件表示 docker ps -a 停止中も含める -a オプション
イメージ一覧表示 docker images 複数形の images
コンテナ停止 docker stop プロセスを停止するサブコマンド
コンテナ削除 docker rm コンテナインスタンスを削除するサブコマンド
イメージ削除 docker rmi 末尾に i(image)が付く rmi コマンド
リソース制限機能 cgroups コントロールグループの名称
リソース分離機能 namespaces 名前空間の名称(PID, NET, MNT等)

6.2 Ping-t演習へのブリッジ(対象分野と推奨学習順)

  1. 「主題1.01 Linuxのインストールと仮想マシン・コンテナの利用(1.01.2 仮想マシン・コンテナの概念と利用)」の未出題問題を演習する
  2. Type 1(KVM, ESXi)とType 2(VirtualBox)の分類、およびコンテナとVMの長所・短所を比較する問題を確実に正解できるようにする
  3. virsh のサブコマンド(list --all, start, shutdown, destroy)の役割を整理する
  4. docker コマンドのライフサイクル(run, ps -a, stop, rm, rmi)をPing-tの「コマ問道場」で手入力練習する

確認演習問題 1

KVM仮想マシンを管理する virsh コマンドにおいて、ゲストOSがフリーズして正常なシャットダウンに応答しないため、仮想マシンの電源を直ちに強制切断(強制停止)したい。使用すべき適切なサブコマンド名を記述しなさい。

解答と解説を見る

正解: destroy

解説: 仮想マシンを強制電源OFFにするサブコマンドは destroy です。shutdown はACPIシグナルによる正常停止を試みるため、ゲストOSが応答しない場合は停止できません。また、destroy を実行しても仮想マシンのディスクイメージファイル自体は破棄されません。

確認演習問題 2

Dockerにおいて、ローカルホスト上に保存されているコンテナイメージ nginx:latest を削除したい。実行すべき適切なコマンドを記述しなさい。

解答と解説を見る

正解: docker rmi nginx:latest(または docker image rm nginx:latest

解説: コンテナイメージを削除するコマンドは docker rmi(または docker image rm)です。docker rm は「コンテナインスタンス」を削除するコマンドであり、イメージの削除には使用できません。

7. まとめと次回予告

本記事では、ハイパーバイザー型仮想化(Type 1 vs Type 2)とKVMの構造、コンテナ型仮想化の基本原理とLinuxカーネル機能(Namespaces, cgroups)、仮想マシン管理ツール virsh の主要サブコマンド、およびDockerコンテナのライフサイクル管理コマンドを網羅しました。

仮想化とコンテナは、現代のインフラエンジニアにとって避けては通れない必須教養であり、LinuC Version 10.0における得点源となるキートピックです。

次回は、システムの起動から終了までを司るコア領域「Linuxブートプロセスとsystemdターゲット・プロセス管理【主題1.01 (1.01.3, 1.01.4)】」を取り上げます。UEFI/BIOSからブートローダ(GRUB2)、カーネル初期化(systemd)に至る詳細な起動フェーズ、systemdのターゲット(multi-user.target, graphical.target)、プロセス監視(ps, top)、バックグラウンド実行(nohup, tmux)、およびシグナル送信(kill, pkill)を学習します。

前の記事
次の記事