AlmaLinux 9 総合ガイド 第13章

第13章: コンテナ化と仮想化技術


13.1 はじめに:コンテナと仮想化がもたらすメリット

現代のサーバー運用では、「コンテナ」と「仮想化」が基盤技術として広く採用されています。AlmaLinux9 のような RHEL クローン環境でも、これらを組み合わせることで以下のような大きなメリットが得られます。

  • 効率的なリソース利用
    コンテナはカーネルを共有しつつプロセス単位で隔離するため、仮想マシンに比べてオーバーヘッドが小さく、多数のインスタンスを同時に実行できます。
  • 高速なデプロイとスケール
    コンテナは数百ミリ秒で起動でき、アプリケーションのスケールアウト/インを瞬時に行えるため、動的な負荷変動に強くなります。
  • 完全なOS隔離
    仮想マシン(KVM+libvirt)はホスト OS から完全に独立したカーネル空間を持ち、他のゲストやホストからの干渉を物理レベルで防ぎます。
  • 異種環境の共存
    仮想マシンでは Linux/Windows/BSD など異なる OS を同一ホストで同時に動かせるため、レガシーシステムも含めたワークロードを一元管理できます。
💡 補足:AlmaLinux9 は RHEL9 と完全バイナリ互換を保ちつつ、コミュニティ主導での迅速なアップデートと無償提供を実現しています。公式リポジトリには Podman、Docker、KVM、libvirt といったコンテナ・仮想化パッケージが整備されています。

以下では、まず両者の概要とアーキテクチャ、次に具体的な比較ポイントを詳しく見ていきます。

13.1.1 コンテナ技術の概要と主要コンポーネント

コンテナは OS カーネルの機能(namespace/cgroups/overlayfs)を組み合わせ、ユーザー空間ごとにプロセスを分離・制御する仕組みです。

  • namespace
    プロセスツリー、ネットワーク、PID、マウントポイントなどを独立させ、他のコンテナやホストから見えないようにする。
  • cgroups
    CPU/メモリ/IO などのリソース使用量を制限・保証し、ホスト全体の負荷を安定させる。
  • overlayfs
    複数のレイヤーを重ね合わせるファイルシステム。イメージの変更分だけをレイヤー化し、高速かつ効率的にコピーオンライトを実現。
  • コンテナエンジン
    Docker 或いは Podman が代表的。OCI(Open Container Initiative)規格に準拠し、イメージの取得・実行・管理を担う。

13.1.2 仮想化技術の概要と主要コンポーネント

仮想化はハイパーバイザーを介してゲスト OS 全体をエミュレートし、ホスト OS とは別のカーネル空間で動作させる技術です。

  • ハイパーバイザー (KVM)
    Linux カーネルモジュールとして動作し、Intel VT-x/AMD-V を活用してCPU命令を仮想化。
  • QEMU
    ユーザースペースでデバイスエミュレーションを行い、仮想ディスクやネットワークを提供。
  • libvirt
    仮想マシンのライフサイクル管理ツールキット。XML 定義と CLI/API を通じて一元的に操作可能。
  • ストレージプール
    QCOW2、RAW、LVM、iSCSI など多様なバックエンドをサポートし、スナップショットやコピーオンライトを活用できる。

13.1.3 コンテナ vs 仮想マシン 比較ポイント

項目 コンテナ 仮想マシン
オーバーヘッド 非常に低い (カーネル共有) 高い (フル仮想化/エミュレーション)
起動時間 数百ミリ秒 数秒~数十秒
OS 多様性 ホストと同一カーネル 異種 OS 混在可能
セキュリティ境界 namespace+SELinux/AppArmor ハイパーバイザー隔離
スナップショット イメージレイヤー単位 VM 全体 (ディスク・メモリ状態)
管理ツール Docker CLI/Podman, Kubernetes virsh, virt-manager, oVirt
スクロールできます

続いて、環境準備としてコンテナエンジンと仮想化支援機能の有無を簡易にチェックするスクリプト例を示します。


# CPU の仮想化支援機能を確認                              # vmx (Intel) または svm (AMD) がカーネルに存在するか
egrep -c '(vmx|svm)' /proc/cpuinfo                          

