Docker入門ガイド2026:コンテナを完全理解する
Docker入門ガイド2026:コンテナを完全理解する
Dockerをゼロから学ぶ。コンテナ、イメージ、Dockerfile、Docker Composeを実践例で理解します。
Dockerとは何か、なぜ必要なのか
「自分のPCでは動くのに、本番環境で動かない」——開発者なら一度は経験するこの問題。Dockerはこの問題を根本から解決するためのツールです。
Dockerはコンテナ技術を使ってアプリケーションをパッケージ化します。アプリのコード、ランタイム、ライブラリ、設定ファイルをすべてまとめて「コンテナ」と呼ばれる実行単位にすることで、どんな環境でも同じように動作することを保証します。
2026年現在、DockerはWebアプリ、マイクロサービス、AI/MLパイプラインなど、あらゆる分野で使われています。クラウドネイティブ開発において、Dockerの知識は必須スキルといえます。
コンテナとバーチャルマシンの違い
よく混同されますが、コンテナとVMは全く異なるものです。
| 比較項目 | コンテナ(Docker) | 仮想マシン(VM) |
|---|---|---|
| 起動時間 | 秒以下 | 数十秒〜数分 |
| サイズ | 数MB〜数百MB | 数GB〜 |
| OS | ホストOSのカーネル共有 | 独自OSを持つ |
| 分離性 | プロセスレベル | ハードウェアレベル |
| オーバーヘッド | 非常に少ない | 多い |
コンテナはOSのカーネルを共有するため、VMより軽量で高速です。一方でVMはより強い分離性を提供します。
インストールと初期設定
# macOS: Docker Desktopをインストール
# https://www.docker.com/products/docker-desktop からダウンロード
# インストール確認
docker --version
# Docker version 27.x.x
docker compose version
# Docker Compose version v2.x.x
# Hello Worldで動作確認
docker run hello-world
基本概念:イメージとコンテナ
Dockerを理解するうえで最も重要な概念が「イメージ」と「コンテナ」の違いです。
- イメージ: アプリケーションの「設計図」。読み取り専用のテンプレート
- コンテナ: イメージから作られた「実行中のインスタンス」
料理に例えると、イメージはレシピで、コンテナは実際に作られた料理です。同じレシピ(イメージ)から複数の料理(コンテナ)を作れます。
# イメージの操作
docker pull nginx # Docker Hubからイメージを取得
docker images # ローカルのイメージ一覧
docker rmi nginx # イメージを削除
# コンテナの操作
docker run nginx # イメージからコンテナを起動
docker run -d nginx # バックグラウンドで起動
docker run -d -p 8080:80 nginx # ポートマッピングして起動
docker ps # 実行中コンテナ一覧
docker ps -a # 全コンテナ一覧(停止中も含む)
docker stop <コンテナID> # コンテナを停止
docker rm <コンテナID> # コンテナを削除
Dockerfileを書く
Dockerfileは、自分のアプリのイメージを作るための設計書です。
Node.jsアプリのDockerfile
# ベースイメージを指定(Node.js 22のLTSバージョン)
FROM node:22-alpine
# 作業ディレクトリを設定
WORKDIR /app
# 依存関係ファイルをコピー(キャッシュ最適化のため先にコピー)
COPY package*.json ./
# 依存関係をインストール
RUN npm ci --only=production
# アプリのソースコードをコピー
COPY . .
# アプリがリッスンするポートを宣言(ドキュメント目的)
EXPOSE 3000
# ヘルスチェックの設定
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/health || exit 1
# コンテナ起動時に実行するコマンド
CMD ["node", "server.js"]
Pythonアプリ(FastAPI)のDockerfile
FROM python:3.13-slim
WORKDIR /app
# 依存関係ファイルをコピー
COPY requirements.txt .
# パッケージをインストール
RUN pip install --no-cache-dir -r requirements.txt
# ソースコードをコピー
COPY . .
EXPOSE 8000
# uvicornでFastAPIを起動
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
イメージのビルドと実行
# イメージをビルド(カレントディレクトリのDockerfileを使用)
docker build -t my-app:latest .
# ビルドしたイメージでコンテナを起動
docker run -d -p 3000:3000 --name my-app-container my-app:latest
# コンテナのログを確認
docker logs my-app-container
# コンテナ内でコマンドを実行(デバッグに便利)
docker exec -it my-app-container sh
.dockerignoreファイル
.gitignoreと同様に、Dockerビルドに含めないファイルを指定します。
# .dockerignore
node_modules
.git
.gitignore
*.md
*.log
.env
.env.local
dist
coverage
__pycache__
*.pyc
.pytest_cache
Docker Composeでマルチコンテナを管理する
実際のアプリはWebサーバー、データベース、キャッシュなど複数のサービスが連携します。Docker Composeを使うと、これらを一括管理できます。
docker-compose.yml の例(フルスタックアプリ)
version: '3.9'
services:
# フロントエンド(Next.js)
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NEXT_PUBLIC_API_URL=http://localhost:8000
depends_on:
- backend
volumes:
- ./frontend:/app
- /app/node_modules
# バックエンド(FastAPI)
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
- ./backend:/app
# PostgreSQLデータベース
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 10s
timeout: 5s
retries: 5
# Redisキャッシュ
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
# 永続化ボリューム
volumes:
postgres_data:
redis_data:
Docker Composeの基本コマンド
# 全サービスを起動(バックグラウンド)
docker compose up -d
# 起動中のサービスを確認
docker compose ps
# ログを確認
docker compose logs -f # 全サービス
docker compose logs -f backend # 特定のサービス
# 全サービスを停止
docker compose down
# ボリュームも含めて完全削除
docker compose down -v
# 特定のサービスを再起動
docker compose restart backend
# コンテナ内でコマンドを実行
docker compose exec backend bash
本番環境向けのベストプラクティス
マルチステージビルドでイメージを軽量化
# ステージ1: ビルド環境
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# ステージ2: 本番環境(必要なものだけ含める)
FROM node:22-alpine AS production
WORKDIR /app
# ビルド成果物だけコピー
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package.json .
# rootユーザーを避ける(セキュリティベストプラクティス)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
EXPOSE 3000
CMD ["node", "dist/server.js"]
よく使うDockerコマンドチートシート
# イメージ
docker pull <image> # イメージをダウンロード
docker build -t <name> . # Dockerfileからビルド
docker push <image> # レジストリにプッシュ
docker tag <img> <new-name> # イメージにタグをつける
# コンテナ
docker run -d -p <host>:<container> <image> # 起動
docker stop <id/name> # 停止
docker start <id/name> # 開始
docker restart <id/name> # 再起動
docker rm <id/name> # 削除
docker exec -it <id> sh # シェルに入る
# 情報確認
docker ps -a # 全コンテナ一覧
docker inspect <id> # コンテナ詳細情報
docker stats # リソース使用状況
docker logs -f <id> # リアルタイムログ
# クリーンアップ
docker system prune -a # 未使用リソースをすべて削除
docker volume prune # 未使用ボリュームを削除
まとめ
Dockerを習得することで、以下が実現できます:
- 環境の一貫性: 「自分のPCでは動く」問題が解消
- スムーズなデプロイ: コンテナをそのまま本番環境に持っていける
- チーム開発の効率化: 全員が同じ環境で開発できる
- マイクロサービス対応: 複数のサービスを独立して管理
最初は概念が難しく感じるかもしれませんが、実際に手を動かしてコンテナを起動してみることが一番の近道です。まずは既存のアプリをDockerコンテナ化してみましょう。