第2章 Dockerfile入門
更新日:2025年12月27日
この章を音声で聴く
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の構文や推奨事項は変更される可能性があります。最新情報は公式ドキュメントをご確認ください。