# Podman がインストール済みか確認                          # バージョン表示で動作確認
podman --version                                            

# Docker がインストール済みか確認                          # Docker CLI のバージョンを確認
docker --version                                            
注意:非特権ユーザーが 1024 番未満のポートでバインドするには特別な権限設定が必要です。テスト環境では root もしくは podman rootless の設定を確認してください。

13.2 AlmaLinux9でのコンテナ基礎

この節では、AlmaLinux9 上でコンテナを動作させるための基礎技術と、主要ツールである Podman/Docker の導入から基本操作、さらにセキュリティ制御までを公式ドキュメントに基づいて徹底解説します。

13.2.1 Linuxカーネルによる隔離メカニズム

コンテナは、Linux カーネルの名前空間(namespace)、制御グループ(cgroups)、およびファイルシステム重ね合わせ(overlayfs)を組み合わせることで実現される軽量な仮想環境です。AlmaLinux9 ではこれらの機能がデフォルトで有効化されています。

  • namespace:プロセス、ネットワーク、PID、ユーザー、マウントポイントなどを分離し、他のコンテナやホストから見えない独立空間を提供
  • cgroups:CPU・メモリ・ディスクI/Oなどのリソース使用を制限・保証し、ホスト全体の安定を維持
  • overlayfs:複数のファイルシステムレイヤーをコピーオンライトで重ね合わせ、イメージの差分のみを保持して効率的に管理

13.2.2 OverlayFSとコンテナストレージドライバ

この操作は root または sudo 権限で実行してください。予め /overlay/lower/overlay/upper 以下に任意のファイルを配置できる状態で行い、merged ディレクトリに内容がマージ表示されることを確認します。


mkdir -p /overlay/{lower,upper,work,merged}                       # OverlayFS 用のディレクトリ構造を一括作成
mount -t overlay overlay                                        \
  -o lowerdir=/overlay/lower,upperdir=/overlay/upper,workdir=/overlay/work  \
  /overlay/merged                                                # lower と upper を merged にマウント
ls /overlay/merged                                               # merged 配下のファイルを一覧表示し、マージ結果を検証

13.2.3 Podmanのインストールと基本操作

この操作は root または sudo 権限で実行してください。ネットワーク接続が必要です。インストール後は Alpine イメージを使った実行テストで動作を確認します。


dnf makecache                                                   # リポジトリキャッシュを更新して最新パッケージ情報を取得
dnf install -y podman fuse-overlayfs                             # Podman と rootless 時に必要な fuse-overlayfs を同時導入
podman --version                                                # Podman のバージョンを表示し、正しく導入されたことを確認
podman pull docker.io/library/alpine:latest                     # Alpine イメージをリモートから取得して接続を検証
podman run --rm alpine sh -c "echo Hello Podman on AlmaLinux9"  # コンテナ起動テストで標準出力を確認

13.2.4 rootlessモードの確認

この操作は一般ユーザーで実行可能です。root 権限なしでコンテナを起動し、ネットワークやポートバインドが適切に動作するかを確認します。


podman run --rm alpine sh -c "id"                                # 非特権ユーザーのUID/GIDでコンテナを実行
podman network ls                                              # rootless モードで作成されたネットワークを一覧表示
podman run --rm -p 8080:80 alpine sh -c "echo Port binding OK" # 高番ポートでのバインドをテスト

13.2.5 Docker CEの導入(必要時)

この操作は root または sudo 権限で実行してください。AlmaLinux9 の標準リポジトリには含まれないため、外部リポジトリから Docker CE を導入します。


dnf install -y dnf-plugins-core                                # 外部リポジトリ追加用プラグインを導入
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo  # Docker CE リポジトリを追加
dnf makecache                                                  # リポジトリキャッシュを更新
dnf install -y docker-ce docker-ce-cli containerd.io           # Docker 本体・CLI・containerd をインストール
systemctl enable --now docker                                   # Docker デーモンを起動し、ブート時自動起動を設定
docker run --rm hello-world                                     # Hello World コンテナで動作を検証

13.2.6 SELinux対応のボリュームマウント

