Dockerfile入門:ハンズオンで学ぶイメージ構築の基本

はじめに

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) キャッシュを意識した構成

RUNCOPY の順序を最適化することで、キャッシュを最大限に活かせます。
依存関係のファイル (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アプリのコンテナ化

次のステップ

次は以下を試してみましょう:

  1. マルチステージビルドで軽量化
  2. DockerfileのLintチェック(hadolintなど)
  3. CI/CDパイプラインにDockerビルドを組み込み

これであなたもDockerfileを自在に扱える第一歩を踏み出しました。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です