Day4:DockerfilDay4:Dockerfile入門(最重要)後半
テーマ:本番運用を意識した“壊れにくく・軽量で・安全な Dockerfile”を作れるようになる
後半では、前半・中盤で学んだ
Dockerfile の基本構造・キャッシュ・最適化
をさらに深掘りし、実務で必須となる
- イメージの軽量化
- マルチステージビルド
- セキュリティ
- 再現性の高い構成
を理解していきます。
ここを理解すると、あなたは
「本番で使える Dockerfile を自分で設計できるエンジニア」
になります。
イメージを“軽量化”する重要性
軽いイメージは速い・安全・安い
Docker イメージが軽いと:
- ビルドが速い
- デプロイが速い
- セキュリティリスクが減る
- ストレージコストが下がる
実務では 軽量化は必須 です。
Node.js の軽量イメージ例
FROM node:18-slim
DockerfilePython の軽量イメージ例
FROM python:3.11-slim
Dockerfile“slim” は不要なツールを削った軽量版です。
マルチステージビルドを深掘りする
マルチステージとは?
ビルド用の環境 と
本番用の環境
を分けることで、最終イメージを軽量化する技術です。
Node.js の例
FROM node:18 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:18-slim
WORKDIR /app
COPY --from=build /app/dist ./dist
CMD ["node", "dist/app.js"]
Dockerfile何が起きているか
- build ステージ
- npm install
- ビルド(npm run build)
- 重いツールが入っている
- 本番ステージ
- build の成果物だけコピー
- node:18-slim で軽量化
- 不要なファイルが一切ない
結果:
本番イメージが劇的に軽くなる。
セキュリティを強化する Dockerfile の書き方
root で動かさない
コンテナ内で root 権限を使うのは危険です。
RUN useradd -m appuser
USER appuser
Dockerfileこれでコンテナ内の実行ユーザーが一般ユーザーになります。
不要なファイルを COPY しない
.dockerignore を必ず使う。
node_modules
.git
.env
特に .env を COPY すると
パスワードがイメージに埋め込まれる
という重大事故になります。
実務で必須の“再現性の高い Dockerfile”
バージョンを固定する
悪い例:
FROM node:latest
Dockerfile良い例:
FROM node:18.17.1
Dockerfile理由:
“latest” は日によって内容が変わるため、
昨日動いたのに今日動かない
という事故が起きます。
本番レベルの Dockerfile(Node.js)
FROM node:18 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-slim
WORKDIR /app
COPY --from=build /app/dist ./dist
RUN useradd -m appuser
USER appuser
CMD ["node", "dist/app.js"]
Dockerfileこの Dockerfile の強み
- マルチステージで軽量
- npm ci で再現性の高い依存関係
- root を使わない安全設計
- dist のみをコピーして不要物を排除
本番レベルの Dockerfile(Python)
FROM python:3.11 AS build
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
FROM python:3.11-slim
WORKDIR /app
COPY --from=build /app .
RUN useradd -m appuser
USER appuser
CMD ["python", "app.py"]
Dockerfileこの Dockerfile の強み
- slim で軽量
- no-cache-dir で無駄なキャッシュを残さない
- root を使わない
- 再現性の高い依存関係
後半まとめ
あなたがここまで理解できていれば、Day4 のゴールは完全達成です。
- イメージ軽量化は実務で必須
- マルチステージビルドで本番イメージを最適化できる
- root を使わないことでセキュリティが向上
- .dockerignore は必須
- バージョン固定で再現性が高まる
- Node.js / Python の本番レベル Dockerfile を書ける