この操作は SELinux が Enforcing モードで動作している環境で、一般ユーザーまたは sudo 権限で実行してください。ホストのディレクトリをコンテナと共有する際に必要なラベル付与を行います。


mkdir -p /opt/shared-data                                        # 共有ディレクトリを作成
chcon -Rt container_file_t /opt/shared-data                      # SELinux コンテキストをコンテナ用に変更
podman run --rm -v /opt/shared-data:/data:Z alpine ls -la /data  # :Z オプションで自動ラベル付与し、中身を確認

13.2.7 コンテナライフサイクル管理の基本コマンド

この操作は一般ユーザーで実行可能です。Podman または Docker を用いて、コンテナの起動・停止・ログ参照・削除などの基本操作を習得します。


podman run -d --name mynginx -p 8080:80 nginx:stable                  # nginx コンテナをバックグラウンド起動し、ポート 8080 をホストに公開
podman ps                                                         # 実行中のコンテナ一覧を表示
podman logs mynginx                                               # mynginx のログ(アクセスログなど)を出力
podman exec -it mynginx sh                                        # mynginx 内に対話型シェルで接続
podman stop mynginx                                               # コンテナを優雅にシャットダウン
podman rm mynginx                                                 # 停止済みコンテナを削除

13.3 Dockerの高度な機能

この節では、AlmaLinux9 環境で Docker を本番運用レベルで活用するための高度機能を網羅します。具体的には「ネットワーク設定」「Docker Compose による複数コンテナ管理」「イメージ管理とベストプラクティス」の3つのテーマについて、公式ドキュメントを踏まえて詳説します。

13.3.1 ネットワーク設定

この操作は root または sudo 権限で実行してください。Docker デーモンが起動中であること、Docker CLI が利用可能なことを前提とします。カスタム bridge ネットワークを作成し、コンテナを接続できるかを確認します。


docker network create --driver bridge my_bridge                    # bridge ドライバーで my_bridge ネットワークを作成
docker run -d --name nginx_bridge --network my_bridge nginx      # my_bridge 上で nginx コンテナをデタッチモードで起動
docker network inspect my_bridge                                  # my_bridge ネットワークの詳細設定を確認

13.3.2 Docker Composeによる複数コンテナ管理

この操作は root または sudo 権限で実行してください。Docker Compose プラグインをインストールし、サンプルの docker-compose.yml を使って複数サービスを一括起動・管理します。


dnf install -y docker-compose-plugin                             # Docker Compose プラグインをインストール
docker compose version                                            # docker compose コマンドの利用可否とバージョンを確認

以下は Web(nginx)/API(Node.js)/DB(MariaDB) を同一ネットワーク上で動かす docker-compose.yml の例です。プロジェクトルートに保存後、Compose による起動をテストします。


version: '3.8'                            # Compose ファイルのフォーマットバージョンを指定
services:                                 # 複数サービスの定義開始
  web:                                    # nginx サービス定義
    image: nginx:1.25-alpine              # 軽量な Alpine ベースの nginx イメージを指定
    ports:                                # ホストとコンテナ間のポートマッピング
      - '8080:80'                         # ホスト 8080 番をコンテナ 80 番に転送
    volumes:                              # ディレクトリマウント設定
      - ./html:/usr/share/nginx/html:Z    # SELinux コンテキストを自動調整してマウント
    networks:                             # ネットワーク指定
      - app_net                           # app_net ネットワークを利用

  api:                                    # Node.js API サービス定義
    build:                                # Dockerfile からビルド
      context: ./api                      # api ディレクトリをビルドコンテキストに指定
    ports:                                # ポートマッピング設定
      - '3000:3000'                       # ホスト 3000 番をコンテナ 3000 番に転送
    depends_on:                           # 起動順序の依存関係
      - db                                # db サービスの起動後に実行
    networks:                             # ネットワーク指定
      - app_net                           # app_net ネットワークを利用

  db:                                     # MariaDB サービス定義
    image: mariadb:10.11                  # 安定版 MariaDB イメージを指定
    environment:                          # 環境変数設定
      MYSQL_ROOT_PASSWORD: secret         # root ユーザーのパスワードを設定
    volumes:                              # データ永続化用ボリューム
      - db_data:/var/lib/mysql            # db_data ボリュームをマウント
    networks:                             # ネットワーク指定
      - app_net                           # app_net ネットワークを利用

