Docker | 2週間で実務レベルに到達するDocker学習:Dockerfile入門(最重要) - Day4

Docker Docker
スポンサーリンク

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"]
Dockerfile

Python の最適化 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"]
Dockerfile

WORKDIR を使うと:

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 は実務で必須
Docker
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました