はじめに
Dockerの真価は「環境をコードで定義できる」点にあります。
その中心にあるのがDockerfileです。
この記事では、Dockerfileの基本構文を理解しつつ、実際にPythonアプリを動かすDockerイメージを構築するハンズオンを通して、コンテナ開発の流れを体感していきます。
1. Dockerfileとは何か
Dockerfileは、Dockerイメージを自動的に作成するための手順書です。
「ベースイメージをどれにするか」「どのコマンドを実行して環境を構築するか」「アプリをどう実行するか」を順番に記述していきます。
たとえば、以下のような手動手順を自動化します。
docker run -it python:3.10 bash
pip install flask
python app.py
これをDockerfileに書くだけで再現可能になるのです。
2. ハンズオン:FlaskアプリをDocker化してみよう
ステップ1:ディレクトリ構成を作成
まずは簡単なFlaskアプリを作るためのディレクトリを用意します。
mkdir dockerfile-hands-on
cd dockerfile-hands-on
以下のような構成を作ります:
dockerfile-hands-on/
├── app.py
├── requirements.txt
└── Dockerfile
ステップ2:Pythonアプリを用意
app.py
に以下の簡単なFlaskアプリを書きます。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Dockerfile World!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
ステップ3:依存ライブラリを定義
requirements.txt
に必要なパッケージを書きます。
flask==2.3.2
ステップ4:Dockerfileを作成
ここがこの記事の主題です。
以下のDockerfileを作成してください。
# ベースイメージ
FROM python:3.10-slim
# 作業ディレクトリを設定
WORKDIR /app
# ファイルをコンテナにコピー
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Flaskアプリを起動
CMD ["python", "app.py"]
ポイント解説
FROM
: Pythonの軽量イメージを指定。WORKDIR
:/app
を作業ディレクトリとして設定。RUN
: pipを実行して依存パッケージをインストール。CMD
: コンテナ起動時にアプリを実行。
3. イメージをビルドする
Dockerfileを作成したら、以下のコマンドでイメージをビルドします。
docker build -t flask-sample:latest .
出力例(抜粋):
=> [2/5] WORKDIR /app
=> [3/5] COPY requirements.txt ./
=> [4/5] RUN pip install --no-cache-dir -r requirements.txt
=> [5/5] COPY . .
=> exporting to image
=> => naming to docker.io/library/flask-sample:latest
これでイメージが作成されました。
4. コンテナを起動して確認
docker run -d -p 8080:8080 flask-sample:latest
ブラウザで以下にアクセスします:
http://localhost:8080
画面に Hello, Dockerfile World!
と表示されれば成功です。
5. 動作確認とイメージの確認
コンテナとイメージの状況を確認してみましょう。
docker ps
docker images
結果例:
CONTAINER ID IMAGE STATUS PORTS
9a12f3b2c1e9 flask-sample:latest Up 1 minute 0.0.0.0:8080->8080/tcp
Dockerfileから生成されたイメージが正しく動作しているのが確認できます。
6. Dockerfile改善のベストプラクティス
(1) .dockerignore
を活用
ビルドに不要なファイルを除外するため、.dockerignore
を追加します。
__pycache__/
.git/
*.log
(2) キャッシュを意識した構成
RUN
や COPY
の順序を最適化することで、キャッシュを最大限に活かせます。
依存関係のファイル (requirements.txt
) を先にコピーしておくのが定番です。
(3) マルチステージビルドへの発展
もしビルド工程が複雑になった場合、以下のようにステージを分けて軽量化できます。
FROM python:3.10-slim AS build
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.10-slim
WORKDIR /app
COPY --from=build /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY . .
CMD ["python", "app.py"]
7. よくあるトラブルシューティング
症状 | 原因 | 対処 |
---|---|---|
COPY failed | ファイルパスの誤り | WORKDIR と相対パスを再確認 |
pip install 失敗 | キャッシュ破損・ネットワーク問題 | --no-cache-dir オプションを利用 |
ポートが開かない | ホストとのマッピングミス | -p 8080:8080 オプションを指定 |
CMDが実行されない | ENTRYPOINTとの併用ミス | CMD のみ使用して挙動を確認 |
8. まとめと次のステップ
この記事では、Dockerfileを使ったイメージ構築の基本からFlaskアプリのコンテナ化までをハンズオン形式で解説しました。
学んだポイント
- Dockerfileはイメージ構築の設計図
- ベースイメージ、RUN、COPY、CMDの理解
- 実際に動作するPythonアプリのコンテナ化
次のステップ
次は以下を試してみましょう:
- マルチステージビルドで軽量化
- DockerfileのLintチェック(hadolintなど)
- CI/CDパイプラインにDockerビルドを組み込み
これであなたもDockerfileを自在に扱える第一歩を踏み出しました。
コメントを残す