volumes:                                  # 永続化ボリューム定義
  db_data:                                # db_data ボリュームを作成

networks:                                 # ネットワーク定義
  app_net:                                # app_net ネットワークを定義
    driver: bridge                        # bridge ドライバーを利用

Compose 操作の基本:

  • docker compose up -d ですべてのサービスをデタッチモードで起動
  • docker compose down で停止および関連ネットワーク・ボリュームを削除
  • docker compose up -d --scale api=3 で api サービスを 3 インスタンスに水平スケール

13.3.3 イメージ管理とベストプラクティス

この操作はプロジェクトルートで実行します。以下はマルチステージビルドを使って、ビルドツールを含めずに最終イメージを小型化する Dockerfile の例です。ビルド後にサイズと動作を検証します。


# ビルドステージとして Node.js イメージを指定                           # ビルド用に Node.js 環境を用意
FROM node:18-alpine AS builder                                      

WORKDIR /app                                                        # 作業ディレクトリを /app に設定
COPY package*.json ./                                               # 依存情報のみ先にコピーしてキャッシュ活用
RUN npm ci                                                         # 本番依存のみをインストール

COPY . .                                                            # 残りのソースをすべてコピー
RUN npm run build                                                  # アプリをビルドし成果物を作成

# 本番ステージとして軽量な nginx イメージを指定                        # ビルド成果物を配信するランタイム用
FROM nginx:1.25-alpine                                             

COPY --from=builder /app/dist /usr/share/nginx/html               # ビルド成果物を nginx の公開ディレクトリに配置
EXPOSE 80                                                          # コンテナのポート 80 を公開
CMD ["nginx", "-g", "daemon off;"]                                # フォアグラウンドで nginx を起動

イメージのスキャンと更新:


docker scan your-repo/your-image:latest                             # Docker Scan で脆弱性チェックを実施

スキャン結果を踏まえてベースイメージを定期的に更新し、脆弱性のない安全なイメージを維持しましょう。

13.4 Podman入門と実践

Podman はデーモンレスで OCI 準拠のコンテナエンジンであり、Red Hat エコシステムに最適化されています。本節では、AlmaLinux9 上でのインストールから基本操作、rootless モード、systemd 連携までを公式ドキュメントに基づき徹底解説します。

13.4.1 インストールと基本操作

以下の手順は root または sudo 権限で実行してください。ネットワーク接続が必要です。インストール後に Podman のバージョン確認とシンプルなコンテナ実行テストを行います。


dnf makecache                                             # リポジトリキャッシュを更新して最新パッケージ情報を取得  
dnf install -y podman fuse-overlayfs                       # Podman と rootless モードで必要な fuse-overlayfs を一括導入  
podman --version                                          # Podman のバージョンを表示し、正しく導入されたことを確認  
podman info                                               # ストレージドライバーやネットワーク設定など詳細な情報を出力  
podman pull docker.io/library/alpine:latest               # 軽量な Alpine Linux イメージを取得し、リモートレジストリ接続を検証  
podman run --rm alpine sh -c "echo Hello Podman on AlmaLinux9"  # コンテナ内でメッセージを表示し、実行動作を検証  

13.4.2 ルートレスモードの活用

rootless モードでは非特権ユーザーでもコンテナを実行可能です。以下はユーザー名前空間の設定状況確認と、実際の rootless 実行テストです。


grep "^$USER:" /etc/subuid                                   # ユーザーに割り当てられたサブ UID 範囲を表示  
grep "^$USER:" /etc/subgid                                   # ユーザーに割り当てられたサブ GID 範囲を表示  
podman run --rm alpine sh -c "id"                            # 非特権ユーザーのUID/GIDでコンテナを実行  
podman network ls                                           # rootless 環境で自動生成されるネットワークを一覧表示  
podman run --rm -p 8080:80 alpine sh -c "echo Port Binding OK"  # 高番ポートでのバインドをテスト  
注意:rootless モードでは 1024 番未満のポートをバインドできません。必要に応じて高番ポートを使用してください。

