AlmaLinux 9 総合ガイド 第13章

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


13.1 この章で解説する主要な技術・概念

現代のITインフラ運用では、コンテナ化仮想化を活用することで、アプリケーションの迅速なデプロイや柔軟なスケーリング、リソースの効率的な利用が可能となります。本章では、AlmaLinux 9上でのコンテナ技術(Docker, Podman, Kubernetesなど)と仮想化技術(KVM, libvirt)の活用をより詳細に掘り下げ、スケーラブルでモダンなインフラを構築・運用するための方法を解説します。

  1. コンテナ技術の概要 (Docker, Podman)
  2. Dockerの高度な機能 (ネットワーク設定、Docker Compose、イメージ管理)
  3. Podmanによるデーモンレスコンテナ運用
  4. コンテナオーケストレーション (Kubernetes) の概要と学習手順
  5. 仮想化技術 (KVM, libvirt) の構成とメリット
  6. 仮想マシン作成 (virt-install, virt-manager) と運用のベストプラクティス
  7. コンテナ化と仮想化の使い分け

13.2 コンテナ技術の概要

13.2.1 コンテナと従来の仮想マシンの違い

  • コンテナ: ホストOSのカーネルを共有し、アプリケーション実行に必要なユーザー空間だけを隔離してパッケージ化。OSごとのオーバーヘッドが少なく、軽量で起動が速い。
  • 仮想マシン: ハイパーバイザー上でゲストOSをまるごと動かす。隔離性は高いが、OSブートやリソース消費のオーバーヘッドが大きい。

13.2.2 DockerとPodman

  • Docker: デーモン型コンテナランタイム。Docker CLI がデーモン(dockerd)と通信してコンテナを起動・停止する。
  • Podman: Red Hat系で推奨されるデーモンレスなコンテナエンジン。Dockerとコマンド互換が高く、ルートレスモード(一般ユーザーでもコンテナ起動が可能)をサポート。

注: Podmanはセキュリティ面やシンプルなアーキテクチャが特徴で、サーバー環境ではDockerからPodmanに移行する事例も増えている。


13.3 Dockerの高度な機能

13.3.1 ネットワーク設定

Dockerはbridge (デフォルト)、hostnoneなど複数のネットワークモードを提供する。

  1. bridgeモード: コンテナは独自の名前空間を持ち、docker0ブリッジを通じてホストと通信
  2. hostモード: コンテナがホストのネットワークを直接利用(ポートの競合に注意)
  3. macvlan: コンテナが独立したMACアドレスを持ち、物理ネットワークに直接参加
# 独自ブリッジネットワークの作成例
docker network create --driver bridge mybridge
docker run -d --name web --network mybridge nginx

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

Docker Compose
YAMLファイルにサービス定義(コンテナイメージ、ボリューム、ネットワークなど)を記述し、一括で起動・停止・スケールが可能。

version: '3'
services:
  db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - dbdata:/var/lib/mysql
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
volumes:
  dbdata:
docker compose up -d
docker compose ps
docker compose down
  • アプリ構成(DB + Webなど)をコード化して可搬性を向上

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

  • Dockerfileを使い、ベースイメージから必要パッケージやアプリをインストールしてイメージをビルド
  • レイヤーキャッシュを意識し、変更頻度の高い部分を後ろに書くとビルドが高速化
  • マルチステージビルドを利用し、最終イメージを軽量化する(ビルド環境レイヤを排除)

例: マルチステージビルド

# Build stage
FROM golang:1.18 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# Final stage
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
ENTRYPOINT ["myapp"]

13.4 Podmanによるデーモンレスコンテナ運用

13.4.1 Podmanのインストール

sudo dnf install podman
  • podman --version でバージョン確認
  • ほぼDockerと同じCLIサブコマンドが利用可能

13.4.2 ルートレスモード

  • 一般ユーザーがpodman runでコンテナを起動可能
  • ホストのルート権限が必要ないため、セキュリティリスク低減
  • ~/.config/containers/~/.local/share/containers/ にデータを保存
podman run -it --name myctr alpine /bin/sh

13.4.3 systemdとPodman

Podmanはsystemdサービスユニットとしてコンテナを管理できる。podman generate systemd コマンドでユニットファイルを自動生成し、サービスの起動・再起動をsystemdに任せることが可能。

podman run -d --name web -p 8080:80 nginx
podman generate systemd --name web --files --new
# => web.service が生成される
sudo mv container-web.service /etc/systemd/system/
sudo systemctl enable container-web
sudo systemctl start container-web

13.5 コンテナオーケストレーション (Kubernetes) の概要

13.5.1 Kubernetesの基本概念

  1. Cluster: Kubernetesが管理するノード群
  2. Master / Control Plane: etcd(キー値ストア), API server, Schedulerなど
  3. Pod: Kubernetesでのアプリケーションの最小単位。1つ以上のコンテナを内包
  4. Deployment: Podをどのようにレプリカを持って管理・更新するかを定義
  5. Service: Podへのアクセスを抽象化(ロードバランシングやサービスディスカバリ)

