Dockerコンテナでは、イメージを簡素化してサイズを縮小する方法を詳しく説明しています

Dockerコンテナでは、イメージを簡素化してサイズを縮小する方法を詳しく説明しています

次の 2 つの側面から画像を合理化できます。

容量を減らすために画像レイヤーの数を減らす

1.画像レイヤーの数を減らす

1. 命令の統合

Dockerfile 内の各命令はレイヤーを作成しますが、公式ドキュメントのベストプラクティスを見ると、次の文があります。

以前のバージョンの Docker では、イメージのパフォーマンスを確保するには、イメージ内のレイヤーの数を最小限に抑えることが重要でした。この制限を軽減するために、次の機能が追加されました。

  • RUN、COPY、ADD 命令のみがレイヤーを作成します。その他の命令は一時的な中間イメージを作成し、ビルドのサイズは増加しません。

...

参照アドレス: レイヤーの数を最小限に抑える

つまり、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 。

ビルドされたイメージを表示する

# Docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
server_app v2 20225cb1ea6b 12秒前 1.94MB

上記のユースケースは、前回の記事「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 をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerはローカルイメージとコンテナの保存場所を設定します
  • Dockerはコンテナを通じてイメージを生成し、詳細にDockerCommitを送信します
  • Skywalking は Docker イメージをコンテナ化してデプロイし、テストから可用性まで k8s を構築します。
  • Docker イメージとコンテナ サービスの IDEA リモート管理の実装
  • Dockerコンテナ練習用イメージウェアハウス
  • Docker コンテナの実践: イメージとコンテナの仕組み

<<:  LeetCode の SQL 実装 (177. 給与が N 番目に高い)

>>:  CSS継承方法

推薦する

Word のコンテンツを Web サイトのエディターに直接コピーすることはお勧めしません。

<br />質問: Word のコンテンツを Web サイトのエディターに直接コピーする...

Linux で MySQL をインストールする簡単な方法

Linux に MySQL をインストールする方法をオンラインで検索すると、多くの方法が表示されまし...

MySQL 8.0.22 winx64 のインストールと設定方法のグラフィックチュートリアル

MySQL-8.0.22-winx64のデータベースインストールチュートリアルは参考になります。具体...

Vue.js フロントエンドフレームワークにおけるイベント処理の概要

1. v-onイベント監視DOM イベントをリッスンするには、v-on ディレクティブを使用します。...

要素UIテーブルはドロップダウンフィルタリング機能を実現します

この記事の例では、要素UIテーブルにドロップダウンフィルタリングを実装するための具体的なコードを参考...

Linux システムで tcpdump を使用してパケットをキャプチャする方法

まずサンプルコードを見てみましょう: 1. 共通パラメータ tcpdump -i eth0 -nn ...

jsを使用してシンプルな虫眼鏡効果を実現します

この記事では、簡単な虫眼鏡効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な内...

Tkinterはjsキャンバスを使用してグラデーションカラーを実現します

目次1. RGBを使用して色を表す2. Tkinter キャンバスコンポーネント3. グラデーション...

Vue で Axios 非同期リクエスト API を使用する方法

目次基本的なHTTPリクエストの設定async/await を使用した Axios Axios によ...

MySQLトランザクションとMySQLログの詳細な説明

取引特性1. アトミック性: トランザクションの開始後、すべての操作が完了するか、まったく実行されな...

Win10にMySQL8圧縮パッケージ版をインストールするチュートリアル

1 公式サイトからMySQL8をダウンロードしてインストールするMySQL8 ダウンロードアドレスこ...

nginxとバックエンドポート間の競合の解決策

質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...

MySQL 学習ノート: 完全な SELECT ステートメントの使用例と詳細な説明

この記事では、MySQL 学習ノートの select ステートメントの完全な使用方法を例を使用して説...

React Nativeはモニタリングジェスチャーの上下プル効果を実現します

React Native は、プルアップとプルダウンの監視ジェスチャを実装します。詳細なコアコードは...

Ubuntu 20.04は静的IPアドレスを設定します(異なるバージョンを含む)

Ubuntu 20.04はnetplanを通じてネットワークを管理するため、以前のバージョンとは少...