🚀 はじめに

この記事でわかること

  • Dockerfile(ドッカーファイル)とは? なにが書いてあるの?
  • Dockerイメージの作り方(最小の例→定番の書き方→ミスりやすい点)
  • ベストプラクティス(キャッシュ・レイヤー・.dockerignore・マルチステージ)

こんな人向け

  • 中学生〜大人まで、IT知識がほとんどない
  • Dockerfileって結局なに?」「どうやって書くの?」をやさしく知りたい人

初心者でも安心な理由

  • 料理のレシピにたとえて説明(材料→手順→出来上がり)
  • 最小の動く例から始め、一歩ずつ発展
  • この記事だけで完結(最後に公式ドキュメントへのリンクもまとめ)

✅ 概要解説

Dockerfileとは何か

Dockerイメージ(出来上がりの“お弁当”)を作るための“レシピ” です。
書かれた手順どおりに、材料(ベースOSやランタイム)を用意し、必要なファイルを入れて、コマンドを実行し、最後に実行可能なイメージができます。

Dockerfileとは:レシピ→イメージ→コンテナ
  • イメージ:完成品のお弁当。配ってどこでも同じ味(動作)。
  • コンテナ:お弁当を開いて食べる(実行) イメージ。
  • Dockerfile:お弁当を作るためのレシピ

何のためにあるのか

  • 同じ手順で何度でも再現(本番・テスト・開発で同じ環境)
  • 配布がカンタン(イメージ1つを渡せばOK)
  • 軽量&起動が速い(仮想マシンより軽く感じることが多い)

Dockerfileがないとどうなるのか

  • 手作業の再現がムズい:人によって手順や環境がバラバラ(“再現性のない料理”)。
  • 「動く/動かない」の議論が増える:同じ設定で作れていないのが原因になりがち。
  • 環境依存のトラブル(OSの違い・バージョン違い)で時間を消費。

どんな場面で使えるのか

  • WebアプリやAPIを同じ手順でビルド&配布
  • スクリプトやツールを“どこでも同じ環境”で実行
  • 機械学習の環境を固定してチーム全員で共有
  • 教材・デモを再現可能にして配布

🧪 最小のDockerfileからはじめてみよう

まずは最小の動く例を体験。Pythonで“Hello”を返す超シンプルWebを作ってみます。

ファイル構成

.
├─ app.py
└─ Dockerfile

app.py

from http.server import BaseHTTPRequestHandler, HTTPServer

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Hello from Docker container!")

if __name__ == "__main__":
    HTTPServer(("0.0.0.0", 8080), Handler).serve_forever()

Dockerfile

FROM python:3.12-slim

WORKDIR /app
COPY app.py /app/

EXPOSE 8080
CMD ["python", "app.py"]

ビルド & 実行

# イメージを作る(タグ= hello:latest)
docker build -t hello:latest .

# コンテナを起動(ブラウザで http://localhost:8080 )
docker run --rm -p 8080:8080 hello:latest

補足:EXPOSEは説明用メモ
ポートを“開ける”命令ではありません。「このイメージは 8080 を使いますよ」という宣言です。実際に外へ公開するのは -p 8080:8080(ポートマッピング)。


🧱 よく使う命令(超入門)

  • FROM:ベースになるイメージ(材料)を指定。例:FROM python:3.12-slim
  • WORKDIR:作業ディレクトリ(キッチンの作業台)を指定。
  • COPY / ADD:ファイルをイメージへコピー。初心者は基本 COPY でOK。
  • RUN:ビルド中にコマンド実行(材料の下ごしらえ)。
  • CMD:コンテナ起動時に実行するデフォルトコマンド(お弁当の食べ方)。
  • ENTRYPOINT:絶対にこのプログラムを起動したいとき(食べ方は固定)。
  • ENV / ARG:環境変数とビルド引数。
  • HEALTHCHECK:動作チェックの方法を記述。

CMD と ENTRYPOINT の違い

  • CMD ["python","app.py"]docker run の引数で上書きされやすい
  • ENTRYPOINT ["python","app.py"]固定的docker run 引数は後ろに追加される。

🧹 サイズを小さく、ビルドを速くするコツ(ベストプラクティス)

1) .dockerignore を置く

不要なファイルを“入れない”のが最強のダイエット
.gitnode_modules、ビルド生成物などは イメージに入れない

.dockerignore(例)

.git
__pycache__/
*.log
node_modules/
dist/
build/
.DS_Store
.env

2) 命令の順序でキャッシュを最大活用

Dockerのビルドは “上から順にレイヤー(薄い板)を積む” イメージ。
変わりやすい行ほど下へ、変わりにくい行ほど上へ置くと、再ビルドが速い。

  • 依存関係のインストール(pip install -r requirements.txt など)は先に
  • アプリ本体のソースは後からコピー

Python例(キャッシュ効かせる順)

FROM python:3.12-slim

WORKDIR /app

# 依存関係は先にコピーしてインストール
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# その後にアプリ本体
COPY . /app/

CMD ["python", "app.py"]

3) なるべく軽いベースイメージを使う

  • -slim / -alpine など軽量版を検討
  • 不要なビルドツールは入れない、使い終わったら削除(apt-get clean 等)

4) マルチステージビルドで“作る環境”と“走る環境”を分ける

作るときは道具をたくさん使ってOK。でも出来上がったら道具は捨てて、料理だけを詰める。

Node.js → Nginx で静的配信(例)

# 1st: Build stage
FROM node:22-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build  # dist/ が生成される想定

# 2nd: Runtime stage (軽量)
FROM nginx:alpine
COPY --from=build /app/dist/ /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

5) HEALTHCHECK で“生存確認”

HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD curl -fsS http://localhost:8080/health || exit 1

補足:アプリ側に /health のような軽量なチェック用エンドポイントを用意すると◎


🔍 よくあるつまずきと回避法

  • “ポートが開かない”-p 8080:8080 を付け忘れていないか? アプリは 0.0.0.0 で待ち受けているか?
  • “ファイルが見つからない”WORKDIRCOPYパスがズレていないか?
  • “ビルドが遅い”.dockerignore を見直す/依存インストールを前に置く/ベースを軽量化
  • “サイズが大きい” → マルチステージ/不要ファイル削除/--no-cache-dir などで削る
  • “CMDが効かない”ENTRYPOINT で上書きしていないか確認

💡 小話・豆知識・逸話

  1. レイヤーは“ミルフィーユ”
    Dockerイメージは重ねたレイヤーの集合。上のレイヤーを作り直すとき、下のレイヤーはそのまま再利用(キャッシュ) できるから速い。

  2. クジラの名前は「Moby Dock」
    Dockerのクジラロゴには積み荷(イメージ)をたくさん運ぶ意味合いが。可愛い見た目と裏腹に、再現性と配布の力は強力。

  3. “Works on my machine” 問題の終わり
    私のPCでは動きます」を卒業。Dockerfileのレシピが真実になるので、環境依存で揉めにくくなります。


📚 参考リンク

公式サイト・公式ドキュメント

Wikipedia(背景)


🛠️ 関連テーマ・次に理解すると良いこと


🎯 まとめ

  • Dockerfileは“環境づくりのレシピ”:誰でも同じ手順で同じイメージを作れる。
  • 最小の例→定番→ベストプラクティスの順に学ぶと迷わない。
  • .dockerignore・キャッシュ・マルチステージで“速く・小さく・安全”に。
  • つまずきは定番(ポート/パス/CMD/ENTRYPOINT)—落ち着いてチェック。
  • 次の一歩はCompose・CI/CD・セキュリティで“運用できるDocker”へ。