13.5.2 Minikubeやkindでの学習

  • Minikube: シングルノードKubernetesをローカルPCで簡単に立ち上げられる
  • kind (Kubernetes in Docker): Dockerコンテナ上でKubernetesクラスターをエミュレート
# minikubeの例
minikube start
kubectl get nodes
  • Kubernetes本番運用では複数ノード+ネットワーク設定が必要となるため、まずはローカルで理解を深めるのがおすすめ

13.5.3 実運用でのポイント

  • CNI (Container Network Interface): Pod間通信や外部アクセスを制御
  • StorageClass: ボリューム管理や動的プロビジョニング
  • Helm: アプリケーション(チャート)をパッケージ化して簡単デプロイ
  • セキュリティ: RBAC(Role-Based Access Control)で権限管理、Pod Security Policiesなど

13.6 仮想化技術 (KVM, libvirt)

13.6.1 KVMとlibvirtの仕組み

  • KVM (Kernel-based Virtual Machine): Linuxカーネルに含まれるハイパーバイザー機能。ハードウェア支援(Intel VT-x, AMD-V)を活用して高速仮想化を実現
  • libvirt: 仮想化管理API。KVMだけでなくXenやLXCなど複数のハイパーバイザーを統一的に扱う

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

sudo dnf install qemu-kvm libvirt virt-install bridge-utils virt-manager
sudo systemctl enable libvirtd
sudo systemctl start libvirtd

sudo virt-install \
  --name myvm \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/myvm.qcow2,size=20 \
  --cdrom /path/to/AlmaLinux-9.iso \
  --network default \
  --os-type linux \
  --os-variant alma9
  • これでAlmaLinuxなどのISOイメージを使った仮想マシンをインストール
  • virt-manager (GUI) を使うと、グラフィカルにディスクやネットワークを設定可能

13.6.3 マシン管理とスナップショット

sudo virsh list --all
sudo virsh start myvm
sudo virsh shutdown myvm
sudo virsh snapshot-create-as myvm snap1 "My first snapshot"
  • virshコマンドでスナップショットや保存・復元ができる
  • 本番環境でもテスト前にスナップショットを取っておくと、失敗時にすぐに戻せる

13.7 コンテナ化と仮想化の使い分け

13.7.1 コンテナのメリット

  • 軽量で起動が速く、リソース消費が少ない
  • DevOpsやマイクロサービスアーキテクチャでの迅速なリリースとスケーリング
  • ローカル開発環境と本番環境の差異を少なくできる

13.7.2 仮想マシンのメリット

  • OSごとに完全に隔離された環境を提供
  • ホストカーネルの影響を受けにくく、異なるOSを同居できる(Windows on Linuxなど)
  • 大規模企業でのセキュリティ要件やゲストOS単位のHA構成を組みやすい

13.7.3 ハイブリッド運用

  • 物理ホストでKVMを動かし、複数のゲストOS上でDockerやPodmanを動かす構成
  • KVMでホスト自体をクラスター化し、VM単位でロードバランスやフェイルオーバーする
  • コンテナの中でマイクロサービスを構築し、低オーバーヘッドなデプロイを実現

13.8 学習のまとめ

  1. コンテナ技術 (Docker, Podman): OSのカーネルを共有しながらアプリケーションを軽量に隔離し、迅速な起動とスケーラビリティを実現。Docker Composeなどで複数コンテナの一括管理も容易。
  2. Podman: デーモンレス設計でDocker互換CLIを提供し、よりセキュアでシンプルなアーキテクチャを実現。systemdとの連携もスムーズ。
  3. Kubernetesの概要: 複数ノードでコンテナをクラスタリングし、スケーリングやセルフヒーリングを自動化。学習にはMinikubeやkindが便利。
  4. 仮想化技術 (KVM, libvirt): ゲストOSごとに完全隔離された環境を提供し、異なるOSや高いセキュリティ要件に対応。virt-installvirshコマンドを活用し、スナップショットやリソース制御が可能。
  5. コンテナ vs 仮想マシン: コンテナは軽量でアプリケーションデプロイに最適、VMは完全隔離と異種OSサポートに強みがある。用途と要件に合わせて併用を検討。
  6. ハイブリッド運用: 物理ホスト+仮想マシン+コンテナを組み合わせ、大規模かつ柔軟なインフラを構築。セキュリティ、可用性、運用コストを総合的に考慮して設計することが重要。

次章へのつながり

次の章(第14章)では、運用上避けられないトラブルシューティングと問題解決をより深堀りします。システムログやネットワーク診断、SELinuxやファイルシステムの問題解決手順などを体系的に学び、迅速な対応ができるように備えましょう。