DUICUO

知っておくべき7つのDockerベストプラクティス

翻訳者 |ブガッティ

校正者 | Chonglou

Dockerは人気のコンテナ化ソフトウェアですが、誰もが効率的に活用しているわけではありません。Dockerのベストプラクティスに従わないと、アプリケーションはセキュリティやパフォーマンスの問題簡単に影響を受ける可能性があります

この記事では、 Dockerの機能を効率的に活用するためのベストプラクティスをいくつか紹介します。これらの対策により、セキュリティが向上し、メンテナンスしやすいDockerfiles作成できます

1.公式Dockerイメージを使用する

アプリケーションをコンテナ化する場合は Dockerイメージを使用する必要があります。カスタム構成を使用してイメージを構築することも、公式のDockerイメージを使用することもできます

独自のイメージを構築するには、すべての設定を自分で行う必要があります例えば Nodex.jsアプリケーションイメージを構築する場合 Nodex.jsその依存関係をダウンロードする必要がありますこのプロセスは時間がかかり、正しい設定がすべて生成されない可能性があります。

Dockerはすべての正しい依存関係を含む公式Node.jsイメージの使用を推奨しています。Dockerイメージはセキュリティが優れ、軽量で、様々な環境でテストされています。公式イメージはDockerの公式イメージページから入手できます

2. Dockerイメージの特定のバージョンを使用する

公式イメージプルすると通常は「latest」タグが付きます。これは、そのイメージの最新の更新バージョンであることを意味しますそのイメージを使用してコンテナをビルドするたびに、以前のコンテナとは異なるバージョンになります。

異なるバージョンのDockerイメージを使用してビルドすると、予期しないアプリケーションの動作が発生する可能性があります。他の依存関係とのバージョン競合が発生し最終的にアプリケーションが失敗する可能性があります。

Dockerは、プルとビルドに特定のバージョンのイメージを使用することを推奨しています。公式イメージには、最も一般的なユースケースを説明したドキュメント付属しています。

例えば、 `docker pull alpine`ではなく`docker pull alpine :3.18.3`を使用してください。Docker特定のバージョンをプルします。その後のビルドでそのバージョンを使用することで、アプリケーションのエラーを減らすことができます。特定のバージョンのイメージは、公式Dockerイメージページ「Supported」タブと対応するDockerfileリンクで確認できます

3.画像をスキャンしてセキュリティの脆弱性を見つけます。

ビルドしたいイメージにセキュリティ上の脆弱性がないかどうかを確認するにはどうすればよいですか単純にスキャンするだけです。Dockerイメージをスキャンするには、 「Docker scan」コマンドを使用します。構文は次のとおりです

 docker scan [IMAGE]

イメージをスキャンする前にDockerにログインする必要があります

 docker login

次に、検査したい特定の画像をスキャンします

 docker scan ubuntu: latest

Synkというツールは、イメージをスキャンし、深刻度に基づいて脆弱性をリストアップできます。脆弱性の種類と関連情報修正方法を含むへのリンクを確認できます。スキャン結果から、そのイメージがアプリケーションにとって十分に安全かどうかを判断できます

4. 小さなDockerイメージを使用する

Dockerイメージをプルする、すべてのシステムユーティリティが付属します。そのため、不要なツールのためにイメージサイズが大きくなってしまいます。

大きなDockerイメージは多くのストレージ容量を消費し、コンテナの動作を遅くします。また、セキュリティ上の脆弱性が含まれる可能性も高くなります

Alpineイメージを使用すると、Dockerイメージのサイズを縮小できます。Alpineイメージは軽量で、必要なツールのみが付属しています。ストレージ容量を削減し、アプリケーションの実行速度と効率を向上させます。

ほとんどの公式DockerイメージのAlpineバージョンはDocker上で見つかります。以下はPostgreSQLのAlpineバージョンの例です。

5. キャッシュイメージレイヤーを最適化する

Dockerfile内の各コマンドは、イメージ上のレイヤーを表します。これらのレイヤーはそれぞれ異なるユーティリティを持ち異なる機能を実行します。Docker Hubの公式イメージを見ると作成手順が記載されています。

Dockerfileには、イメージを作成するために必要なものがすべて含まれています。これが、多くの開発者が仮想マシンよりもDockerを好む理由の一つです

以下は、 Alpine イメージの例の構造です

イメージベースのアプリケーションをビルドする実際にはイメージレイヤーが追加されます。DockerはDockerfileの上から下へと命令を実行し、あるレイヤーが変更されると、Dockerは後続のレイヤーを再構築する必要があります。

ベストプラクティスとしては、 Dockerfile を、変更頻度低いものから高いもの順に並べます。変更されない命令 install などは、ファイルの先頭に配置できます。

ファイルを変更すると、Docker は変更されたファイルに基づいてビルドを行い、その上に変更されていないファイルをキャッシュします。その結果、プロセスの実行速度が向上します。

上の画像の例をご覧ください。アプリケーションファイルが変更された場合、Dockerはそこからビルドを実行します。NPMパッケージを再インストールする必要はありません

イメージからビルドする場合、他のすべてのレイヤーを最初から再構築するよりもはるかに高速に実行されます。また、キャッシュにより、 Docker Hubからのイメージのプルとプッシュも高速化されます。

6. .dockerignoreファイルを使用する

Dockerfileを使用してイメージをビルドする際に、特定の情報のプライバシーを保護したい場合があります。プロジェクトの一部であるファイルやフォルダであっても、ビルドプロセスには含めたくない場合があります。

.dockerignore ファイルを使用すると、イメージサイズを大幅に削減できます。これは、ビルドプロセスに必要なファイルのみがビルドに含まれるためです。また、ファイルの機密性を保ち、キーやパスワードの漏洩を防ぐのにも役立ちます。

.dockerignoreファイルは、Dockerfile と同じフォルダに作成するファイルです。.gitignoreファイルと同様にビルドプロセス中に含めたくないファイルの名前を含むテキストファイルです。

以下に例を示します

7.最小権限の原則を使用します。

デフォルトでは、Dockerはコマンド実行権限取得するために管理者としてrootユーザーを使用しますが、これは好ましくない方法です。コンテナの1つに脆弱性がある場合、ハッカーがDockerホストにアクセスできる可能性があります。

このような状況を回避するには専用のユーザーとユーザーグループを作成する必要がありますユーザーグループに適切な権限を設定することで、機密情報を保護できます。ユーザーが侵害された場合、プロジェクト全体を公開することなく、そのユーザーを削除できます

例は、ユーザーを作成し、権限を設定する方法を示しています

一部のベースイメージでは、擬似ユーザーが作成されます。rootユーザー権限の代わりに、インストールされたユーザーを使用できます。

ベストプラクティスは、脆弱性を軽減し、よりクリーンなコードを書くための優れた方法です。多くのベストプラクティスは使用するすべてのDocker機能適用できます

適切に整理されたプロジェクトは、 Kubernetes などの他のオーケストレーションツールとの同期が容易になりますこの記事で概説した方法から始めて Docker を学びながら、より多くのアプローチを採用していくことができます

原題:知っておくべき 8 つの Docker ベストプラクティス、著者: Sandra Dindi