新しい翻訳を公開し、著者の推奨事項がDockerイメージの最適化に役立つことを願っています。
Dockerは、創業以来、コンテナの使用方法に革命をもたらしました。これは主に、Dockerが提供するシンプルさによるものです。複雑なコンテナのトピックを理解していなくても使用できます。
Dockerを初めて使用する場合は、テンプレート(ベースイメージ)を選択し、命令(Dockerfileコマンド)を定義して、イメージ内にコードを配置して実行できます。
Dockerのシンプルさは、その使用の最初からあなたを導きます、そしてそれを最適化するスキルは経験を伴い、通常は時間がかかります。
私は長い間Dockerを使用してきました。そのため、初心者であっても、コンテナをより適切に作成する方法についての私の経験を共有することにしました。
1.キャッシュされたユニットを定義する➱
Dockerfileに含まれるすべてのRUNコマンド がキャッシュレベルに影響することをご存知ですか?
複数のRUNコマンドを使用してパッケージをインストールすると、ビルドプロセスのパフォーマンスと効率に影響します。単一のRUNコマンドを使用してすべてのパッケージと依存関係をインストールすると、複数ではなく1つのキャッシュユニットを作成するのに役立ちます。
RUN apt-get update && apt-get install -y \ aufs-tools \ automake \ build-essential \ curl \ dpkg-sig \ libcap-dev \ libsqlite3-dev \ mercurial \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ s3cmd=1.1.*
2.画像サイズを小さくします
画像サイズは、優れたDockerfileを作成する上で重要な役割を果たします。小さい画像を使用すると、展開が速くなり、攻撃の可能性が低くなります。
不要な依存関係
を削除するデバッグツールなどの不要なツールをイメージにインストールしないでください。
パッケージマネージャーが推奨パッケージを自動的に使用してインストールする場合は、パッケージマネージャーフラグを使用して、不要な依存関係をインストールしないようにします。
RUN apt-get update && apt-get -y install --no-install-recommends
ヒント:Bit( Github)を使用して、プロジェクト間で再利用可能なコンポーネントを共有します 。
Bitを使用すると、プロジェクト間で独立したコンポーネントを簡単に文書化、共有、および再利用できます。これを使用して、コードの再利用、設計の一貫性の維持、チームコラボレーション、配信速度の向上、およびスケーラブルなアプリケーションの構築を行います。
Bitは、Node、TypeScript、React、Vue、Angularなどをサポートしています 。Bit.devで
公開されているコンポーネントを調べてください。
3.画像のサポート
アプリケーションに適したベースイメージを選択することは非常に重要です。
公式のDockerイメージ
を使用する公式のDockerイメージを使用すると、イメージを大きくする不要な依存関係が減り、サイズが小さくなります。公式画像を使用する主な利点は3つあります。
- ベストプラクティスに基づいて画像を使用できます。
- 画像の信頼性と安全性を確保し、
- 信頼性とセキュリティを向上させます。
#
FROM node:13.12.0-alpine
#
WORKDIR /app
# `/app/node_modules/.bin` $PATH
ENV PATH /app/node_modules/.bin:$PATH
特定のタグを使用
するベースイメージを選択するときは、特定のタグを使用することをお勧めします。画像に最新のタグを使用しないでください 。 最新のタグは、時間の経過とともに重大な変更を受ける可能性があります。
#
FROM node:13.12.0-alpine
最小限のビルドバージョンを使用する最小限のビルド
は、最終的なイメージのサイズを縮小します。これにより、アプリケーションをより迅速かつ安全に展開できます。
上記の例からわかるように、最小ビルドを使用すると、イメージサイズが小さくなります。ほとんどの画像はアルパインアセンブリを使用しています。アルパインは、標準の2MBサイズの非常に軽量な画像です。
高山ベースの画像を使用することで、結果の画像のサイズを大幅に縮小できます。
4.再現性
一貫性のある環境でのソース
からの構築Dockerを使用している場合は、分離を提供するために管理された環境でアプリケーションを構築するのが最善です。
ローカルでアプリケーションを作成してレジストリに追加することは避けてください。
そうしないと、ローカル環境にインストールしたパッケージがイメージの一貫性に影響を与える可能性があります。 Dockerの主な利点の1つである環境間での一貫した実行が損なわれるため、おそらく誰もこの状況になりたくないでしょう。
マルチステージアセンブリを使用して依存関係を削除
するマルチステージアプリケーションの展開方法を使用することをお勧めします。
これにより、実行中のコンテナでアセンブリの依存関係を使用する必要がなくなります。
開発依存関係を持つ一意のビルドイメージを使用してアプリケーションをビルドし、コンパイルされたバイナリを別のコンテナイメージに移動して実行できます。
# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:13.12.0 as build-stage
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
RUN npm run build
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.15
COPY --from=build-stage /app/build/ /usr/share/nginx/html
上記のDockerfileには2つの別々のステップがあります。ステージ0は、元のノードイメージからノードアプリケーションをビルドするために使用され、ステージ1は、アセンブルされたファイルをビルドイメージから最終的にアプリケーションにサービスを提供するWebサーバー(Nginx)イメージにコピーするために使用されます。
結論
伝えたかったのはそれだけです。Dockerを初めて使用する場合は、最初のイメージを作成するときに、説明されている方法を試すことをお勧めします。これにより、トピックをより深く理解し、Dockerを最初から効果的に使用できるようになります。
他のクールなプラクティスを知っている場合は、コメントで共有してください。読んでくれてありがとう!