Docker

Dockerfileの書き方|自分のアプリをコンテナ化する

Docker Dockerfile コンテナ

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/*

まとめ

  • FROMWORKDIRCOPYRUNCMD が基本の流れ
  • 依存ファイル(requirements.txt等)を先にコピーしてキャッシュを活用
  • slim ベースイメージでサイズを削減
  • .dockerignore で不要ファイルを除外
  • RUN をまとめてレイヤー数を最小化