13.4.3 systemd連携によるサービス化

Podman コンテナを systemd ユニットとして管理すると、自動起動や再起動ポリシー設定が容易になります。以下では Nginx コンテナを例にユニットファイルを生成し、サービスとして登録・起動する手順を示します。


podman run -d --name myapp -p 8080:80 nginx                    # Detached で Nginx コンテナを起動し、ポート 8080 を公開  
podman generate systemd --name myapp --files --new            # myapp 用の systemd ユニットファイルを新規生成  
sudo mv container-myapp.service /etc/systemd/system/           # 生成されたユニットを systemd 管理ディレクトリへ移動  
sudo systemctl enable --now container-myapp.service           # ブート時自動起動および即時起動を有効化  
systemctl status container-myapp.service                      # サービスのステータスを表示し、正常起動を確認  
💡 補足:–new オプションは既存ユニットを上書きします。再生成前にバックアップを取得することを推奨します。

13.5 Kubernetesによるオーケストレーション

Kubernetes(K8s)はコンテナを大規模に管理・オーケストレーションするオープンソースプラットフォームです。宣言的なリソース管理、自己修復、自動スケーリングなどの機能により、マイクロサービスアーキテクチャやクラウドネイティブ開発を強力に支援します。

13.5.1 Kubernetesの基本概念

Kubernetes を理解するために不可欠な主要オブジェクトを整理します。

  • Cluster
    API サーバーで制御されるマスターと複数のワーカーノードからなるクラスター全体
  • Node
    Pod を実行する物理または仮想マシン。各ノード上で kubelet が稼働します。
  • Pod
    1つ以上のコンテナをまとめた最小単位。共有ネットワークとストレージを持ちます。
  • Deployment
    Pod のレプリカ数やローリングアップデートを管理する宣言的オブジェクト
  • Service
    Pod 群への安定したアクセス手段を提供し、ClusterIP/NodePort/LoadBalancer タイプがあります。
  • Namespace
    リソースを論理的に分割し、マルチテナントや RBAC の範囲を制御します。

13.5.2 Minikube / kind でのローカル環境構築

以下の手順は root または sudo 権限で実行してください。ネットワーク接続と KVM 仮想化機能(Intel VT-x/AMD-V)が必要です。


sudo dnf install -y kubectl                                         # Kubernetes CLI をインストール  
sudo dnf install -y @virtualization qemu-kvm libvirt libvirt-daemon libvirt-daemon-kvm  # KVM ドライバーと libvirt を導入  
sudo systemctl enable --now libvirtd                                 # libvirtd を有効化し、起動  
sudo usermod -aG libvirt "$USER"                                     # 非 root ユーザーを libvirt グループに追加  
newgrp libvirt                                                       # グループ変更を反映  

# Minikube のインストール  
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64  # 最新バイナリをダウンロード  
chmod +x minikube-linux-amd64                                        # 実行権限を付与  
sudo mv minikube-linux-amd64 /usr/local/bin/minikube                # パスへ配置  
minikube start --driver=kvm2 --nodes=1 --memory=2048 --cpus=2        # kvm2 ドライバーでクラスター起動  
kubectl config current-context                                       # コンテキストを確認  

# kind のインストール  
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64  # kind バイナリをダウンロード  
chmod +x ./kind                                                      # 実行権限を付与  
sudo mv ./kind /usr/local/bin/kind                                   # パスへ配置  
kind create cluster --name alma-cluster                              # 一ノードクラスターを作成  
kubectl get nodes                                                   # ノード一覧を確認  

13.5.3 本番運用のポイント

本番環境ではスケーラビリティ、セキュリティ、可観測性を重視し、以下のコンポーネントを選定/設定します。

  • CNI プラグイン:Calico、Flannel、Weave Net などから NetworkPolicy の要件に合わせて選択
  • StorageClass:動的プロビジョニングには CSI(例:Rook Ceph)、ローカル永続では no-provisioner を利用
  • Helm:チャート管理で一貫性あるデプロイを実現し、OCI レジストリや ChartMuseum を併用
  • RBAC:最小権限の原則で Role/RoleBinding を構成し、アクセス制御を厳格化

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash  # Helm 3 をインストール  
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx            # Ingress-NGINX チャートリポジトリを追加  
helm repo update                                                               # リポジトリ情報を更新  
helm install nginx-ingress ingress-nginx/ingress-nginx                         # Ingress コントローラをデプロイ  

