🚀 はじめに
この記事でわかること
- Dockerfile(ドッカーファイル)とは? なにが書いてあるの?
- Dockerイメージの作り方(最小の例→定番の書き方→ミスりやすい点)
- ベストプラクティス(キャッシュ・レイヤー・
.dockerignore・マルチステージ)
こんな人向け
- 中学生〜大人まで、IT知識がほとんどない人
- 「Dockerfileって結局なに?」「どうやって書くの?」をやさしく知りたい人
初心者でも安心な理由
- 料理のレシピにたとえて説明(材料→手順→出来上がり)
- 最小の動く例から始め、一歩ずつ発展
- この記事だけで完結(最後に公式ドキュメントへのリンクもまとめ)
✅ 概要解説
Dockerfileとは何か
Dockerイメージ(出来上がりの“お弁当”)を作るための“レシピ” です。
書かれた手順どおりに、材料(ベースOSやランタイム)を用意し、必要なファイルを入れて、コマンドを実行し、最後に実行可能なイメージができます。

- イメージ:完成品のお弁当。配ってどこでも同じ味(動作)。
- コンテナ:お弁当を開いて食べる(実行) イメージ。
- 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-slimWORKDIR:作業ディレクトリ(キッチンの作業台)を指定。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 を置く
不要なファイルを“入れない”のが最強のダイエット。
.gitやnode_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で待ち受けているか? - “ファイルが見つからない” →
WORKDIRとCOPYのパスがズレていないか? - “ビルドが遅い” →
.dockerignoreを見直す/依存インストールを前に置く/ベースを軽量化 - “サイズが大きい” → マルチステージ/不要ファイル削除/
--no-cache-dirなどで削る - “CMDが効かない” →
ENTRYPOINTで上書きしていないか確認
💡 小話・豆知識・逸話
レイヤーは“ミルフィーユ”
Dockerイメージは重ねたレイヤーの集合。上のレイヤーを作り直すとき、下のレイヤーはそのまま再利用(キャッシュ) できるから速い。クジラの名前は「Moby Dock」
Dockerのクジラロゴには積み荷(イメージ)をたくさん運ぶ意味合いが。可愛い見た目と裏腹に、再現性と配布の力は強力。“Works on my machine” 問題の終わり
「私のPCでは動きます」を卒業。Dockerfileのレシピが真実になるので、環境依存で揉めにくくなります。
📚 参考リンク
公式サイト・公式ドキュメント
- Docker(公式トップ): https://www.docker.com/
- Dockerfile リファレンス: https://docs.docker.com/reference/dockerfile/
- ベストプラクティス(Dockerfiles): https://docs.docker.com/guides/docker-concepts/building-images/dockerfile-best-practices/
.dockerignore仕様: https://docs.docker.com/build/building/context/#dockerignore-files- マルチステージビルド: https://docs.docker.com/build/building/multi-stage/
- BuildKit(高速ビルド): https://docs.docker.com/build/buildkit/
Wikipedia(背景)
- Docker(ソフトウェア): https://ja.wikipedia.org/wiki/Docker
🛠️ 関連テーマ・次に理解すると良いこと
- コンテナ基本用語:イメージ/コンテナ/レジストリ(Docker Hub, GHCR)

【初心者向け】コンテナの基本用語をやさしく解説|イメージ/コンテナ/レジストリ入門
- Compose 入門:複数コンテナ(Web+DB)を
docker composeで一緒に起動
【初心者向け】Docker Composeをやさしく解説|複数コンテナを一発起動する入門
- CI/CD と連携:GitHub Actions 等で自動ビルド&自動配布

【初心者向け】CI/CD(自動デプロイ)をやさしく解説|仕組み・メリット・イメージがつかめる入門ガイド
- セキュリティ:脆弱性スキャン(
docker scout等)/最小権限ユーザーで実行 - 監視・ロギング:
HEALTHCHECK、プロメテウス/ Grafana 連携の基礎
🎯 まとめ
- Dockerfileは“環境づくりのレシピ”:誰でも同じ手順で同じイメージを作れる。
- 最小の例→定番→ベストプラクティスの順に学ぶと迷わない。
- .dockerignore・キャッシュ・マルチステージで“速く・小さく・安全”に。
- つまずきは定番(ポート/パス/CMD/ENTRYPOINT)—落ち着いてチェック。
- 次の一歩はCompose・CI/CD・セキュリティで“運用できるDocker”へ。
