はじめに
Dockerイメージは、Dockerコンテナーの構築に使用される重要なコンポーネントです。密接に関連していますが、Dockerイメージとコンテナには大きな違いがあります。
Dockerイメージは、コンテナーのベースです。これらのイメージは、特定のDockerイメージを作成するために自動的に実行される命令のリストであるDockerfilesを作成することによって作成されます。
Dockerイメージを構築するときは、それを軽量に保つ必要があります。大きな画像を避けることで、コンテナの構築と展開がスピードアップします。したがって、画像サイズを最小限に抑えることが重要です。
Dockerイメージを小さく保つ方法を学ぶために読んでください。
小さいイメージベース(アルパイン)を使用する
Dockerイメージを作成するには、必要に応じてコンポーネントをインストールおよび追加できるベースが必要です。既存の親イメージをダウンロードして、それを独自のイメージのベースとして使用することも、最初から作成することもできます。
イメージのベースとしてオペレーティングシステムのバリエーションをインストールします。 OSベースは、最終的なDockerイメージのサイズに大きな影響を与える可能性があるため、適切なイメージを決定することが重要な役割を果たします。
Linuxは、軽量でPOSIX環境が最小限のAlpineという便利な代替手段を作成しました。このLinuxディストリビューションイメージベースはわずか5MBで、musllibcとBusyBoxを中心に構築されています。
他のOSイメージと比較して、Alpineはサイズがはるかに小さいです。最もダウンロードされたOSイメージであるUbuntuは188MBですが、Alpineはわずか5MBです。
.dockerignoreファイルを使用する
画像に不要な特定のファイルを除外すると、画像サイズを小さくするのに役立ちます。ここで、 .dockerignore ファイルが入ります。
イメージを構築するときは、そのイメージがどのように見えるかを指定したDockerfileを記述します。
ビルドコンテキストの概要を説明するときは、.dockerignoreファイルを含めて、Dockerfileと同じフォルダーに保存することも重要です。
このDocker機能は、 docker run
で開始されます 。システムはそのようなファイルがあるかどうかをチェックし、その例外を適用してルールを無視します。そうすれば、構築されたコンテキストから無関係なコンテンツを削除できます。
Dockerでマルチステージビルド機能を利用する
Dockerは、17.05バージョンで多段階機能を導入しました。これにより、ユーザーはDockerfileを複数のステージに分割できます。
各段階はFROM
で始まります 命令。必要なアーティファクトは次の段階に進み、最終的な画像アーティファクトに必要のないコンテンツが残ります。
プロセスはアーティファクトの必要なコンポーネントのみを転送するため、すべての命令の後に手動でクリーンアップする必要はありません。
マルチステージ機能を使用すると、画像全体のサイズに大きな影響を与える不要なレイヤーを追加する必要がなくなります。
Dockerイメージサイズを減らすために不要なレイヤーを追加しないようにする
Dockerイメージは、レイヤーを追加するたびに、より多くのスペースを占有します。したがって、レイヤーが多いほど、画像に必要なスペースも多くなります。
各RUN
Dockerfileの命令により、イメージに新しいレイヤーが追加されます。そのため、単一の RUN
内でファイル操作を実行する必要があります。 指図。また、 &&
を使用して、さまざまなコマンドを1つの命令に結合します オプション。
たとえば、リポジトリを更新して、1つの RUN
に複数のパッケージをインストールできます。 命令。明確で包括的な線を引くには、円記号( \ )を使用します )コマンドを複数行で入力します。
パッケージの更新とインストールとは別に、 && rm -rf /var/lib/apt/lists/*
を使用してaptキャッシュをクリーンアップする必要があります。 スペースを節約するために。
RUN apt-get update && apt-get install -y\
[package-one] \
[package-two]
&& rm -rf /var/lib/apt/lists/*
更新と不要なパッケージおよび依存関係に注意してください
スペースを節約し、Dockerイメージを小さく保つ別の方法は、構築しているプラットフォームの最新バージョンを実行していることを確認することです。
最新バージョンを使用することで、無数のrpmパッケージをダウンロードし、多くのスペースを占有する大規模な更新を回避できます。
パッケージのインストールには、ソフトウェアが依存する依存関係のダウンロードも含まれることがよくあります。ただし、ダウンロードによって、必須ではなく推奨されるパッケージも保存される場合があります。
このような不要なパッケージは、合計して多くのディスク領域を消費する可能性があります。主な依存関係のみをダウンロードするには、 --no-install-recommends
を追加します インストールコマンドのオプション。
例:
RUN apt-get install --no-install-recommends [package-one]
ボーナスのヒント:キャッシング
このヒントはDockerイメージの全体的なサイズには影響しませんが、Dockerビルドの高速化には役立ちます。
Dockerは、Dockerfileの既存のレイヤーをローカルにキャッシュし、それを使用してイメージをより高速に再構築することにより、イメージの構築を高速化します。
たとえば、3つのレイヤーで構成される単純なDockerfileがあるとします。そのファイルからイメージを作成すると、システムはこれらの3つのレイヤーを自動的にキャッシュします。次にイメージを作成すると、ローカルキャッシュからロードされます。
画像を変更してレイヤーの1つを変更することにした場合、変更されたレイヤーの後はキャッシュは何にも使用されません。
効率を改善し、キャッシュ機能を利用する方法で命令を注文することをお勧めします。変更される可能性のある命令をDockerfileのできるだけ低い位置に配置します。