はじめに
Dockerコンテナーは、社内のデータセンター、クラウド、またはハイブリッドおよびマルチクラウド環境のどこでも実行できるように設計されています。箱から出してすぐに、Dockerコンテナは他の仮想化方法よりもパフォーマンスが優れている傾向がありますが、さらに最適化してさらに優れたパフォーマンスを提供できます。
この記事では、いくつかのシナリオでDockerのパフォーマンスが最適化されていない理由について説明し、Dockerのデプロイを最適化するためにシステムに適用するソリューションを提供します。
Dockerのパフォーマンスが低下する原因は何ですか?
Dockerは、ホスト構成やネットワーク品質などの複数の要因に依存する複雑なシステムです。 Dockerが遅い最も一般的な理由のいくつかを以下に示します。
不適切に割り当てられたリソース
Dockerコンテナーが十分なリソースにアクセスできない場合、パフォーマンスの問題がすぐに発生します。プロジェクトの平均イメージサイズと実行しているコンテナの数に応じて、ホストとネットワークがワークロードをサポートできる必要があります。
Dockerの画像サイズ
Dockerはイメージを使用してコンテナーを作成します。画像は、アプリが正しく機能するために必要なソースコード、ライブラリ、依存関係で構成されています。イメージから作成されたDockerコンテナは、開発とテストのための安定した環境です。
ただし、扱いにくいDockerイメージは多くのリソースを消費し、システム全体を占有します。画像サイズは相対的な用語であり、特定のアプリケーションのニーズに依存するため、このステートメントは主に画像が最適化されているか、不要なファイルで肥大化しているかを示しています。 。
Dockerファイルのコンテキストサイズ
docker build
コマンドは、Dockerfileとコンテキストの2つのソースを使用してイメージを構築します。コンテキストは、ビルドプロセスが参照できる指定された場所にあるファイルのセットです。 コンテキストサイズが大きすぎると、ビルド時のパフォーマンスに影響を与える可能性があります。
デフォルトのDocker構成はまだ使用中です
デフォルトのDocker構成は、Dockerが箱から出してすぐに機能するための適切なパラメーターを提供しますが、すべてのシステムは特定のものです。デーモンの起動オプションの構成ミス、ネットワーク 、およびその他のパラメータは、Dockerのパフォーマンスを低下させる可能性があります。
ネットワーク遅延
レジストリを作成しない限り、DockerはDockerhubを使用して画像を直接フェッチします。インターネットを介して大量のデータを移動すると、ネットワークの遅延が一般的なDockerのパフォーマンスの要因になります。
Dockerのパフォーマンスを最適化する方法
Dockerのパフォーマンスを高速化するには、ハードウェアの改善からDocker自体の内部の調整まで、いくつかの方法があります。
リソースを適切に割り当てる
ホストマシンのパフォーマンスは、コンテナのパフォーマンスに影響を与えます。 CPUの速度が遅い、またはRAMが不十分な場合、ボトルネックになり、Dockerのパフォーマンスが低下する可能性があります。
Dockerのパフォーマンスが低下する場合は、CPU、メモリ使用量、および使用可能なディスク容量を確認してください。コンポーネントが期待どおりに機能しない場合は、システムのアップグレードを検討してください。
パフォーマンスが予想よりも悪い特定のコンテナーを処理する場合は、コンテナー固有のメトリックを確認すると役立つ場合があります。
docker stats
コマンドは、実行中のコンテナーに関する重要なメトリックデータを表示します。潜在的な問題を診断するために使用します。
docker stats
コマンド出力は次のようになります。
- CPU使用率。
- メモリ使用量とコンテナあたりの制限。
- メモリ消費の割合。
- NET I/O-Dockerネットワークトラフィック。
- BLOCK I/O-ホストブロックデバイスに書き込まれるデータ。
- PIDS-コンテナが作成したスレッドの数。
Dockerイメージを最適化する
まず、次のコマンドを使用して、ビルドされたイメージのサイズを確認します。
docker images
出力には、画像のリポジトリ、タグ、ID、作成からの時間、サイズが一覧表示されます。
イメージのDockerfileをチェックし、ファイルコンテキストが大きすぎないことを確認します。コンテキストには、Dockerがコンテナーを構築するために必要なファイルが一覧表示されます。
コンテキストサイズは、 docker build
の出力に表示されます コマンド:
docker build -t [image-name] .
次の例では、コンテキストサイズは4.641MBです。
イメージのビルドコンテキストが大きすぎる場合は、 .dockerignoreを作成します コンテキストのルートディレクトリにあるファイルを作成し、不要なファイルを追加します。 Dockerは、イメージをビルドするときに、そこにリストされているファイルを無視します。
これが.dockerignoreの例です ファイル:
temp*
*/temp*
最初の行は、名前が temp
で始まるすべてのファイルとディレクトリをコンテキストから除外するようにDockerに指示しています。 ルートディレクトリにあります。 2つ目は、ルートの任意のサブディレクトリに対して同じことを行います。
依存関係を確認する
依存関係をインストールする場合、DebianベースのDockerイメージは追加のバイナリとファイルを生成できます。これらの相互依存関係の一部は、コンテナーが正常に機能するために必要ではなく、削除できます。
不要な相互依存関係を手動で削除するには、以下のコマンドを使用してください。
/var/cache
内のパッケージを削除します :
apt clean
廃止されたパッケージを削除する:
apt autoclean
削除されたパッケージによって使用されている相互依存関係を削除します:
apt autoremove
マイクロサービスアーキテクチャへの切り替えを検討する
モノリシックアプリケーションは、マイクロサービスアーキテクチャを使用して構築されたアプリケーションよりも低速になる傾向があります。 Dockerコンテナーの実行に問題がある場合は、コンテナー内のアプリのサイズが原因である可能性があります。アプリをマイクロサービスに移行すると、ワークロードを複数のコンテナーに分割できます。
専用リソースを使用する
クラウド環境では、VMは同じサーバー上の他のVMとハードウェアリソースを共有することがよくあります。ただし、ベアメタルクラウドの専用ハードウェアでコンテナーをホストすると、仮想化のオーバーヘッドが排除され、コンテナーのパフォーマンスが向上します。コンテナ化されたアプリは、RAMやCPUなどのシステムリソースを共有しません。これにより、レイテンシが低下せず、アプリがハードウェアを完全に利用できるようになります。
軽量オペレーティングシステムを使用する
Windows、macOS、商用Linuxディストリビューションなどのフル機能のオペレーティングシステムは、システムリソースの大部分を消費し、Dockerの最適なパフォーマンスに必要なものよりも少なくなります。 RancherOS、CoreOS Container Linux、Alpine Linux、VMware Photon OSなどの軽量ディストリビューションは、Dockerコンテナーで動作するように最適化されています。軽量システムで画像を作成すると、最終的な画像サイズを100 MB以上節約でき、速度が大幅に向上します。
Dockerfileレイヤーのキャッシュ
レイヤーキャッシングを使用して、イメージ構築の速度を向上させます。 Dockerがイメージの構築を開始すると、キャッシュで類似の署名を含むレイヤーを検索し、プロセスでそれらを使用します。この機能により、構築プロセスがスピードアップします。
既存の画像をキャッシュソースとして指定する場合は、 --cache-from
を使用します オプション:
docker build --cache-from [image-to-cache-from] -t [next-build] -f [path-to-dockerfile]