ドッカーとは?
Docker は、コンテナー内でコードを実行するコンテナー エンジンです。Docker イメージは、アプリケーションの依存関係を気にすることなく、どこでもアプリケーションを実行する方法です。
イメージをビルドするために、docker は Dockerfile と呼ばれるファイルを使用します。Dockerfile は、多くの命令 (RUN、COPY、EXPOSE など) を含むファイルです。これらのコマンドを正常に実行すると、docker はどこでも使用できるイメージを作成します。
docker イメージのサイズを小さくするのはなぜですか?
-
不要なパッケージをインストールすると、攻撃対象が増えるため、セキュリティ リスクが高まります。
-
ミラー転送には時間がかかります。
-
大きなイメージをデプロイするには、より多くの時間がかかります。
その Dockerfile から構築されたイメージのサイズが最適化されるように、Dockerfile を作成する必要があります。
この記事では、docker イメージのサイズを縮小する 10 の効果的な方法について説明します。
1: ミラー レイヤーを最小化する
Dockerfile のレイヤー数を減らすことができます。
dockerfile 内の各 FROM、RUN、COPY コマンドは個別のレイヤーを作成し、イメージの全体的なサイズとビルド時間を増加させます。
Docker イメージのサイズを小さくするには、単一の RUN または COPY 命令で複数のコマンドを実行して、Dockerfile のレイヤー数を最小限に抑えます。
FROM ubuntu:latest
RUN apt update - y
RUN apt install unzip - y
RUN apt install curl - y
RUN apt install python3 - y
コマンドごとに個別のディレクティブを使用する代わりに、それらを組み合わせます。
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y && \
apt install curl -y && \
apt install python3 -y
下の図からわかるように、レイヤーの数を減らすことで、サイズを数 MB 減らすことができます。
2: Docker Squash を使用してイメージ サイズを縮小する
Docker は、イメージをビルドするときに多くのレイヤーを作成します。圧縮は、イメージを論理レイヤーに整理するのに役立ちます。複数の不要なレイヤーを含む画像を作成する代わりに、画像の構造を制御できます。
次のコマンドで docker-squash をインストールできます。
pip install docker-squash
次のコマンドを実行して、イメージのサイズを縮小できます。
docker-squash image:old -t image:new
3: 小さいベース イメージを使用する
Docker イメージのサイズを縮小する最も明白な方法は、より小さいベース イメージを使用することです。
Python アプリケーション用のイメージを作成する場合は、python:3.9 の代わりに python:3.9-slim イメージを使用することを検討してください。
python:3.9 のサイズは約 1.3 GB ですが、 python:3.9-slim のサイズはわずか約 1 GB です。
高山バージョンを使用すると、ミラーリングをさらに減らすことができます。alpine イメージはコンテナーとして実行するように特別に設計されており、非常に小さいです。python:3.9-alpine イメージはわずか 49 MB です。
4: 多段階ビルドを使用してサイズを縮小する
サイズを大幅に削減するために、docker マルチステージ ビルドの概念を使用できます。ここでは、さまざまなイメージ/Dockerfile を使用して、アプリケーション コードをビルドおよびパッケージ化します。
Dockerfile をステージに分割し、必要なアーティファクトをあるステージから別のステージに渡し、最終ステージでイメージ サイズを縮小した最終イメージを配信します。画像サイズを大幅に縮小します。
# Official docker build image, Using node:14.17-alpine3.14 image for stage-1.
# Stage-1
FROM node:14.17-alpine3.14 as build
# Copy Required files
COPY public /home/app/public/
COPY src /home/app/src/
# dockerfile install multiple packages
RUN apk add g++ make python2
RUN npm install --silent
# Create Build
RUN npm run build
RUN apk --purge del python2
#Run the build by copying the files form previous stage.
# Stage-2
FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /home/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
ここでは、2 つのステージを使用して Docker ファイルからイメージを作成します。ステージ 1 ではコードをコピーしてビルドし、ステージ 2 ではステージ 1 でビルドしたコードを使用して Nginx で実行します。
5: apt インストールで --no-install-recommends フラグを使用する
apt install コマンドを実行していくつかのパッケージをインストールすると、不要な推奨パッケージがインストールされます。--no-install-recommends フラグを使用すると、イメージ サイズを大幅に縮小できます。
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends
以下の画像に示すように、新しいタグの付いた画像は、このフラグの追加により 5MB 縮小されました。これは、複数のパッケージをインストールする場合に非常に役立ちます。
--no-cache を apk add コマンドに追加できます。
6: apt install コマンドの後に rm -rf /var/lib/apt/lists/* を追加します
apt install の後にこのコマンドを追加して、docker イメージのサイズを縮小できます。
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
上の画像からわかるように、Docker イメージのサイズを約 41 MB 縮小しました。
7: .dockerignore ファイルを使用する
特定のファイルを Docker イメージにコピーしたくない場合は、.dockerignore ファイルを使用すると、スペースを節約できます。
ビルドコンテキストにはいくつかの隠しファイル/フォルダーがあり、.git などの ADD または COPY コマンドを使用してミラーに転送できます。Docker イメージのサイズを小さくするために、.dockerignore ファイルを含めることをお勧めします。
.dockerignore
ファイル例。
ignorethisfile.txt
logs/
ignorethisfolder/
.git
.cache
*.md
8: RUNの後にCOPYを置く
場合によっては、コードに小さな変更を加え、dockerfile からイメージを繰り返しビルドする必要があります。
この場合、RUN コマンドの後に COPY コマンドを配置すると、イメージ サイズを小さくするのに役立ちます。この場合、Docker はキャッシュ機能をより適切に使用できるからです。
依存関係がインストールされたイメージのキャッシュが作成され、コードが変更されるたびに、docker はそのキャッシュを使用してイメージを作成します。また、docker のビルド時間も短縮されます。
#Dockerfile-1
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
COPY file /home/ubuntu
#Dockerfile-2
FROM ubuntu:latest
COPY file /home/ubuntu
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
上記の場合、dockerfile-1 は dockerfile-2 よりも優れたパフォーマンスを発揮します。
9: インストール後にパッケージを削除する
docker イメージにいくつかのパッケージをインストールする必要があり、それらを外部からダウンロードした場合は、インストール後にそれらのパッケージを削除することをお勧めします。
たとえば、AWS CLI V2 を zip ファイルからインストールする場合は、インストールが成功した後に zip ファイルも削除することを忘れないでください。
FROM ubuntu:latest
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
sudo ./aws/install && \
rm awscliv2.zip
10: Docker イメージ圧縮ツールを使用する
docker イメージのサイズを小さくするのに役立つdockerfile 最適化ツールがいくつかあります。それらのいくつかを以下に示します。
- Dive : Dive は、Docker イメージとそのレイヤー コンテンツを探索し、Docker/OCI イメージのサイズを縮小する方法を発見するためのオープン ソース ツールです。
https://github.com/wagoodman/dive
- fromlatest.io : このツールは、Dockerfile を調べて、イメージ サイズを縮小するために実行できる追加の手順を確認します。
https://www.fromlatest.io/
- Docker Slim: コンテナをより良く、より小さく、より安全にします。dockerslim を使用してコンテナー イメージを最小化できます。
https://github.com/slimtoolkit/slim