apiVersion: storage.k8s.io/v1           # StorageClass API のバージョン  
kind: StorageClass                      # リソース種別を StorageClass に設定  
metadata:                               # メタデータ定義の開始  
  name: fast-storage                    # StorageClass 名を設定  
provisioner: rook-ceph.rbd.csi          # Rook Ceph CSI プロビジョナーを指定  
reclaimPolicy: Delete                   # PV 解放時に削除するポリシー  
volumeBindingMode: WaitForFirstConsumer # Pod スケジューリング後にバインド  

apiVersion: networking.k8s.io/v1       # NetworkPolicy API のバージョン  
kind: NetworkPolicy                    # リソース種別を NetworkPolicy に設定  
metadata:                              # メタデータ開始  
  name: deny-all                      # ポリシー名を deny-all に設定  
  namespace: default                  # default ネームスペースに適用  
spec:                                  # 仕様定義開始  
  podSelector: {}                     # すべての Pod を対象  
  policyTypes:                        # 適用タイプを指定  
    - Ingress                         # インバウンド制御  
    - Egress                          # アウトバウンド制御  

apiVersion: rbac.authorization.k8s.io/v1  # RBAC API のバージョン  
kind: RoleBinding                         # リソース種別を RoleBinding に設定  
metadata:                                 # メタデータ開始  
  name: read-pods                         # RoleBinding 名を設定  
  namespace: default                      # default ネームスペースに適用  
subjects:                                 # 対象を定義  
  - kind: User                            # ユーザーにバインド  
    name: alice@example.com               # ユーザー名を指定  
    apiGroup: rbac.authorization.k8s.io  
roleRef:                                  # 参照する Role を指定  
  kind: Role                              # Role を参照  
  name: pod-reader                        # Role 名を指定  
  apiGroup: rbac.authorization.k8s.io  

13.6 KVM+libvirtによる仮想化

この節では、AlmaLinux9 上でフル仮想化を実現する KVM(Kernel-based Virtual Machine)と libvirt を使った環境構築から運用までを、公式ドキュメントに基づいて詳述します。CPU の仮想化支援機能(Intel VT-x/AMD-V)を活用し、高性能・高可用な仮想マシン管理を行いましょう。

13.6.1 KVM と libvirt の仕組み

KVM は Linux カーネルに組み込まれたハイパーバイザーで、Intel VT-x/AMD-V によるハードウェア仮想化拡張を使ってゲスト OS をほぼネイティブに動作させます。libvirt は QEMU/KVM をはじめとする複数ハイパーバイザーを統一的に管理するツールキットで、XML 定義ファイルと CLI/API から仮想マシンのライフサイクルを制御します。

  • ハイパーバイザー層
    kvm.ko モジュールが CPU の仮想化命令を処理、QEMU がユーザースペースでデバイスをエミュレート
  • 管理層
    libvirtd デーモンが QEMU プロセスを起動・停止し、virsh/API からの操作を仲介
  • ネットワーク
    bridge/NAT/macvtap などの仮想ネットワークを libvirt ネットワークとして管理
  • ストレージ
    QCOW2/RAW/LVM/iSCSI など多様なストレージプールをサポートし、スナップショットやコピーオンライトを実現

13.6.2 virt-install による仮想マシン作成

この操作は root または sudo 権限で実行してください。以下は AlmaLinux9.3 ISO を使い、2 vCPU・4 GB メモリ・20 GB ディスクの仮想マシンを作成する例です。


