第13章: コンテナ化と仮想化技術
13.1 この章で解説する主要な技術・概念
現代のITインフラ運用では、コンテナ化や仮想化を活用することで、アプリケーションの迅速なデプロイや柔軟なスケーリング、リソースの効率的な利用が可能となります。本章では、AlmaLinux 9上でのコンテナ技術(Docker, Podman, Kubernetesなど)と仮想化技術(KVM, libvirt)の活用をより詳細に掘り下げ、スケーラブルでモダンなインフラを構築・運用するための方法を解説します。
- コンテナ技術の概要 (Docker, Podman)
- Dockerの高度な機能 (ネットワーク設定、Docker Compose、イメージ管理)
- Podmanによるデーモンレスコンテナ運用
- コンテナオーケストレーション (Kubernetes) の概要と学習手順
- 仮想化技術 (KVM, libvirt) の構成とメリット
- 仮想マシン作成 (virt-install, virt-manager) と運用のベストプラクティス
- コンテナ化と仮想化の使い分け
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 (デフォルト)、host、noneなど複数のネットワークモードを提供する。
- bridgeモード: コンテナは独自の名前空間を持ち、
docker0
ブリッジを通じてホストと通信 - hostモード: コンテナがホストのネットワークを直接利用(ポートの競合に注意)
- 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の基本概念
- Cluster: Kubernetesが管理するノード群
- Master / Control Plane: etcd(キー値ストア), API server, Schedulerなど
- Pod: Kubernetesでのアプリケーションの最小単位。1つ以上のコンテナを内包
- Deployment: Podをどのようにレプリカを持って管理・更新するかを定義
- 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 学習のまとめ
- コンテナ技術 (Docker, Podman): OSのカーネルを共有しながらアプリケーションを軽量に隔離し、迅速な起動とスケーラビリティを実現。Docker Composeなどで複数コンテナの一括管理も容易。
- Podman: デーモンレス設計でDocker互換CLIを提供し、よりセキュアでシンプルなアーキテクチャを実現。systemdとの連携もスムーズ。
- Kubernetesの概要: 複数ノードでコンテナをクラスタリングし、スケーリングやセルフヒーリングを自動化。学習にはMinikubeやkindが便利。
- 仮想化技術 (KVM, libvirt): ゲストOSごとに完全隔離された環境を提供し、異なるOSや高いセキュリティ要件に対応。
virt-install
やvirsh
コマンドを活用し、スナップショットやリソース制御が可能。 - コンテナ vs 仮想マシン: コンテナは軽量でアプリケーションデプロイに最適、VMは完全隔離と異種OSサポートに強みがある。用途と要件に合わせて併用を検討。
- ハイブリッド運用: 物理ホスト+仮想マシン+コンテナを組み合わせ、大規模かつ柔軟なインフラを構築。セキュリティ、可用性、運用コストを総合的に考慮して設計することが重要。
次章へのつながり
次の章(第14章)では、運用上避けられないトラブルシューティングと問題解決をより深堀りします。システムログやネットワーク診断、SELinuxやファイルシステムの問題解決手順などを体系的に学び、迅速な対応ができるように備えましょう。