Dockerfileの書き方
自分のアプリをコンテナ化する
Dockerfileは、Dockerイメージを作るための設計図です。
この記事では、Dockerfileの基本命令から、効率的なイメージを作るためのベストプラクティスまで解説します。
こんな人向けの記事です
- 自分のアプリをDockerコンテナにしたい
- Dockerfileの各命令の意味を理解したい
- イメージサイズを小さくする方法を知りたい
Step 1Dockerfileの基本構造
Dockerfile
# ベースイメージを指定
FROM python:3.13-slim
# 作業ディレクトリを設定
WORKDIR /app
# 依存ファイルをコピーしてインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリのソースコードをコピー
COPY . .
# ポートを公開
EXPOSE 8000
# コンテナ起動時のコマンド
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Step 2主要な命令一覧
| 命令 | 役割 | 例 |
|---|---|---|
FROM | ベースイメージを指定 | FROM python:3.13-slim |
WORKDIR | 作業ディレクトリを設定 | WORKDIR /app |
COPY | ファイルをイメージにコピー | COPY . . |
RUN | ビルド時にコマンドを実行 | RUN pip install ... |
CMD | コンテナ起動時の実行コマンド | CMD ["python", "app.py"] |
EXPOSE | 使用するポートを宣言 | EXPOSE 8000 |
ENV | 環境変数を設定 | ENV DEBUG=False |
ARG | ビルド時の引数 | ARG VERSION=1.0 |
ENTRYPOINT | 固定の実行コマンド | ENTRYPOINT ["gunicorn"] |
CMD と ENTRYPOINT の違い
CMD → コンテナ起動時のデフォルトコマンド(上書き可能)ENTRYPOINT → 固定のコマンド(CMDは引数として扱われる)ENTRYPOINT ["gunicorn"] + CMD ["app:app"] → gunicorn app:app
Step 3Python アプリの例
Dockerfile
FROM python:3.13-slim
# セキュリティアップデート
RUN apt-get update && apt-get upgrade -y && rm -rf /var/lib/apt/lists/*
WORKDIR /app
# 依存を先にインストール(キャッシュ活用)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 静的ファイルの収集
RUN python manage.py collectstatic --noinput
EXPOSE 8000
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]
Step 4Node.js アプリの例
Dockerfile
FROM node:20-slim
WORKDIR /app
# package.json を先にコピー(キャッシュ活用)
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Step 5ベストプラクティス
1. slim/alpine ベースを使う
Dockerfile
# NG: フルイメージ(約1GB)
FROM python:3.13
# OK: slimイメージ(約150MB)
FROM python:3.13-slim
2. レイヤーキャッシュを活用する
Dockerfile
# NG: ソースコード変更のたびに pip install が走る
COPY . .
RUN pip install -r requirements.txt
# OK: requirements.txt が変わった時だけ pip install
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
3. .dockerignore を使う
.dockerignore
.git
__pycache__
*.pyc
node_modules
.env
.venv
4. RUN を結合して不要ファイルを削除
Dockerfile
# 1つのRUNにまとめてレイヤーを減らす
RUN apt-get update && apt-get install -y --no-install-recommends gcc && pip install --no-cache-dir -r requirements.txt && apt-get purge -y gcc && rm -rf /var/lib/apt/lists/*
まとめ
FROM→WORKDIR→COPY→RUN→CMDが基本の流れ- 依存ファイル(requirements.txt等)を先にコピーしてキャッシュを活用
slimベースイメージでサイズを削減.dockerignoreで不要ファイルを除外RUNをまとめてレイヤー数を最小化