Docker イメージ サイズを縮小するための 10 の最適化のヒント

ドッカーとは?

Docker は、コンテナー内でコードを実行するコンテナー エンジンです。Docker イメージは、アプリケーションの依存関係を気にすることなく、どこでもアプリケーションを実行する方法です。

イメージをビルドするために、docker は Dockerfile と呼ばれるファイルを使用します。Dockerfile は、多くの命令 (RUN、COPY、EXPOSE など) を含むファイルです。これらのコマンドを正常に実行すると、docker はどこでも使用できるイメージを作成します。

docker イメージのサイズを小さくするのはなぜですか?

  1. 不要なパッケージをインストールすると、攻撃対象が増えるため、セキュリティ リスクが高まります。

  2. ミラー転送には時間がかかります。

  3. 大きなイメージをデプロイするには、より多くの時間がかかります。

その 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 最適化ツールがいくつかあります。それらのいくつかを以下に示します。

  1. Dive : Dive は、Docker イメージとそのレイヤー コンテンツを探索し、Docker/OCI イメージのサイズを縮小する方法を発見するためのオープン ソース ツールです。

    https://github.com/wagoodman/dive

  2. fromlatest.io : このツールは、Dockerfile を調べて、イメージ サイズを縮小するために実行できる追加の手順を確認します。

    https://www.fromlatest.io/

  3. Docker Slim: コンテナをより良く、より小さく、より安全にします。dockerslim を使用してコンテナー イメージを最小化できます

    https://github.com/slimtoolkit/slim

おすすめ

転載: blog.csdn.net/robinhunan/article/details/129579161