6.1 イメージ最適化の概要
Dockerイメージはコンパクトだけど、やっぱりスペースを使うんだよね。だから、そのサイズを減らすことは重要で、パフォーマンスを向上させたり、コンテナのダウンロードやデプロイを速くしたり、ストレージのコストを下げたりに繋がるんだ。Dockerfileを改善することでイメージを最適化できるけど、その構成方法はいろいろある。このレクチャーでは、最適化された軽量なDockerイメージを作るためのいくつかの戦略とベストプラクティスを見ていくよ。
Dockerイメージのサイズを減らすのがなぜ重要なの?
- デプロイ速度: 小さいイメージはDockerのレジストリからより速くダウンロードされ、コンテナとしてデプロイされるよ。特に自動化されたCI/CDシステムでは重要だね。
- リソースの効率的な利用: 軽量なイメージはディスクスペースをあまり使わないし、転送時にネットワークのリソースを節約できるし、計算資源の効率的な利用にも繋がるよ。
- セキュリティ: 小さいイメージは通常不要なコンポーネントが少ないから、潜在的な脆弱性のリスクを減らせるんだ。
- アップデートの簡略化: 軽量なイメージをアップデートするのは速いし、リソースがあまり必要ないから、メンテナンスプロセスがより速くなるよ。
6.2 Docker イメージサイズを減らすための戦略
1. 最小限のベースイメージを使用する
ベースイメージの選択は、最終的な Docker イメージのサイズに直接影響するよ。alpine
のような最小限のベースイメージを使うことで、イメージのサイズを大幅に縮小することができるんだ。
例:
ubuntu
を alpine
に置き換える:
# FROM ubuntu:20.04
FROM alpine:3.12
alpine
は軽量な Linux ディストリビューションで、約5 MBしか占めないのに対し、ubuntu
イメージは数百 MB にも達することがあるよ。
2. レイヤーの数を最小化する
Dockerfile の各命令がイメージに新しいレイヤーを追加するんだ。RUN
に複数のコマンドを1つにまとめることで、レイヤー数を減らし、全体のサイズを縮小できるよ。
例:
最適化前:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*
最適化後:
RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*
パッケージマネージャーのキャッシュを削除する (rm -rf /var/lib/apt/lists/*)
と、インストール中に作成される一時ファイルを削除することでイメージのサイズをさらに小さくすることができるよ。
3. 一時ファイルを削除する
パッケージをインストールした後に一時ファイルや不要なデータを削除することで、イメージをクリーンで軽量に保てるよ。
例:
RUN apt-get update && apt-get install -y curl git && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
4. .dockerignore
を使用する
.dockerignore
ファイルを使うと、ビルドコンテキストから不要なファイルやディレクトリを除外できるんだ。それによってイメージのサイズが小さくなり、ビルドプロセスも速くなるよ。
.dockerignore
の例:
node_modules
dist
*.log
Dockerfile*
.dockerignore
5. マルチステージビルド (multi-stage builds)
マルチステージビルドを使うと、複数の中間イメージを使って、必要なファイルや依存関係だけを含む軽量な最終イメージを作成できるよ。
例:
# ビルドステージ
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 最終ステージ
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
この例では、最初のステージでアプリのビルドを行い、最終ステージではビルド結果だけを使っているんだ。それによって最終的なイメージサイズが縮小されるのさ。
6. パッケージのインストールを最適化する
必要なパッケージのみをインストールし、パッケージマネージャーのオプションを使って最小限のインストールにすることで、イメージのサイズを小さくできるよ。
例:
apt-get
に --no-install-recommends
オプションを使う:
RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
rm -rf /var/lib/apt/lists/*
7. データの圧縮と最小化
データを圧縮・最小化するツールを使用すると、イメージのサイズを縮小できるんだ。
例:
テキストファイルやログファイルを圧縮する:
RUN gzip /path/to/large/file.log
8. 未使用のライブラリや依存関係を削除する
必要なパッケージをインストールした後、使用しないライブラリや依存関係を削除することで、イメージを軽量に保てるよ。
例:
Python アプリの場合:
RUN pip install --no-cache-dir -r requirements.txt
6.3 最適化されたDockerfileの例
例1: Node.js用の最適化されたDockerfile
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
この例ではマルチステージビルドを使ってるんだ。まずは中間ステージでアプリをビルドして、その後にビルドの結果だけをNginxベースの最終イメージにコピーするんだよ。
例2: Python用の最適化されたDockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
この例では軽量なベースイメージpython:3.9-slim
を使ってるよ。依存関係のインストールを個別のステップに分けているから、requirements.txt
が変更されない限りDockerのキャッシュを使えるんだ。
GO TO FULL VERSION