Dockerコンテナの仕組み - 仮想マシンとの違い

12分 で読める | 2025.12.10

コンテナとは

コンテナは、アプリケーションとその実行に必要な依存関係をパッケージ化した軽量な実行環境です。ホストOSのカーネルを共有しながら、プロセスを分離して実行します。

コンテナのメリット: 軽量・高速起動・環境の一貫性・リソース効率の良さ

仮想マシンとの違い

仮想マシン(VM)

  • ハイパーバイザー上でゲストOSを完全に仮想化
  • 各VMが独自のカーネルを持つ
  • 起動に数分かかる
  • GB単位のリソースを消費

コンテナ

  • ホストOSのカーネルを共有
  • プロセスレベルの分離
  • 秒単位で起動
  • MB単位のリソース消費

Linuxカーネルの技術

Dockerコンテナは、Linuxカーネルの2つの主要な機能を活用しています:

1. 名前空間(Namespaces)

プロセスが見える範囲を分離する機能です:

  • PID名前空間: プロセスIDを分離
  • Network名前空間: ネットワークスタックを分離
  • Mount名前空間: ファイルシステムを分離
  • UTS名前空間: ホスト名を分離
  • User名前空間: ユーザーIDを分離

2. cgroups(Control Groups)

プロセスが使用できるリソースを制限する機能です:

  • CPU使用率の制限
  • メモリ使用量の制限
  • ディスクI/Oの制限
  • ネットワーク帯域の制限
# コンテナのリソース制限例
docker run -d \
  --cpus="1.5" \
  --memory="512m" \
  nginx

Dockerイメージの構造

Dockerイメージは、読み取り専用のレイヤーで構成されています:

  1. ベースイメージ: OS(ubuntu, alpineなど)
  2. 依存関係: ライブラリやランタイム
  3. アプリケーション: 実行するコード

レイヤーの利点: 共通のレイヤーは複数のイメージで共有され、ストレージ効率が向上します。

現場で役立つ実践Tips

本番環境でのベストプラクティス

  1. マルチステージビルドを活用する

実際のプロジェクトでは、ビルド環境と実行環境を分離することで、最終イメージサイズを大幅に削減できます。

# ビルドステージ
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# 実行ステージ(最小限のイメージ)
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node
CMD ["node", "server.js"]
  1. ヘルスチェックを必ず設定する

オーケストレーション環境では、コンテナの健全性を監視するためのヘルスチェックが重要です。

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1
  1. 非rootユーザーで実行する

セキュリティ上、rootユーザーでコンテナを実行することは避けるべきです。

RUN addgroup -g 1001 -S appgroup && adduser -u 1001 -S appuser -G appgroup
USER appuser

よくある落とし穴

  • イメージサイズの肥大化: alpineベースイメージを使い、不要なファイルを.dockerignoreで除外する
  • キャッシュの無効化: COPY命令の順序を工夫し、変更頻度の低いファイルを先にコピーする
  • 環境変数のハードコード: 機密情報は--env-fileやシークレット管理ツールを使用する

関連記事

Dockerをより深く理解するために、以下の記事も参考にしてください:

まとめ

Dockerコンテナは、Linuxの名前空間とcgroupsを活用して、軽量かつ高速な分離環境を提供します。仮想マシンと比較して大幅にオーバーヘッドが少なく、現代のマイクロサービスアーキテクチャに最適です。

本番環境では、マルチステージビルド、ヘルスチェック、非rootユーザー実行などのベストプラクティスを適用することで、セキュアで効率的なコンテナ運用が可能になります。

← 一覧に戻る