sudo dnf install -y @virtualization                         # KVM, QEMU, libvirt 等を含む仮想化グループを一括導入  
sudo systemctl enable --now libvirtd                         # libvirt デーモンをシステム起動時に有効化&起動  
sudo virsh net-start default                                 # デフォルト NAT ネットワークを起動(inactive 時)  
curl -LO https://repo.almalinux.org/almalinux/9/isos/x86_64/AlmaLinux-9.3-x86_64-dvd.iso  # AlmaLinux9.3 ISO をダウンロード  
sudo virt-install \                                          # virt-install による VM 定義開始  
  --name alma9-vm \                                         # 仮想マシン名を alma9-vm に設定  
  --memory 4096 \                                           # ゲストに割り当てるメモリを 4096 MB に指定  
  --vcpus 2 \                                               # 仮想 CPU を 2 コア割り当て  
  --disk path=/var/lib/libvirt/images/alma9-vm.qcow2,size=20 \  # QCOW2 形式で 20 GB ディスクを作成  
  --os-variant rhel9.0 \                                    # 最適化された OS バリアントを指定  
  --network network=default,model=virtio \                  # default ネットワークを virtio モデルで接続  
  --graphics spice \                                        # SPICE コンソールを利用  
  --cdrom AlmaLinux-9.3-x86_64-dvd.iso                      # ISO を CD-ROM ドライブにマウント  
💡 補足:–os-variant オプションを設定すると、virt-install が CPU フラグやドライバー最適化を自動選択します。最新のバリアント名は osinfo-query os で確認できます。

13.6.3 仮想マシン管理とスナップショット運用

virsh コマンドを活用し、起動・停止・情報確認・スナップショット作成・ロールバックなど、日々の運用を効率化します。


sudo virsh start alma9-vm                                   # alma9-vm を起動  
sudo virsh dominfo alma9-vm                                 # ゲストのメモリ・CPU・状態を表示  
sudo virsh snapshot-create-as \                              # ライブスナップショットを作成  
  --domain alma9-vm \  
  --name pre-update \                                       # スナップショット名を指定  
  --description "アップデート前スナップショット" \         # 説明を付与  
  --atomic                                                 # 原子操作でディスクを更新  
sudo virsh snapshot-list alma9-vm                           # 作成済みスナップショットの一覧を表示  
sudo virsh snapshot-revert alma9-vm pre-update              # pre-update 時点にロールバック  
sudo virsh shutdown alma9-vm                                # ゲストに ACPI シャットダウン信号を送信  
sudo virsh destroy alma9-vm                                 # 強制電源断(シャットダウン失敗時)  
注意:ライブスナップショットは QCOW2 ストレージでのみサポートされます。RAW や LVM バックエンドを使う場合は事前に互換性を確認してください。

13.7 コンテナと仮想マシンの使い分け戦略

コンテナと仮想マシン(VM)は、それぞれ得意とするユースケースが異なります。運用の目的やワークロードの特性に応じて両者を適切に使い分けることで、可用性・セキュリティ・コスト効率を最大化できます。本節では、各技術の強みを踏まえた適用シーンと、ハイブリッド運用のベストプラクティスを詳しく解説します。

13.7.1 コンテナのメリットと適用シーン

コンテナはホストカーネルを共有しつつユーザー空間を分離するため、軽量かつ高速な起動と高密度配置が可能です。以下のようなケースで特に効果を発揮します。

  • マイクロサービスアーキテクチャ:サービス単位で独立してスケール・デプロイでき、CI/CD の自動化と相性が抜群です。
  • ステートレスアプリケーション:セッション情報を外部ストレージに置く構成で、コンテナ自体は一時的に立ち上げ/破棄しても問題ありません。
  • バースト型ワークロード:短時間だけ大量にインスタンスを起動し、負荷低減後に即時破棄する処理に最適です。
  • 開発・テスト環境:環境差異を排除したイメージを使うことで、開発からステージング、本番まで同一の動作を保証できます。
  • イミュータブルインフラ:「変更は新しいコンテナでデプロイ」というアプローチにより、構成の一貫性とロールバックの簡便性を実現します。

13.7.2 仮想マシンのメリットと適用シーン

