第2章 Dockerfile入門

更新日:2025年12月27日

本章では、Dockerfileの作成方法について解説する。Dockerfileの基本構文、主要命令(FROM、RUN、COPY、CMD)の使い方、Python環境の構築方法、およびDockerfileのベストプラクティスを習得することを目的とする。
🎧

この章を音声で聴く

再生速度:

1. Dockerfileの基礎

1.1 Dockerfileとは

Dockerfileは、Dockerイメージを自動的にビルドするための設計図である。テキストファイルとして記述され、一連の命令によってイメージの構成を定義する。

Dockerfileを使用することで、環境構築の手順をコードとして管理でき、再現可能なビルドプロセスを実現できる。これはInfrastructure as Code(IaC)の実践でもある。

1.2 基本構文

Dockerfileの基本的な構造を以下に示す。

# コメント:シャープ記号で始まる行
FROM python:3.11-slim

# 作業ディレクトリの設定
WORKDIR /app

# ファイルのコピー
COPY . .

# パッケージのインストール
RUN pip install --no-cache-dir -r requirements.txt

# コンテナ起動時のコマンド
CMD ["python", "app.py"]

2. 主要命令

2.1 FROM

FROM命令は、ベースイメージを指定する。すべてのDockerfileはFROM命令から始まる必要がある。

# 公式Pythonイメージ(slim版)を使用
FROM python:3.11-slim

# 特定のバージョンを固定
FROM python:3.11.7-slim-bookworm

# 軽量版(Alpine Linux)
FROM python:3.11-alpine

Table 1. Pythonイメージのバリエーション

タグ ベースOS サイズ 用途
python:3.11 Debian 約900MB 開発環境、フル機能
python:3.11-slim Debian(最小) 約150MB 本番環境推奨
python:3.11-alpine Alpine Linux 約50MB 軽量化重視

2.2 RUN

RUN命令は、イメージビルド時にコマンドを実行する。各RUN命令は新しいレイヤーを作成する。

# シェル形式
RUN apt-get update && apt-get install -y curl

# exec形式(推奨)
RUN ["pip", "install", "--no-cache-dir", "flask"]

# 複数コマンドを1つのRUNにまとめる(レイヤー削減)
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        curl \
        git && \
    rm -rf /var/lib/apt/lists/*

2.3 COPY / ADD

COPY命令は、ホストからコンテナにファイルをコピーする。ADDはURL取得やtar展開機能を持つが、シンプルなコピーにはCOPYを推奨。

# 単一ファイルのコピー
COPY requirements.txt .

# ディレクトリ全体のコピー
COPY src/ /app/src/

# 複数ファイルのコピー
COPY package.json package-lock.json ./

2.4 CMD / ENTRYPOINT

CMDはコンテナ起動時のデフォルトコマンドを指定する。ENTRYPOINTは必ず実行されるコマンドを指定する。

# CMD:デフォルトコマンド(上書き可能)
CMD ["python", "app.py"]

# ENTRYPOINT:固定コマンド
ENTRYPOINT ["python"]
CMD ["app.py"]  # 引数として渡される
ポイント
CMDはdocker run時に上書き可能。ENTRYPOINTと組み合わせると、ENTRYPOINTが実行ファイル、CMDがデフォルト引数として機能する。

3. Python環境構築

3.1 基本的なPython環境

典型的なPythonアプリケーション用Dockerfileを以下に示す。

FROM python:3.11-slim

# 環境変数の設定
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# 作業ディレクトリ
WORKDIR /app

# 依存関係のインストール(キャッシュ効率化)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションコードのコピー
COPY . .

# ポートの公開(ドキュメント用)
EXPOSE 8000

# 起動コマンド
CMD ["python", "app.py"]

3.2 requirements.txt

Pythonの依存関係はrequirements.txtで管理する。

flask==3.0.0
requests==2.31.0
python-dotenv==1.0.0
langchain==0.1.0
playwright==1.40.0

実践ステップ

Step 1:プロジェクトディレクトリにDockerfileを作成

Step 2:docker build -t my-python-app .でビルド

Step 3:docker run -p 8000:8000 my-python-appで起動

Step 4:ブラウザでhttp://localhost:8000にアクセス

4. ベストプラクティス

Dockerfileを効率的に作成するためのベストプラクティスを以下に示す。

Table 2. Dockerfileベストプラクティス

項目 推奨事項 理由
ベースイメージ slim版を使用 イメージサイズ削減
レイヤー数 RUN命令をまとめる レイヤー数削減、キャッシュ効率
キャッシュ活用 変更頻度の低いファイルを先にCOPY ビルド時間短縮
不要ファイル .dockerignoreを活用 ビルドコンテキスト削減
セキュリティ 非rootユーザーで実行 権限昇格リスク軽減

.dockerignore の例:

.git
__pycache__
*.pyc
.env
.venv
node_modules
*.log
参考・免責事項
本章は2025年12月時点の情報に基づいています。Dockerfileの構文や推奨事項は変更される可能性があります。最新情報は公式ドキュメントをご確認ください。