トップ5


この記事では、より良いサイズ、セキュリティ、および開発者の経験のために私たちのイメージを最適化するのに役立ついくつかの重要なDockerベストプラクティスを通過します.

チェン最低1人
デフォルトでは、ユーザーがDockerfileで指定されていない場合は、rootユーザーを使用します.これは、アプリケーションがrootユーザーを必要としないときの99 %という大きなセキュリティリスクになります.
これを避けるために、単にDockerfileに専用のユーザーと専用のグループを作成し、アプリケーションを実行するためにそのユーザーを使用するためにUSERディレクティブを追加します.

注意:いくつかのイメージはすでに使用できる一般的なユーザが付属しています.例えば、 node.js 画像はnodeと呼ばれるユーザと一緒に来る.

マルチステージ
私たちの展開、セキュリティ、およびdevの経験に影響を与えることになるまで、彼らはしなければならないよりも多くの場合、Docker画像は非常に大きいです.あなたのイメージをきれいに保つのが難しいので、ビルドを最適化することは複雑でありえます.また、私たちのリリースでは、ツール、dev依存関係、ランタイムまたはコンパイラのような不要な資産の出荷を終了します.
TLR
主なアイデアは、ビルドステージをランタイムステージから分離することです.
  • は、全体のランタイムまたはSDK
  • によるベースイメージから派生します
  • は、我々のソースコード
  • をコピーします
  • 依存関係をインストールする
  • は、人工アーティファクト
  • を生産します
  • は、はるかにより小さいリリースイメージ
  • に造られたアーチファクトをコピーします
    下記はGOのための例です、最終的な生産イメージはちょうど10 MBのラウンドです!

    注:多段ビルドの詳細については、私の以前の記事をチェック

    セキュリティ脆弱性のための1
    セキュリティは、特に医療、金融などの非常に規制された業界で働いている場合は特に、任意のアプリケーションの重要な部分です.私たちにとっては、Dockerは、セキュリティ脆弱性のための私たちのイメージをスキャンすることができますdocker scanコマンドが付属しています.これは、CIの設定の一部としてこれを使用することをお勧めします.
    $ docker scan <your-image>
    
    node:17-alpineおよびnode:17のスキャン結果を示します.完全なOS配布によるnode:17を見ることができるように、弱点のトンがあります.



    小さなサイズの公式イメージ
    正直にしましょう、誰も開発やCiのビルド中に巨大なコンテナを引くのが好きです.時々、私たちは特定のタスクのために完全なOS配布でコンテナを使わなければなりませんが、私の意見では、コンテナは小さくなければならなくて、ちょうどそれが出荷コードに関して我々のアプリケーションのまわりで孤立したラッパーとして行動するだけです.したがって、より多くの安全なイメージを持っていることを確認して、攻撃面を最小にして、必要なシステムツールとライブラリを束ねるだけで、より多くのイメージをより少ないイメージで使用することを勧められます.
    例えば、画像サイズを最適化するときには、 alpine を使用することが多い.アルパインLinuxはセキュリティ指向、軽量のLinuxディストリビューションMUSL libcとbusyboxに基づいています.



    ケインを使用する
    私たちが知っているように、Dockerイメージは様々な層を含みます、そして、Dockerfileでは、各々の命令または命令はイメージ層をつくります.したがって、私たちのDockerイメージとDockerfileまたは層が再構築されないならば、Dockerはちょうどイメージを構築するためにキャッシュされた層を使用するでしょう.これは、大幅に高速なイメージの再構築をもたらします.
    以下はDocker層キャッシュを利用してnode_modulesをどのようにキャッシュできるかの例です.これは、dockerfileによって複数の状況で実現することができます.


    結論
    この記事では、私たちはDockerのためのベストプラクティスについて議論しました、私はこの記事が役に立ったことを望みます、そして、あなたには質問があるならば、いつものように、私に達するために自由に感じてください.