VM はホスト OS と完全に分離されたカーネル空間を持ち、異種 OS の混在や厳格なリソース保証が必要なワークロードに強みがあります。

  • レガシーシステムの移行:既存のモノリシックアプリケーションや特定カーネルに依存するソフトウェアをそのまま動作させたい場合に最適です。
  • 高い隔離要件:PCI-DSS や HIPAA などのコンプライアンスで「物理的に分離された環境」が求められるケース。
  • 異種 OS の併存:Windows や異なる Linux ディストリビューションを同一ハードウェアで並行稼働させたい場合。
  • 固定リソース保証:CPU、メモリ、ストレージ I/O の使用量を明示的に割り当て、パフォーマンスのばらつきを防ぎたいミッションクリティカルなサービス。
  • スナップショットとライブマイグレーション:ディスクとメモリの状態を丸ごと保存・移行できるため、ダウンタイムを最小化した保守作業が可能です。

13.7.3 ハイブリッド運用のベストプラクティス

コンテナと VM の利点を組み合わせることで、柔軟かつ堅牢なインフラを構築できます。以下のポイントを押さえましょう。

  • 分離レイヤー設計:フロントエンドや API サービスはコンテナで展開し、データベースやレガシーシステムは VM で運用することで、それぞれに最適な隔離と拡張性を確保します。
  • 多層防御アーキテクチャ:コンテナには SELinux enforcing 下での実行を徹底し、VM にはハイパーバイザー隔離を組み合わせることで、セキュリティ境界を多重化します。
  • 一元的なリソース管理:Kubernetes でコンテナをスケジューリングし、libvirt/virsh で VM のリソース割り当てを行うことで、ホスト全体のリソース使用状況を可視化・最適化します。
  • 構成管理と自動化:Ansible や Terraform を使ってコンテナクラスターと VM インスタンスをコード化し、再現性と自動復旧を実現します。
  • モニタリング統合:Prometheus/Grafana でコンテナおよび VM のメトリクスを統合収集し、アラートとダッシュボードでシステム全体の健全性を監視します。

以下のスクリプトは、ホストの仮想化支援機能を確認し、コンテナと VM の基本的な動作をテストします。一般ユーザー権限および root 権限が必要なコマンドを組み合わせています。


egrep -c '(vmx|svm)' /proc/cpuinfo           # CPU に Intel VT-x / AMD-V の仮想化拡張があるか確認  
podman run --rm alpine sh -c "echo コンテナ環境正常に動作"  # 非特権ユーザーでコンテナ実行テスト  
sudo virsh list --all                        # root 権限で既存の仮想マシン一覧を表示  

上記の戦略と運用例を参考に、AlmaLinux9 環境でコンテナと仮想マシンを最適に使い分け、安定性・拡張性・セキュリティを両立したインフラ基盤を実現してください。

13.8 まとめと次章への展望

本章では、AlmaLinux9 上でのコンテナ技術と仮想化技術を総合的に学びました。以下の要点を押さえたうえで、実運用に活かしてください。

  • 13.2 コンテナ基礎:Linux カーネルの namespacecgroups/OverlayFS による軽量隔離の仕組みと、Podman/Docker の導入・基本操作を学習しました。
  • 13.3 Docker の高度機能:カスタムネットワーク、Docker Compose、マルチステージビルド、イメージスキャンなど、本番運用に不可欠な機能を詳述しました。
  • 13.4 Podman 入門と実践:デーモンレス&rootless モード、systemd 連携によるサービス化を通じ、Red Hat エコシステムでの最適なコンテナ運用を習得しました。
  • 13.5 Kubernetes オーケストレーション:基本オブジェクトの理解、Minikube/kind によるローカル構築、本番向け CNI/StorageClass/Helm/RBAC 設計を解説しました。
  • 13.6 KVM+libvirt 仮想化:KVM ハイパーバイザーと libvirt を用いたフル仮想化環境の構築、virt-install、virsh による運用とスナップショット管理を網羅しました。
  • 13.7 使い分け戦略:コンテナの高速軽量性と VM の完全隔離性を目的別に使い分け、Kubernetes/libvirt とモニタリング・IaC を組み合わせたハイブリッド運用のベストプラクティスを提示しました。

これらを踏まえ、AlmaLinux9 環境ではマイクロサービスからレガシーアプリケーションまで、幅広いワークロードに対して最適な基盤を構築できます。