次の 2 つの側面から画像を合理化できます。 容量を減らすために画像レイヤーの数を減らす 1.画像レイヤーの数を減らす1. 命令の統合Dockerfile 内の各命令はレイヤーを作成しますが、公式ドキュメントのベストプラクティスを見ると、次の文があります。 以前のバージョンの Docker では、イメージのパフォーマンスを確保するには、イメージ内のレイヤーの数を最小限に抑えることが重要でした。この制限を軽減するために、次の機能が追加されました。
... 参照アドレス: レイヤーの数を最小限に抑える つまり、RUN、COPY、ADD 命令のみがレイヤーを作成し、他の命令は中間イメージを作成し、イメージ サイズには影響しません。したがって、ここで説明する命令のマージは、主にこれら 3 つの命令に基づいています。 次のDockerfileを例に挙げてみましょう debian:stable より ワークディレクトリ /var/www ラベルバージョン="v1" apt-get updateを実行する apt-get -y --no-install-recommends を実行して curl をインストールします。 apt-get purge -y curlを実行します。 apt-get autoremove -yを実行します apt-get cleanを実行する rm -rf /var/lib/apt/lists/* を実行します。 イメージを構築する ビルド -t curl:v1 。 履歴からビルド履歴を表示する # docker 履歴 curl:v1 画像作成者 サイズ コメント 29b721c09b67 18 秒前 /bin/sh -c rm -rf /var/lib/apt/lists/* 0B aa28ae151e59 20 秒前 /bin/sh -c apt-get clean 0B 4f733781f557 22 秒前 /bin/sh -c apt-get autoremove -y 989kB f66887372121 29 秒前 /bin/sh -c apt-get purge -y curl 987kB d458ee0de463 34 秒前 /bin/sh -c apt-get -y --no-install-recommend… 4.46MB 43fdcf68018c 44 秒前 /bin/sh -c apt-get update 17.6MB 65631e8bb010 53 秒前 /bin/sh -c #(nop) LABEL version="v1" 0B 7ef7c53b019c 53 秒前 /bin/sh -c #(nop) WORKDIR /var/www 0B 8bfa93572e55 13日前 /bin/sh -c #(nop) CMD ["bash"] 0B <不足> 13 日前 /bin/sh -c #(nop) ADD file:d78d93eff67b18592… 124MB 画像サイズ [root@localhost dockerfiles]# docker イメージ リポジトリ タグ イメージ ID 作成 サイズ curl v1 29b721c09b67 10分前 148MB RUN命令をシェルのような操作と統合します。 apt-get update を実行 && \ apt-get -y --no-install-recommends インストール curl && \ apt-get purge -y カール && \ apt-get autoremove -y && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* ビルド履歴とイメージサイズを表示する # docker 履歴 curl:v2 画像作成者 サイズ コメント 928e12c2f57e 約 1 分前 /bin/sh -c apt-get update && apt-get -y … 989kB 5a32372025fb 約1分前 /bin/sh -c #(nop) LABEL version="v2" 0B 7ef7c53b019c 30 分前 /bin/sh -c #(nop) WORKDIR /var/www 0B 8bfa93572e55 13日前 /bin/sh -c #(nop) CMD ["bash"] 0B <不足> 13 日前 /bin/sh -c #(nop) ADD file:d78d93eff67b18592… 124MB # Docker イメージ リポジトリ タグ イメージ ID 作成 サイズ curl v2 928e12c2f57e 3分前 125MB 単純な curl アプリケーションをコマンドマージでインストールするだけで、約 20 MB の容量が解放されたことがわかります。また、Dockerfile がより読みやすく簡潔になります。 2. 多段階ビルドマルチステージ ビルドは Docker 17.05 で導入されました。マルチステージ ビルドにより、ビルドの複雑さが大幅に軽減され、イメージ サイズを簡単に削減できるようになります。マルチステージビルドのDockerfileを見てみましょう #フェーズ1 golang:1.16より ワークディレクトリ /go/src コピー app.go ./ go build app.go -o myapp を実行します。 #フェーズ2 ゼロから ワークディレクトリ /サーバー コピー --from=0 /go/src/myapp ./ コマンド ["./myapp"] イメージを構築する docker build --no-cache -t server_app:v2 。 ビルドされたイメージを表示する
上記のユースケースは、前回の記事「Dockerfile マルチステージ ビルドの実践」から引用したものです。イメージのマルチステージ ビルドの詳細については、記事を参照してください。ここでは詳細には触れません。 3. スクワッシュ機能を有効にするsquash 機能 (実験的な機能) を有効にすると、 docker build --squash -t curl:v3 。ビルドされたイメージを 1 つのレイヤーに圧縮できます。ただし、コンテナ イメージ レイヤー共有の優れた設計を最大限に生かすためには、この方法は推奨されません。 2. 容量を減らす1. 小さなベースイメージを選択する各 Linux ディストリビューション イメージのサイズは大きく異なり、同じディストリビューション イメージでも違いがあります。 Debian を例に挙げてみましょう: 安定版とスリム版の違いは約40MB # Docker イメージ debian stable-slim 2aa48a485e3a 13日前 80.4MB debian stable 8bfa93572e55 13日前 124MB Dockerfileのベースイメージをスリムバージョンdebian:stable-slimに変更しました。 debian:stable-slim より 構築されたイメージのサイズが小さくなる # Docker イメージ リポジトリ タグ イメージ ID 作成 サイズ curl v4 1aab5c9bf8b3 17秒前 81.4MB 現在のイメージは Debian をベースにしており、多くのバイナリが含まれています。 Docker コンテナには単一のプロセスが含まれ、その実行に必要な最小限のものだけが含まれている必要があります。実際には、オペレーティング システム全体は必要ありません。 Debian ベースイメージを Alpine ベースのイメージに置き換えることができます。 アルパインから ワークディレクトリ /var/www ラベルバージョン="v5" echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories && \ を実行します。 apk アップデート && \ apk アップグレード && \ apk add --no-cache curl 画像サイズを確認する # Docker イメージ リポジトリ タグ イメージ ID 作成 サイズ curl v5 7f735bb213be 11秒前 10.1MB この時点で画像は 10MB に達しました。 alpine が使用するパッケージ管理ツールは apk であり、一部のパッケージ名が異なる場合があります。最大の違い 2. コンテキスト管理よく使うCOPYコマンド コピー ./server/dir COPY はビルド コンテキスト全体をイメージにコピーし、新しいキャッシュ レイヤーを生成します。ログ、キャッシュ ファイル、Git 履歴などの不要なファイルがビルド コンテキストに読み込まれないようにするには、必須でないファイルを無視する .dockerignore を追加することをお勧めします。これはイメージを合理化する上で重要なステップでもあり、構築するイメージのセキュリティをより確実にすることができます。 3. ダウンロードを時間内にクリーンアップする以下のDockerfileがあります .. ワークディレクトリ /tmp curl -LO https://docker.com/download.zip && tar -xf download.zip -C /var/www を実行します。 rm -f download.zip を実行します。 ... rm を使用して download.zip パッケージを削除しましたが、イメージのレイヤー化の問題により、download.zip は新しいレイヤーで削除され、以前のレイヤーはまだ存在していました。 ダウンロードを1つのレイヤーでタイムリーにクリーンアップする必要があります curl -LO https://docker.com/download.zip && tar -xf を実行します。 ダウンロード.zip -C /var/www && rm -f ダウンロード.zip さらに、ソフトウェアをインストールするときは、パッケージ管理ツールを使用して、ダウンロードしたソフトウェアの依存関係とキャッシュを時間内にクリアする必要があります。たとえば、apt パッケージ管理ツールを使用して、dockerfile をクリーンアップします。 ここでは、イメージの合理化に関連する操作を紹介します。関連する Docker コンテナーの合理化イメージについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: LeetCode の SQL 実装 (177. 給与が N 番目に高い)
1. 環境バージョンDocker バージョン 19.03.12セントロス7ソル8.6.2 2. Do...
この記事では、ショッピングカートを実装するためのJavaScriptの具体的なコードを参考までに紹介...
これは非常にシンプルな純粋な CSS3 の白い雲の浮遊する背景効果です。浮かぶ白い雲の特殊効果は、C...
この記事は主にDockerでパラメータ変数を外部から指定する方法を紹介します。この記事のサンプルコー...
回転フリップ効果の CSS アニメーション、具体的な内容は次のとおりです。 1. まず2つのボックス...
背景:最近、同社のプロジェクトは同時実行のプレッシャーに耐えられないようなので、最適化が差し迫ってい...
目次1. インデックスの役割2. インデックスの作成と削除(1)ALTER TABLE文を使用して、...
1. 対照的な色を使用します。ここでのコントラストとは、テキストの色と背景色のコントラストを指します...
序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...
昨日、1年間使用していた Alibaba Cloud サーバーを購入しました。システムは Linux...
1. 分析的思考1. 機械自身の理由を排除する2. サーバーパフォーマンス分析3. プロジェクト自体...
障害に遭遇すると、障害の根本的な原因を考えるのではなく、障害を解決する方法を考えることがよくあります...
この記事の例では、ショッピングカート機能を実装するためのjQueryの具体的なコードを参考までに共有...
まず、GB2312、GBK、UTF-8 はすべて文字エンコーディングであることを理解する必要がありま...
目次1. 単一データベースのバックアップ2. 圧縮バックアップ3. マルチデータベースバックアップ4...