Day4:DoDay4:Dockerfile入門(最重要)中盤
テーマ:Dockerfile を“実務レベル”で書けるようになるために、キャッシュ・レイヤー構造・COPY の順番・最適化の考え方を深掘りする
中盤では、前半で学んだ
Dockerfile の基本構造(FROM → WORKDIR → COPY → RUN → CMD)
をさらに実務レベルへ引き上げます。
ここを理解すると、あなたは
「速くビルドできて、壊れにくく、再現性の高い Dockerfile」
を書けるようになります。
Dockerfile の“レイヤー構造”を理解する
Dockerfile は1行ごとにレイヤー(層)が作られる
Dockerfile の各命令(FROM、COPY、RUN など)は
すべて独立したレイヤーとして保存されます。
例:
FROM node:18 ← レイヤー1
WORKDIR /app ← レイヤー2
COPY package.json . ← レイヤー3
RUN npm install ← レイヤー4
COPY . . ← レイヤー5
CMD ["node", "app.js"] ← レイヤー6
Dockerfileレイヤー構造のメリット
- 変更がないレイヤーは再利用される(キャッシュ)
- ビルドが高速になる
- 再現性が高い
この「キャッシュ」が Dockerfile 最適化の核心です。
COPY の順番が“ビルド速度”を決める
初心者がやりがちな悪い例
COPY . .
RUN npm install
Dockerfileこれは 毎回 npm install が走る ため、ビルドが遅くなります。
正しい順番
COPY package.json package-lock.json ./
RUN npm install
COPY . .
Dockerfileなぜこれが速いのか
- package.json が変わらなければ npm install のレイヤーがキャッシュされる
- コード変更(app.js など)だけなら COPY . . のレイヤーだけが更新される
つまり:
依存関係(npm install / pip install)は、できるだけ早い段階でキャッシュさせるのが正解。
Node.js と Python の最適化例
Node.js の最適化 Dockerfile
FROM node:18
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
DockerfilePython の最適化 Dockerfile
FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Dockerfileどちらも
依存関係 → アプリ本体
の順で COPY するのがポイントです。
RUN と CMD の違いを深掘りする
RUN:イメージを作るときに実行
例:npm install、apt-get install
→ ビルド時に1回だけ実行される
CMD:コンテナを起動するときに実行
例:node app.js、python app.py
→ コンテナ起動のたびに実行される
例で理解する
RUN npm install
CMD ["node", "app.js"]
Dockerfile- npm install はイメージ作成時に1回だけ
- node app.js はコンテナ起動のたびに実行
この違いを理解すると、Dockerfile が一気に読みやすくなります。
WORKDIR の重要性を深掘りする
WORKDIR を使うとパスがシンプルになる
WORKDIR を設定しないと:
COPY . /app
RUN cd /app && npm install
CMD ["node", "/app/app.js"]
DockerfileWORKDIR を使うと:
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "app.js"]
Dockerfile圧倒的に読みやすく、ミスも減ります。
実務で必須の .dockerignore
.dockerignore を使うとビルドが速くなる
Dockerfile と同じフォルダに .dockerignore を置くと、
COPY の対象から除外できます。
例:
node_modules
.git
.env
なぜ必要なのか
- 不要なファイルを COPY するとビルドが遅くなる
- node_modules を COPY すると壊れる
- .env を COPY するとセキュリティ事故になる
実務では .dockerignore は必須です。
中盤まとめ
あなたがここまで理解できていれば、中盤はクリアです。
- Dockerfile はレイヤー構造でキャッシュされる
- COPY の順番を工夫するとビルドが高速になる
- RUN(ビルド時)と CMD(起動時)の違いを理解できる
- WORKDIR を使うとパスがシンプルになる
- .dockerignore は実務で必須
