DockerはコンテナベースでアプリケーションをパッケージングするOSSです。「自分のMacでは動くのに本番では動かない」という開発環境の差異問題を解消し、どの環境でも同一の実行環境を再現できます。本記事ではDocker初心者向けに基礎から実践まで丁寧に解説します。
Dockerとは何か?仮想マシン(VM)との違い
Dockerコンテナは仮想マシンと異なり、ホストOSのカーネルを共有します。そのため起動が高速(秒単位)でオーバーヘッドが少ないのが特徴です。
- 仮想マシン(VM):独立したゲストOSを持つ→重い・起動が遅い
- Dockerコンテナ:OSカーネルを共有→軽量・起動が速い(数秒)
Dockerのインストール
# macOS
brew install --cask docker
# Docker Desktopのアプリを起動する
# Ubuntu
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER # sudoなしで使えるように
# インストール確認
docker --version # Docker version 26.x.x
docker compose version # Docker Compose version v2.x.x
Dockerfile:イメージの作成
# Pythonアプリのマルチステージビルド
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
FROM python:3.12-slim
# セキュリティ:非rootユーザーで実行
RUN useradd -m -u 1001 appuser
WORKDIR /app
COPY --from=builder /root/.local /home/appuser/.local
COPY --chown=appuser:appuser . .
USER appuser
ENV PATH=/home/appuser/.local/bin:$PATH
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Docker Compose:複数コンテナの管理
# docker-compose.yml(Next.js + Node.js API + PostgreSQL + Redis)
version: '3.9'
services:
# フロントエンド
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- API_URL=http://api:8000
depends_on:
- api
# バックエンドAPI
api:
build: ./api
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
- REDIS_URL=redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
# PostgreSQL
db:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
# Redis(キャッシュ・セッション)
cache:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
よく使うDockerコマンド一覧
# イメージのビルド
docker build -t myapp:latest .
# コンテナの起動(バックグラウンド)
docker run -d -p 8000:8000 --name myapp myapp:latest
# コンテナの一覧
docker ps # 起動中
docker ps -a # すべて
# コンテナへのシェル接続
docker exec -it myapp /bin/bash
# ログの確認
docker logs -f myapp
# リソース使用量確認
docker stats
# Docker Compose(開発環境一括起動)
docker compose up -d # バックグラウンドで起動
docker compose logs -f # ログ追跡
docker compose down # 停止・削除
docker compose down -v # ボリュームも削除
本番環境でのDockerベストプラクティス
- マルチステージビルド:イメージサイズを最小化
- 非rootユーザーで実行:セキュリティリスクの低減
- .dockerignoreの活用:node_modules・.gitなどを除外
- ヘルスチェックの設定:コンテナの稼働状況を自動監視
- distrolessイメージの利用:攻撃面を最小化
- シークレットはenv fileや.secretsで管理:docker-compose.ymlにパスワードを書かない
まとめ
DockerとDocker Composeを習得することで、環境構築の時間を大幅に削減し、チーム全員が同一の開発環境で作業できるようになります。まずは既存プロジェクトのDockerfile作成から始めてみましょう。