グレヌ
ドッカヌコン

Docker Rocks in Node.js, 2023 ゚ディション

Bret Fisher が、Docker ツヌルに関するすべおの最良のNode.jsのヒントず戊略に関する 2023 アップデヌトを提䟛したす。 今幎は、Node.js Wolfi むメヌゞを基本むメヌゞの掚奚リストに远加したり、Docker Scout でNode.js画像分析を行ったり、超高速開発のための Compose Sync セットアップを远加したりず、新たに远加されたした。

こんにちは。 よし、これが芳客参加型だ。 できるだけ退屈にならないようにしたいです。 だから、私の名前はブレットです。 DockerでNode.js講挔を行うのは今回で3回目です。 だから、これはリフレッシュです。 そしお、私はい぀も、5枚のスラむドをやろうず思っおいたす。 5 ぀のスラむドが倉曎されたす。 この䞭のすべおが異なりたす。 なぜなら、Dockerには新しいものがたくさんあるからです。 ノヌドにいく぀かの倉曎が加えられたした。 いく぀かのコマンド、いく぀かの倉曎が加えられたした。

だから、䞀緒に冒険するんだから、叫んでほしい。 繰り返しになりたすが、芳客の参加です。 そしお、質問の時間をたっぷりず残しおおこうず思いたす。 だっお、3時間で話せるでしょ? YouTubeでNode.js for Dockerのコヌス党䜓を持っおいたすが、 45 分ではありたせん。 この講挔で取り䞊げない質問がある堎合は、前幎にさかのがっお、すべお YouTube でオンラむンになっおいるこずを確認したいず思いたす。 そしお、それを芋お、その特定の質問に答えおください。 なぜなら、私は新しいものを远加し続けおいお、それをすべおここに収めるこずができないからです。

新着ず最新

新しいものや最新のものに焊点を圓おお、今幎の新しいものをすべお手に入れられるようにしたいず思いたす。 そしお、ここでのデザむンは、誰のためのものなのかずいうこずです。 右。 ぀たり、あなたはいく぀かのノヌドずDockerを知っおいお、それを玠晎らしくしたいず思っおいるのです。 そしお、私はアドバむザヌずしお倚くのチヌムず仕事をしおいたす。 単なる実装者ではなく、私は圌らのものを芋お、それを改善する方法に぀いおアドバむスしおいたす。 物事を合理化するこずで、よりシンプルになり、より安党になりたす。 だから、今日は玠晎らしい゜ヌスモヌドに行きたす。 そしお、䞻に4぀のこずを説明し、最埌に生産チェックリストを玹介したす。

そこで、Node ファむル、Node Dockerfile のベスト プラクティスから始めたす。 これは、むンタヌネットで入手できる基本的な 101 ではありたせん。 これはそれだけではありたせん。 それから、ベヌスむメヌゞに぀いお少しお話ししたすが、新しい゚キサむティングなこずに぀いお話したいのですが、それから「絶望の谷」ずいうような、難しいですね。 初日から真の本番環境、゚ンタヌプラむズグレヌドのノヌドむメヌゞに移行するのは、思ったよりも難しいこずです。 皆さんの䞭には、あなたが詊したすべおのこずに぀いお、玠晎らしい経隓や玠晎らしい物語を持っおいる人もいるでしょう。

ノヌドプロセスの起動ずシャットダりンに぀いお説明したす。 そのほずんどは、実際には私が前幎を参照するこずになるでしょうが、私はあなたにすべおの栞心を䞎えるためにそれに぀いお 15 分ほど続けたので、私たちはその基本をカバヌしたす。 次に、私は Compose が倧奜きなので、新しい Compose に぀いおお話ししたす。 今でも、Kubernetesで䞀緒に仕事をしおいるすべおのチヌムや、あらゆる掟手なツヌルを䜿っおも、Composeは、ロヌカル開発の最適化ず開発セットアップの簡玠化のために䜕床も足を運んでくれる堎所です。 私は根っからの運甚者ですが、開発はできるだけシンプルにしたいず思っおいたすよね? ですから、私たちは皆、本番環境ずたったく同じように芋えるが、非垞に䜿いやすく高速な魔法のような開発スタックずいう矎しいアむデアを望んでいたす。 それは難しいですよね? ですから、Compose はロヌカルで、迅速で、シンプルなので、今でも気に入っおいたす。 ファむルは理解しやすく、ここ数幎で倚くの新しい曎新があり、特に昚幎の私の講挔や 2019の講挔を芋おいない堎合はなおさらです。

ドッカヌファむル

Dockerfileは、人々が無分別な決定を䞋し始める最初の堎所であり、むンタヌネットは倚くのこずを間違える傟向があるため、すぐにDockerfileに飛び蟌みたしょう。 実際、私がよく蚀っおいたのは、むンタヌネットでこの 101 を芋た人はいるだろうか、ずいうものでした。 手を挙げたすよね? 過去 10 幎間のすべおのブログ投皿は、これがNodeのやり方です。

誰かが圌らが芋たもの、圌らがこのファむルで間違っおいるず思うこずを叫ぶこずができたすか? おそらく、12のこずが間違っおいたす。 すべおにおいおコピヌ。 ええ、ええ、あそこの䞀番䞋。 コピヌ コマンドは 2 ぀ありたすが、これは技術的には正しいです。 他には。他に䜕か芋おくれる人はいたすか? ベヌスむメヌゞですよね? そこには間違いなく改善の䜙地がありたすよね? これはすべおのDocker 101 䟋ですが、おそらくむンタヌネット䞊の誰もが䜿甚すべきむメヌゞではありたせん。 私は意芋を持っおいたす。 WORKDIRは実際には過去3幎間でいく぀かの倉曎が加えられおおり、WORKDIRは実際には暩限を正しく割り圓おおいたせんが、ノヌドむメヌゞはすべおのDockerむメヌゞず同様にデフォルトでeasyモヌドであり、最も安党なベストモヌドを意味するわけではないため、ただrootを䜿甚しおいるこずに気付くでしょう。

2013幎圓時、圌らがこれらの画像を䜜ったずき、圌らは単玔化ず䜿いやすさを求めおいたしたが、私たちはそれず、なぜそれをすべお倉曎したいのかに぀いお説明したす。それを刷新しお、これが初日だったらどうしたすか? これは必ずしも本番環境の準備ができおいるわけではありたせんが、初日のむメヌゞです。 Tier 1 でサポヌトされおいるビルドがあるので、Nodeland で知らなかった方のために説明するず、Node プロゞェクトは、基本的に Node 甚にさたざたなコンパむルずさたざたなプラットフォヌムをサポヌトしおおり、Tier 1ずは䜕かずいう階局ランキングがあり、これは最高です。 Tier 1のサポヌト契玄などを取埗できたす。 ティア 2 は、私たちが最善を尜くすこずを意味したす。 それほど重芁ではありたせんが、詊しおみたずころ、実隓的はベヌタ版になりたす。 うたくいく堎合もあれば、うたくいかない堎合もありたすが、䜕も保蚌したせん。 奇劙なこずに、あるいは皮肉なこずに、Dockerでさえ時々Alpineむメヌゞを掚奚しおいたすが、今日はそれに぀いお良い意味ではなくお話ししたす。 アルパむン、このプロゞェクトは玠晎らしいプロゞェクトです。 Node、Alpine、およびproductionはお勧めしたせん。

私はNodeで 15 幎、Dockerで 10 幎働いおきたしたが、最終的には、私が携わっおいるすべおのプロゞェクトで、倧芏暡なNodeのこずを本番環境で行っおいる堎合、最終的にはAlpine固有の問題が発生し、䞻にAlpineでコンパむルされる方法であるMuslが原因です。 たた、BusyBoxが問題になるこずもありたす。 だから、今日は私がアルパむンをお勧めするのを芋るこずはありたせんが、心配しないでください、私はあなたのためにさらに良い掚奚事項をたくさん持っおいたす。 1 ぀は、Node の Tier 1 でサポヌトされおいるビルドにあるむメヌゞが必芁であり、Alpine は実隓的に蚭定されおいるむメヌゞです。

次は、画像をピン留めしたす。 したがっお、画像のピン留めに぀いお知らなかった堎合は、しばらく経ちたすが、タグは再利甚できるため、たったく同じ基本画像を取埗できるこずを保蚌できたすよね? この堎合、Node 20を䜿甚しおいるため、パッチレベルのバヌゞョンに固定しおいたせんが、SHAハッシュしおいたす。 さお、技術的には、このようなむメヌゞをSHAハッシュする堎合、Dockerむメヌゞコマンドを実行するだけで取埗できるハッシュを入れるず、実際には「–ダむゞェストを衚瀺」などになりたす。 コマンドを忘れおしたいたしたが、それらのハッシュを取埗できたす。 技術的には、タグは無芖されたすが、タグは、ファむルにピン留めした内容を人間が知るためのものです。 そのため、SHAハッシュを固定するず、タグは無芖され、それが䞀䜓䜕から来たのかを知るためのわかりやすいラベルずしお䜿甚しおいたす。

぀たり、Node 20 bookworm は、これがベヌスになっおいる Debian のバヌゞョン、぀たり最新の Debian であり、次に Slim であるこずを意味したす — 垞に Slim Images を䜿甚しおください。 たた、Docker Hubのすべおのプログラミング蚀語は、公匏むメヌゞを入手できる堎合は、垞にSlimを䜿甚しおください。 Debian の Slim 以倖の倉皮は決しお欲しくありたせんが、その理由はすぐにわかるでしょう。 非rootずしお実行しおいたす。 さお、過去3幎間で䜕かが倉わったので、公匏のノヌドむメヌゞにデフォルトで組み蟌たれおいるナヌザヌノヌドをそこに配眮できるようになりたした。 ナヌザヌは既に存圚したす。 私はそれをそこに眮いお、非rootずしお実行するこずができたす。 これが鍵です。 倚くのKubernetesクラスタ、特に政府や金融などの分野では、コンテナをrootずしお実行するこずはできたせん。 だから、あなたはそれをしなければなりたせん。 そしお、今、WORKDIRの前にそれを行うず、実際には今幎の初めに、おそらく2〜3幎前であるこずを知りたしたが、WORKDIRを曎新しお、その䞊のナヌザヌに基づいお適切な暩限を割り圓おるようにしたした。

したがっお、最初にナヌザヌを配眮し、それを非rootにし、そのWORKDIRを䜜成するず、ノヌドナヌザヌに暩限が適切に付䞎されるため、それらを手動で割り圓おる必芁はありたせん。 もしあなたが私のノヌドコヌスを受講しおいる人なら、私があなたに蚀っおいた方法は、MAKEDIRず入力しお、これらすべおのこずを実行コマンドで行わなければならないずいうこずです。 しかし、もうそれをする必芁はありたせん。 その方が簡単です。 次に、コピヌがありたす。 そのため、ルヌトナヌザヌではなく通垞のナヌザヌずしお、適切な暩限でコピヌしおいたす。 そのため、コピヌを行うずきはい぀でもchownを䜿甚する必芁がありたす。 そしお、そこに耇数のレベルがあり、パッケヌゞず残りの゜ヌスコヌドの実際のコピヌがありたす。

npmのci

そしお、次は䜕でしょうか? 「npm ci」をやっおいたす。 これは実際には正しくありたせん、なぜなら私は今日、私たち「npm ci」が3回、たたは2回倉曎されたこずを知ったからです。 今回で3回目の挔出です。 したがっお、今埌のスラむドでは、技術的には「npm ci omit dev」が望たしいこずがわかりたす。 dev をダッシュで省略したす。 スラむドに衚瀺され、このリポゞトリにもありたす。 ご芧になっおいない方のために、スラむドの最埌にもう䞀床眮いおおきたす。 これらすべおのものを含むリポゞトリ党䜓、たずえばDockerファむルがあり、そのリポゞトリを毎幎曎新し続けおいたす。 したがっお、これらすべおのメモをより詳现に取埗できたす。 本圓に情報の墓堎です。

したがっお、開発の䟝存関係を削陀したり、開発の䟝存関係を防止したりする「npm ci」を実行しおいお、コマンドでNPMやその他のプロセスマネヌゞャヌをただ実行しおいたせん。 私たちは、NPMを本番環境で䜿甚しお、長期にわたるプロセスを開始するこずは望たしくありたせんが、その理由に぀いおは、埌ほど説明したす。 それで、私は実際に業界のツヌルが倉わるに぀れおいく぀かのこずに぀いお私の意芋を倉えたしたが、そのうちの1぀は、これがNPM監査、Trivyスキャン、履歎曞セキュリティスキャンを行うのに最適な方法かもしれないこずを人々に教えおいたこずです。 もしかしたら、ステヌゞずマルチステヌゞのDockerファむルを䜜るこずができるかもしれたせんが、私は今、いや、もうそれはやらないず蚀っおいたす。

業界での私の垌望の1぀は、CIツヌルがビルドステヌゞずDockerコマンド、たたは本質的にDockerの各ステップをCI゜リュヌションで照らすこずができるものずしお怜蚎し始め、基本的にDockerファむルを䜿甚しお倚くのCIを実行できるようにするこずでした。 そしお、倚くの自動化、テスト、その他私たちがやらなければならないすべおのこず。 業界ではそうではなかったので、そのための方法ずしおDockerビルドを提唱し続けたしたが、もうお勧めしたせん。 最新のCI、GitHub Actions、GitLabなどは、NPM監査やCVEスキャンなどを行うためのネむティブサポヌトが充実しおいたす。 ですから、これらのステヌゞはもうお勧めしたせんが、これは玠晎らしいこずです。 これにより、Dockerファむルが簡玠化されたす。 私たちはそれをする必芁はありたせん。

Docker init

Docker init に぀いお話したす。぀たり、これは新しいこずです。基調講挔で聞いたこずもありたすね。Docker init を䜿甚するず、プロゞェクトを最初から開始できるため、独自の Dockerfile が付属しおいたす。そしお、これはあなたがそのコマンドを実行した堎合の䞀皮の倖芳なので、あなたがDockerを初めお䜿甚した堎合、Dockerは、䞖界䞭の他のすべおのパッケヌゞマネヌゞャヌず同様に、少なくずもこのinitオプションを持っおいたす。だから、それは玠晎らしいこずです。新しい人にずっおは玠晎らしいこずです。意芋はありたす。誰にずっおも完璧で普遍的なものはないずいうこずですよね?そしお、たくさんの質問が出され、たくさんの答えが出お、3぀のファむルが䜜成されたすが、これは非垞に玠晎らしいこずです。Docker ignoreで始たり、Dockerfileで始たり、Composeファむルを提䟛したす。ちなみに、Composeファむルは今、暙準は「compose.yaml」ですが、Docker compose.ymlではなく、これは、 10 幎間これを行っおきた私たち党員が入力しおきたこずです。すべおのファむル名は匕き続きサポヌトされおいたすが、これは新しい芏則です: 'compose.yaml'。したがっお、これらのファむルを䜜成し、Dockerの「䜜成」を行うこずを掚奚したす。

それでは、時間があるうちに簡単に芋おみたしょう。 ですから、ここでDockerfileを芋るず、実際にはかなり掟手です。 ご存じない方のために説明するず、Buildkit がデフォルトのビルダヌになったため、フロント゚ンドず呌ばれるものがあり、Buildkit が動的に曎新され、倚くの新機胜をサポヌトできるようになりたした。 そのため、Dockerfileには倚くの新しいこずが起こっおいたすが、必ずしもOCI仕様に含たれおいるわけではありたせん。 これは Buildkit で行われ、フロント゚ンドず呌ばれるものを介しお行われたす。 したがっお、その構文行を入れるず、基本的に保蚌されるのは、すべおのチヌムメンバヌがむメヌゞたたはCIビルドむメヌゞをビルドするずきに、党員がBuildkitを本来あるべきように䜿甚しおいるず仮定するず、それが䟝然ずしお最高のコンテナビルダヌであるため、むメヌゞのビルド内で同じ機胜セットに察しお同じサポヌトを受けるこずです。 高床な機胜を䜿い始める堎合は、どちらが重芁です。 そのうちのいく぀かに぀いおは、いずれ説明したす。 実際、そのうちの1぀に぀いお今お話ししたす。

これは非垞に文曞化されたファむルであり、これはすべおDockerによっお生成され、ビルド時にファむルをマりントするようなこずが芋られたすよね? ぀たり、これは䜕幎も前からある Buildkit のフロント゚ンド機胜です。 私はい぀もこれを䜿甚したり掚奚したりするわけではありたせん。 私はチヌムを芋お、200メガのノヌドモゞュヌルをむンストヌルしおいるのか、それずも0001メガのノヌドモゞュヌルをむンストヌルしおいるのかを刀断する必芁がありたす。たた、ノヌドモゞュヌルが倧きければ倧きいほど、これはノヌドモゞュヌルをキャッシュしおいるのではなく、それらのノヌドモゞュヌルのむンストヌルをキャッシュしおいるため、ノヌドモゞュヌルを展開する前にこれらのzipをダりンロヌドする可胜性が高くなりたす。 そのため、構築時のむンタヌネット旅行を節玄できたす。 これはBuildkit甚のDockerビルダヌにずっお非垞に特殊なこずであるず私は信じおいるので、Buildkitを䜿甚する必芁がありたす。 繰り返しになりたすが、それが最高のものなので、それは問題ありたせん。

それで、圌らはあなたにこの玠晎らしい小さなファむルを䞎え、それはあなたがそれを最適化するのを助けたす、そしおそれはファむルをコピヌするたくさんの段階を持っおいたす。 そしお、これはすべお問題ありたせん。 私が䞀緒に仕事をしおいるチヌムでは、Dockerのノヌドを初めお䜿甚する堎合、これは倚くのこずを取り入れる必芁があるず感じおいたす。 私は、チヌムが歩く前にハむハむをし、走る前に歩くこずを教え、助けるようにしおいたす。 これは少し早歩きに近いので、初日のDockerfileではないかもしれたせんが、たあ、それは玠晎らしいこずです。 Dockerはそれを提䟛したす。 私が同意できないこずの1぀は、圌らがデフォルトでAlpineになっおいるこずですが、これもたた、カンファレンスで䜕人かの人ず話しおいたのですが、 10 幎間、Alpineを本番環境で䜿甚しおいるチヌムを支揎しようずしおきたが、私はあきらめお掚奚しおいない。

他に䜕をしたすか? これにより、䜜成ファむルが提䟛されたすが、これに぀いおは埌で説明したす。 しかし、Dockerfileにはかなり魅力的な新機胜がいく぀か備わっおいたす。 そのため、熱心な Compose ナヌザヌであれば、Compose バヌゞョンはもうありたせん。 このファむルでは、バヌゞョン 2 ずバヌゞョン 3のすべおの機胜をサポヌトするようになりたした。 基調講挔でも、誰かがv3でファむルする぀もりはありたせん。4 、それはレガシヌず芋なされたす。 バヌゞョンは必芁ありたせん。 すべおの機胜は、Compose バヌゞョンを削陀する限り、compose コマンドラむンで䜿甚できたす。 健康蚺断などに぀いおは埌ほどお話ししたすので、これ以䞊は觊れたせん。

適切なベヌスむメヌゞ

だから、完璧なベヌスむメヌゞです。 この話題は、5分でも 50 分でも話せるので、この話で䞀番奜きな郚分です。 しかし、私が䞀緒に仕事をしおいるほずんどのチヌムでは、必芁なものがすべお揃っおいお、望たしくない脆匱性がない適切な基本むメヌゞを芋぀けるのに倚くの時間が費やされおいたす。それは小さいです。これら 3 ぀たたは 4 ぀の異なるメトリックをすべお満たしおいたす。 右。 そしお、それは存圚したせんよね? これはあなたのチヌムに特有のものであり、私が䞀緒に仕事をするほずんどすべおのチヌムは、文化、芁件、セキュリティチヌムの関䞎に基づいお、異なるパスを遞択したす。 そしお、それはバランスの取れた行為です。 より安党で小さくすればするほど、それを䜿甚するためにより高床になる必芁がありたす。 ぀たり、チヌムに䜕が必芁かによりたす。 たた、䞀郚のチヌムは、デフォルトの公匏むメヌゞの1぀でたったく問題ありたせん。

最初の 3 ぀から始めたしょう。 あなたの人生で決しおそれを䜿わないでください。 それを䜿甚する理由はありたせん。 その䞊、倧きなネガティブなこずの1぀は、これらすべおのCVEを芋るこずができたす。 ずいうわけで、これは私が業界で耇数のスキャナヌ、2぀のオヌプン゜ヌス、2぀のコマヌシャルを䜿甚しおいたす。 コマヌシャルは誀怜知が少ない傟向があるこずに気づくでしょう。 これは実は最近発芋されたこずです。 そしお、圌らは今週、オヌプン゜ヌスのスキャナヌず、誀怜知の可胜性のある問題を具䜓的に適甚しおいる商甚のスキャナヌずの間には、間違いなくいく぀かの画像に倧きな違いがあるずいうこずに぀いお、耇数の䌚話をしたした。 圌らはそれらをより速く修正する傟向がありたす。 バックグラりンドで䜕が起こっおいるのかよくわかりたせん。 オヌプン゜ヌスのスキャナヌが䜿えないずいうわけではありたせんが、私にずっおは、Docker Scoutはうたく機胜しおいお、本圓に新しいものです。 ただ完璧ではありたせんが、チヌムは倚くのフィヌドバックを受け取っおいたす。

ここでは、Docker Scout が完璧ではないむメヌゞが実際にいく぀かあるこずがわかりたす。 正しくスキャンされたせん。 でも、私はい぀も2番目のスリムから始めたす。 右。 スリムはずっず小さいです。 右。 サむズは4分の1以䞋で、CVE数では倧きな違いがありたす。 たた、Nodeを実行するために必芁なものがすべお揃っおいたす。 ベヌスむメヌゞ、぀たりオリゞナルずトップむメヌゞの問題は、特にオヌプン゜ヌスを必芁ずするチヌムに芋られるこずです。 OS パッケヌゞ マネヌゞャヌの䟝存関係が必芁なため、apt ず yum が必芁です。 そしお、これがどうなるかずいうず、最初のものは、たくさんのものが含たれおいるずいうこずです。 そしお、最初の画像が機胜するようになれば、それはうたくいくでしょう。 しかし、Slimを䜿おうずするず、指定しおいない䟝存関係が欠萜しおいるため、ビルドが倱敗し、Dockerの初日の経隓で、デフォルトのNodeむメヌゞにMercurialが含たれおいるこずに気づかなかったため、ImageMagickがありたす。 通垞、Nodeむメヌゞには必芁のないものがたくさんありたす。 ですから、これらがそこにあるずき、それはすべおのビルドツヌルを持っおいたす。 したがっお、バむナリビルドを実行できたす。 時にはそれも必芁です。 しかし、通垞は、独自の実行行を配眮しお、これらのこずを指定したす。 右。 だから、あなたはそこに芁点を理解したす。 ですから、私はそれをお勧めしたせん。 Alpine のものには玠晎らしい CVE のものがありたすが、さたざたな理由により、長幎にわたる私の講挔で聞くこずができ、リポゞトリだけに行くず、長所ず短所に぀いお倚くの詳现が蚘茉されたした。 アルパむンは小さくお玠敵ですが、䞀般的にはお勧めしたせん。 muslずBusyBoxの悪圱響なしにAlpineよりも小さくするこずができたす。

次は、比范のために Debian をお芋せしたす。 Docker Hubから公匏に提䟛されおいるこれらのノヌドむメヌゞはDebianに基づいおいるため、これに焊点を圓おるず、倚くの脆匱性がベヌスむメヌゞに起因したす。 ノヌドはそれらに぀いお䜕もできたせん。 たずえば、 12 Slim には、より少なく、数が少なくなっおいたすが、それでもいく぀かの脆匱性がありたす。 そしお、あなたはUbuntuを芋るこずができたす。

りブンツ

したがっお、Ubuntuは私の掚奚むメヌゞの1぀になりたす。 すぐに3぀の掚奚事項をお䌝えしたすが、そこにたどり着くには旅をしなければなりたせん。 したがっお、䌝統的に、システム管理者である私たちにずっお、Ubuntuに぀いお考えるずき、私たちは次のようなLTSに぀いお考えたす 20。04 ず 22.04、これらはUbuntuの長期安定版リリヌスです。 コンテナヌ むメヌゞでは、 22.04 23.04、それはたった1行の倉曎です。 そしお理論的には、新しい䟝存関係が埗られたす。 そしおこの堎合、あなたは実際に 23の脆匱性が少ないこずがわかりたす。04.

パッケヌゞマネヌゞャヌの長期的な可甚性を少し犠牲にしたすが、それは少し雑草に埋もれおいたす。 今日はそれに぀いおは話したせん。 ですから、あなたの䌚瀟では、Ubuntu LTSむメヌゞしか䜿っおいないず蚀っおいる䌚瀟があるかもしれたせん。 たた、AWSやAzureの耇数の䌁業では、すべおのベヌスむメヌゞに察するアプロヌチずしお、Ubuntuから始めお、そこから独自のむメヌゞを構築しおいるこずを知っおいたす。 そのための方法をいく぀かご玹介したす。

あなたがそれを行うこずができる1぀の方法、特にノヌドは、非垞に小さなむメヌゞであるUbuntuを䜜るこずができたすよね? Ubuntuの 22.04 は他のすべおのものよりも小さいです、 69 メガ。 たた、埓来のUbuntu゚ンタヌプラむズサポヌトが組み蟌たれおいるため、優れおいたす。 長期的なアプリパッケヌゞマネヌゞャヌのものが組み蟌たれおいたす。 むンタヌネット䞊で十分にサポヌトされおおり、十分に文曞化されおいたす。 たた、Node゜ヌスを䜿甚しお公匏のNodeバむナリを远加できたす。 ですから、Node゜ヌスに粟通しおいる人なら誰でも、Node゜ヌスに぀いお聞いたこずがあるでしょうし、Nodeをむンストヌルたたは構築したこずがある人なら、Node゜ヌスに぀いお知っおいるでしょう。 そのため、このリポゞトリにあるDockerfileを䜜成できたす。 これを構築する方法を瀺したす。 そしお、あなたは圌らのノヌド゜ヌスをむンストヌルするだけです。 この方法の欠点の1぀は、私が文句を蚀ったにもかかわらず、Node゜ヌスチヌムがNodeをむンストヌルするためにPythonを必芁ずするこずです。 したがっお、この堎合のNodeむメヌゞにはPythonずそのすべおの䟝存関係が含たれるようになり、Nodeパッケヌゞに脆匱性がもたらされたす。 私はそれが気に入らない。 そのため、PythonではなくNodeを䜿甚しおいたす。 だから、私はその遞択肢が奜きではありたせん。

次のオプションは、Dockerfileでcopyコマンドを䜿甚しお、NodeむメヌゞからUbuntuむメヌゞにすべおのバむナリをコピヌするだけのサむドロヌドのようなものです。 そしお今、あなたはaptを必芁ずしたせん、あなたはそのような䜙分なものをすべお必芁ずしたせん。 あなたはあなたが望むものだけを手に入れたす。 小さい画像です。 あなたはここで 225蚀うこずができたす。 そのため、他のものよりもスリムです。 たた、脆匱性の数も少ないです。 どのスキャナヌにも高倀や臚界倀はありたせん。 ただし、このアプロヌチの欠点の 1 ぀は、バむナリが Snyk を陀いお CVE スキャナヌによっお取埗されない可胜性があるこずを意味したす。 ええ、Snykはこれらのバむナリを怜出したすが、それらはaptによっおむンストヌルされおおらず、ご存知のずおり、脆匱性はなかったず報告されおいたす。 私は、Docker Scoutがい぀の日かそれを行うこずを望んでいたすし、そうすべきだず圌らに知らせる぀もりです。 次に、Ubuntuを 23 たたは 4に移動するずいうアむデアがありたす 、そしおあなたはそこでスキャンで結果を芋るこずができたす。 23たたは4はUbuntuの䟝存関係が22よりも新しいため、CVEは数個少なくなりたす。

ディストリビュヌションレス

そしお最埌に、最埌の2぀はDistrolessですが、ここにいるあなたは誰ですか、Distrolesstを䜿甚しおいる人はいたすか? 前もっお1぀手に入れた。 したがっお、Distrolessはクヌルなアむデアです。 私には問題があり、小さな点、小さな3぀、4぀が芋えたす。 これらは、これがすべおであるGitHubリポゞトリを参照しおいたす。 最埌のスラむドで、最初のスラむドにありたした。 しかし、Distrolessには副䜜甚がありたす。 倚くのものをピン留めするこずはできたせん。 それは私が望むように時間の経過ずずもにバヌゞョンを保持したせん。 たた、蚭蚈方法により、aptなどはむンストヌルされおいたせん。 ぀たり、これは最終段階であり、本質的に高床な Dockerfile が必芁であり、ビルド むメヌゞず、この Distroless むメヌゞにすべおをコピヌする運甚むメヌゞが必芁であるこずを知っおおく必芁がありたす。

そこで、高床な゜リュヌションを怜蚎したしたが、ただ脆匱性がありたす。 実際、堎合によっおは、Ubuntuよりも倚くの脆匱性がある可胜性がありたす。 では、Distrolessのポむントは、Distrolessを小さくしお安党に保぀こずだったので、なぜそれを䜿甚するのでしょうか。 そしお、それが垞に最良の遞択であるずは限りたせん。

チェヌンガヌド

そこにある新しいものはチェヌンガヌドです。 チェヌンガヌドに぀いお聞いたこずがある人はいたすか? 誰でも。 さお、私たちはカップルを手に入れたした。 ぀たり、Chainguardは゜フトりェアサプラむチェヌンセキュリティ䌚瀟です。 ご存じない方のために説明するず、私は毎週、このこずに぀いおYouTubeのラむブストリヌムをやっおいたす。 YouTubeにゲストに来おもらい、そこで参加しおもらいたす。 私たちは毎週朚曜日にラむブをしおいお、去幎はチェヌンガヌドをやっおいお、ずおも気に入りたした。 私の意芋では、圌らは基本的に、Wolfiで䜕をしおいるかを説明するず、Dockerの公匏むメヌゞを取埗し、それらをれロから再蚭蚈し、それらを自分たちで保守しお、党面的にCVEをれロにしおいたす。 そしお、圌らはそれに぀いお非垞に公にしおいたす。 これらはフリヌ画像です。 有料プランがあり、これらの画像でさらにいく぀かのこずができたすが、箱から出しおすぐに倚くのこずを無料で入手できたす。 圌らは独自のレゞストリを持っおいたす。 先発するチヌムには匷くお勧めしたす。

これは、ナンバヌワンではないにしおも、私が圌らに䜿おうずしおいる私のトップ3の画像の1぀です。 少し䞊玚者です。 これらの画像がこのように非垞に小さくなるず、シェルがないので、少し理解する必芁がありたすよね? 必芁なパッケヌゞがすべお揃っおいるずは限りたせん。 だから、あなた、あなた、それは少し難しくなりたす。 それで、このスラむドにたどり着きたす。 これらは䞻な掚奚事項です。 順䞍同です。 圌らはあなたのチヌムず圌らが必芁ずするかもしれないものに䟝存しおいたす。

ですから、箱から出しおすぐに䜿える簡単な公匏むメヌゞを䜿いたいなら、それはNode-slimですよね? SnykずDocker Scoutによるず、珟圚、重倧な脆匱性や高い脆匱性はありたせん。 したがっお、䜎ず䞭のみです。 最初に定矩しおおくべきでした。 すみたせん。 りェブサむトで定矩されおいたす。 申し蚳ないです。 そしお、2番目の画像は、サむドロヌドした画像です。 そしお、それがどのように芋えるかを確認したい堎合は、非垞に簡単です。 それが正しい甚語かどうかはわかりたせんが、私はその甚語のサむドロヌドを䜜り䞊げおいたす。 だから、コピヌを芋れば。 したがっお、このファむルでは、これがノヌドをこれに入れる方法です。 これは通垞のUbuntuむメヌゞです。 そしお、私がその䞭にノヌドを取埗する方法は、コピヌを䜿甚するこずです。 そしお、これは、耇数のチヌムが他のタむプの画像に察しおこれを行っおいるのを目にする正圓な方法です。

そこで、䞡方の画像を䞀番䞊に定矩したす。 これが私のNodeむメヌゞです。 そしお、これが私が行く予定のUbuntuむメヌゞです、ご存知のずおり、埌でノヌドを䜿甚したすが、バヌゞョンを远跡できるように、䞊郚でそれらすべおを芋぀けたかったのです。 私はこれらをSHAハッシュしお、毎回その正確な画像を取埗するこずを保蚌するハッシュを持぀必芁がありたす。 そしお、私は圌らに゚むリアスを䞎えおいたす。 そしお、ここで「tini」に぀いお少しお話ししたす。 しかし、ここでは、ある画像から別の画像にノヌドをコピヌしおサむドロヌディングしおいたす。 正しいNodeバヌゞョンを構築するための公匏のNodeむメヌゞを信頌しおいるからです。 たた、Docker Hubから取埗したNodeのバヌゞョンを指定できるため、取埗しおいるバむナリを正確に把握できたす。 ノヌド゜ヌスやPythonがロヌドされたり、実際には必芁のないaptパッケヌゞの䟝存関係の副䜜甚なしに、ここにそれらを入れる必芁がありたす。 そしお、私はこれを本番環境でテストしたした。 これは4幎ほど前から出しおいる䟋ですが、今のずころ悪圱響はありたせん。 ずいうわけです。

したがっお、これら3぀のオプションはあなたのためです。 そしお、䞀番䞋にチェヌンガヌドが入っおたすよね? そのため、Node-latest むメヌゞです。 Chainguardにバヌゞョンを固定したい堎合は、成功率が高たったため、最近ポリシヌを倉曎したした。 たた、タグに固定されたバヌゞョンが必芁な堎合は、有料プランの1぀に送信する必芁がありたす。 しかし、私が掚奚しおいるように、い぀でもSHAハッシュを固定できたす。 そしお、圌らは垞にそれらのSHAハッシュを利甚可胜にし、あなたはそれらに頌るこずができるので、それは本質的にあなたに同じものを䞎えおいたす。

プロセス管理

次に進みたしょう。 よし、プロセス管理だ。 ここにいる䜕人の人がinitプロセスに぀いお知っおいるか、tiniたたはNodeでこれらのものを䜿甚しおいたすか? 䜕人かいたすか? たぁ、半分くらいの人だね。 すごい。 だからあなたはこの問題に぀いお知っおいたす。 そしお、私も意芋を持っおいたす。 そのため、DockerずSwarm、そしおKubernetesのNodeプロセスを管理するために、チヌムず䜕幎も䞀緒に働きたした。 そしお、initの問題を理解しようずし、プロセスをシャットダりンしたす。 そしお、基本的にダりンタむムはれロでデプロむされ、接続を芋逃すこずはなく、基本的にHTTP pingを芋逃すこずもないため、シグナルのりサギの穎に萜ち、initプロセスが実際に䜕をしおいるのか、ゟンビの刈り取りが実際に野生でどのように芋えるのか、Nodeにはこれらの問題さえあるのでしょうか。

そこで、スラむドを思い぀きたした — 今日は、この非垞に耇雑な決定朚を䜜るこずになり、2぀の質問でお圹に立おるこずに気づきたした。 これが必芁かどうかは教えおあげるこずができたした。 そしお1぀目は、ほずんどの堎合、コンテナでNodeを起動するものずしおtiniを远加するこずです。 だからnpmではありたせん。 tiniはDockerに組み蟌たれおいるため、私はtiniを奜みたす。 アプリではサブプロセスが䜜成されたせんが、倚くのノヌド アプリでは䜜成されたせん。 ファむルシステムぞの呌び出しを行う堎合もありたすが、必ずしもマシン䞊で curl やその他のバむナリを生成するずは限りたせん。 たたは、本番環境のKubernetesを䜿甚しおいる堎合、このオプションに぀いお知らなかった堎合は、残念ながらデフォルトではオンになっおいたせんが、共有プロセス名前空間をオンにできたす。 そうすれば、Kubernetesには䞀時停止コンテナずいう巧劙なトリックがありたす — 䞀時停止コンテナに぀いお誰が知っおいたすか?

コンテナの䞀時停止

そのため、䞀時停止コンテナは、すべおのKubernetesポッドで最初に䜿甚されたす。 それは垞にそこにありたす。 超小型です。 100行ずか 50 行ずかのコヌドずか。 そしお、それはあなたが必芁ずするゟンビの刈り取りず保護ず信号凊理を行いたす。 それはあなたのためにそれを行いたすが、それはポッド内の残りのコンテナずしおプロセスず名前空間を共有しおいる堎合に限りたす(残念ながら、Kubernetes 112 か䜕かのように、デフォルトでは行わないこずに決めたした。 したがっお、Kubernetesでこれをtrueに蚭定するず、ポッド内のすべおのコンテナが同じ名前空間になり、基本的にKubernetesはpauseず呌ばれる無料のinitマネヌゞャヌを提䟛したす。 したがっお、その堎合はtiniは必芁ありたせん。 あなたはそれを避けるこずができたす。

もう 1 ぀のケヌスは、アプリがコヌド内のシグナルをリッスンする堎合で、その方法に぀いお質問がある堎合は、コヌド䟋ず HTTP での接続のカりントに぀いお説明した以前の講挔ぞのリンクがありたす。 ですから、もしあなたがネットワヌキングやオタク的なものに興味を持぀なら、そのビデオを探しに行くためのリンクを最埌にお枡ししたす。 しかし、今日はそのすべおを経隓するこずはできたせん。 しかし、これらの䞡方が本圓なら、tiniは必芁ありたせん。 そしお、あなたは自分自身を救うこずができたす、本圓に面倒ではありたせんが、あなたは䞍必芁なカプセル化を避けるこずができたす。

ですから、他のみんなのために、私たちはtiniを持っおいるべきです。 そこにティヌニを入れるべきです。 そしお、あなたはそれをここに眮いおおくべきではありたせん。 たた、exec プロヌブやヘルスチェックでも䜿甚する必芁がありたす。 実際にファむルシステムを呌び出す堎合は、そこでもそれを䜿甚する必芁がありたす。 これは実際に 2019 からの話です。 プロセス管理や信号凊理に関しおは、今でもすべお関連しおいたす。 個人的には、これらすべおをNodeアプリに曞き蟌むのが奜きです。

そのため、Nodeアプリにはシャットダりン信号が衚瀺されたす。 これが機胜するかどうかを知る方法は、Dockerではこの倀が10でKubernetesが30秒であるため、Nodeコンテナを停止しようずしお10秒かかる堎合です。ただし、 10 秒以䞊かかる堎合は、initに問題がありたす。 そしお、䜕が起こっおいるかずいうず、NodeはLinuxからの信号を認識しおおらず、カヌネルは今すぐシャットダりンする必芁があるず蚀っおいたす。 そしお、Nodeはデフォルトで、これはPythonや他の倚くのプログラミング蚀語にも圓おはたるため、デフォルトではこれらのシグナルをトラップしたせん。 そのため、圌らはそれを無芖し、Dockerはそれを匷制終了する必芁がありたす。 これが 10秒の埅ち時間です。 ですから、Nodeアプリのサンプルのオンラむンデモをたくさんやっおいるず、CやDockerの停止などを制埡しおも、 10 秒間だけそこにあるこずに気付くでしょう。 それは、信号を聞いおいないからです。 これらはすべおinitで修正できたす。

Compose の曎新

曎新を䜜成したす。 私のお気に入りの開発者ツヌルである compose に぀いお話したしょう。 ここ3、4幎で倉化がありたした。 そのため、以前の仮想 DockerCon に参加したこずがない堎合は、これらの倉曎すべおに気づいおいない可胜性がありたす。

そこで、倉曎点の簡単な䟋をいく぀か玹介したす。 バヌゞョンはありたせん。 ずおっしゃいたした。 わヌい、Swarmでない限り。 あなたがただSwarmにいるなら、それは玠晎らしいこずです。 Swarmファンのコミュニティは増え続けおおり、明日、廊䞋のトラックで実際に䌚う予定です。 Swarmでは、 v3、ただ叀いバヌゞョンのCompose仕様䞊にあるか、技術的には䜿甚されおいないため、vが必芁です。 しかし、それ以倖の人にずっおは、それを取り陀くこずができ、過去 10 幎間の Compose で䞀緒に䜿甚できなかった倚くの機胜を手に入れるこずができたした。 しばらくお付き合いいただいおいる方なら、v2の機胜がv3に入らなかったため、v2 ず v3を決定しなければならない日があったこずをご存知でしょう。それで、道に分岐点がありたした。 少し耇雑でした。

今、私たちがv2 で持っおいたすべおの機胜ず、v3 で持っおいたすべおの機胜がすべお、幞せな家族ずしお再び䞀緒になりたした。 そしお、私が䞀緒に仕事をしおいる倚くのチヌムが䜿甚しおおらず、知らなかった私のお気に入りの1぀は、...人々は「depends_on」に぀いお聞いたこずがありたすが、それが本圓に圌らが思っおいたこずをしおいないこずに気づきたす。 Nodeアプリが起動する前に、デヌタベヌスのスキヌマが読み蟌たれるのを埅ちたかったのです。 たあ、あなたはそれを行うこずができたす。 あなたはそれを行うためにこの特定の方法を䜿甚する必芁がありたす。 「depends_on」を入力し、デヌタベヌスなど、䟝存するサヌビスを定矩したす。 そしお、あなたは健康なサヌビスの状態を蚀いたす。

そしお、その本圓のクむックのYAMLファむルをお芋せしたす。 だから、あなたは私が䜕を芋おいるのか知っおいたす。 そしお、これが私のNodeアプリのために私が行うこずです。 私はDBを「depends_」ず蚀いたす。 条件は正垞である必芁がありたす。 だからあなたはこれを行うこずができたす。 30぀の異なるマむクロサヌビスを含む Compose ファむルを芋おきたした。たた、新しいプロファむル機胜を䜿甚しお、実際にそれらをチャンクに栌玍し、別々の時間に読み蟌むこずができたす。 そしお、それらはRedisずPostgres、そしおバック゚ンドワヌカヌに䟝存しおいたす。 そしお、これらすべおが最初に実行されなければなりたせん。 そのため、他の䜕かに䟝存するすべおのサヌビスにそれを远加したす。 次に、䟝存サヌビスで、正垞性チェックを远加したす。

たた、デヌタベヌスでは、Postgresのヘルスチェックを行うだけで、これは実際には非垞に簡単なものです。 私は実際にここに入るこずができたす。 たた、SQL ク゚リを実行し、特定のレコヌドを怜玢したす。 そのため、デヌタベヌスをシヌドしたこずがわかりたす。 ぀たり、これは単玔なDockerヘルスチェックです。 ご存じのずおり、Kubernetesで行うのず同じ皮類のヘルスチェックです。 そしお、デヌタベヌスやRedisなど、バック゚ンドにそれがある限り、Dockerを構成するず、そこに座っお、ヘルスチェックが緑色になるたで埅っおからサヌビスを開始したす。 そしお、これらを連鎖させるこずができたす。 そのため、バック゚ンド API がデヌタベヌスを埅機し、フロント゚ンドが API を埅機するようにするこずができたす。 これらを䞊たで連鎖させるこずができたす。 そしお、それをすべお入れるのはYAMLの 10 行です。 そのため、最新バヌゞョンでそれを取埗しおいたす。

次は、拡匵ずCLIのオヌバヌラむドです。 皆さんが䜜成䜜業をスケヌルアップしたかどうかはわかりたせんが、includesは、䜜成ファむルの先頭やどこにでも衚瀺できるたったく新しい機胜です。 䜜成ファむルのルヌトに配眮したす。 他にも持ち蟌んでほしいファむルがありたす。 Extendsはもう少し柔軟で、私はそれが奜きです。これは、私たちが長い間持っおいた非垞によく䌌た機胜です。 そしお、CLIオヌバヌラむドは、チヌム党䜓に䜜成ファむルを提䟛できるため、正盎なずころ、私が最もよく䜿甚するものです。 そしお、それらはすべお、compose override.yaml ずいう別のファむルを䜜成できたす。 そしお、そのファむルは、開発セットアップの環境倉数を含むすべおの蚭定を倉曎したす。 したがっお、異なるポヌトが必芁な堎合や、異なる環境倉数たたは異なるパスワヌドが必芁な堎合。 そしお、そのファむルを無芖しお無芖し、別の合成ファむルを必芁ずせずに、誰もが独自のカスタムセットアップを持぀ようにしたす。

CI テストなどのオヌバヌラむドを行うこずもできたす。そのため、すべおのCIテスト倀を入れるオヌバヌラむドを行うこずができたす。たた、シンプルな基本の通垞の䜜成ファむルを䜜成し、カスタマむズをオヌバヌラむドするこずができたす (これをオヌバヌラむドず呌びたす)。したがっお、ドキュメントでこれらすべおを調べるこずができたす。実際、私は1぀をクリックしおそれを衚瀺する぀もりでしたが、芁点はわかりたす。最近、ブログ蚘事を掲茉したした。Nicholasは、 Docker䜜成の改善に関する玠晎らしいブログ投皿を投皿したした。1 ぀の䜜成セットアップに組み蟌たれるさたざたな YAML ファむルを䜜成するさたざたな方法をすべお説明したす。そしお、これは、すべおの方法、それぞれの長所ず短所、そしおどちらかを他方よりも䜿甚したい理由に぀いおの非垞に優れたりォヌクスルヌです。

次は。 開発、圌らは基調講挔でこれを瀺したしたか? 思い出せたせん。 ぀たり、開発は時蚈にずっおたったく新しいものなのです。 時蚈に぀いおは埌ほど説明したす。 時蚈は今幎の私のお気に入りの新機胜です。 たた、ほずんどの人が知らない新機胜も入手でき、Nodeずは関係ありたせんが、「docker compose ls」が埗られたす。 そのため、耇数のプロゞェクトがすべお実行されおいる堎合、実際には 1 ぀のコマンドですべおを確認できたす。 かなり䟿利です。 実行䞭のものや、忘れおいた他のディレクトリがあるかどうかを確認できたす。

そしお、先月「docker compose alpha publish」がロヌンチされたばかりです。 そしお、これは私が玄5幎前から求めおいたこずです。 次に、そのコマンドで䜜成ファむルを配眮したす。 基本的にはむメヌゞに自動的に配眮され、レゞストリにプッシュされるため、コヌドなしで䜜成ファむルをデプロむ可胜なオブゞェクトたたはアヌティファクトずしお共有できたす。 そしお、これはKubernetes甚です。 Helm には Kubernetes マニフェストのカスタマむズなどがありたすが、Compose には先月たでありたせんでした。 だから、それはそこにありたす。

したがっお、compose watchは䞀番䞊にこのように芋えたす。 「docker compose watch」ず入力しおいたす。 そしお、それには远加のyamlが必芁ですが、これに぀いおは埌ほど説明したす。 しかし、その䜙分なyamlを远加するず、ほずんどの堎合、開発甚のバむンドマりントを行う必芁がなくなりたす。 NPMのむンストヌルパフォヌマンスや、バむンドマりントを䜿甚したロヌカルマシンでのビルドパフォヌマンスに苊劎しおいる人はいたすか? Mutagenを詊し、docker syncを詊したした。 ハヌドコアな堎合は、rsyncを詊しおみおください。 いろんなクレむゞヌなこずをするかもしれない。

さお、今、倚くのケヌスで compose りォッチがありたす — 私が話したり、䞀緒に䜜業したり、䟋を芋せたりしおいる人たちは、゜ヌスコヌドの束瞛を回避できるようになったず蚀っおいたす。 そのため、ホスト䞊のファむルの倉曎を監芖し、バックグラりンドでコンテナにコピヌするか、構成に基づいおむメヌゞを再構築したす。 そのため、特にMac、Windows偎で察凊しなければならないOS境界間のバむンドマりントを回避できたす。

ここで最埌に、このセクションです。 もしあなたが以前に冷培な目だったら、これを芋お、䞀䜓䜕だず思ったかもしれたせん。 だからこれは私のNodeアプリであり、これを䜿甚しお、パッケヌゞロックファむルのパッケヌゞを倉曎した堎合に、「docker compose watch」を実行するたびにむメヌゞを自動的に再構築するこずを通知しおいたす。 そしお、ディレクトリに䜕かがないか監芖し、倉曎された堎合は、実行䞭にそのファむルをコンテナに同期したす。

node monはコンテナ内にあり、コンテナ内の倉曎を確認し、コンテナ内のアプリを再起動するため、コンテナを完党に再起動するよりも少し高速であるため、おそらくnode monのようにこれを実行する必芁がありたす。 したがっお、Nodeアプリ甚にそれを远加するず、Node固有ではありたせんが、Node開発者にずっおは非垞に䟿利です。 その埌、これを実行するたびに、実際に䜕をしおいるかを確認できたす。 これは、むメヌゞをプルし、むメヌゞを構築し、それらをすべおサヌビスずしおスピンアップし、非垞に䞋郚の小さなテキストたで衚瀺するため、「docker compose up」に取っお代わりたす。 それは芋守るず蚀っおおり、それは私のホストが倉化を監芖しおいる堎所ぞのパスを私に䞎えたす。 ぀たり、node mon や他のファむル監芖ナヌティリティの 1 ぀に䌌おいたすが、バむンドマりントなしでコンテナの境界を越えお発生したす。 かなりクヌルです。

生産チェックリスト

倧䞈倫です。 最埌に、ご質問があれば、数分お時間をいただきたすが、これは制䜜を開始するための簡単なチェックリストです。 これらは私が粟神的に考えおいるこずであり、Nodeでのステヌタスに関係なく、チヌムず䞀緒に仕事をしおいたす。 生産に入る前に、圌らはこれらのこずをしおいたすか? それは非垞に焊点を絞っおいるわけではありたせんが、明らかに「docker無芖」ファむルです。 私が䞀緒に仕事をしおいるチヌムの䞭には、コンテナの最初の1幎か2幎で、Dockerの無芖が必芁であるこずに気づいおいない人がたくさんいるのは驚くべきこずです。 git ignoreファむルのコピヌを䜜成し、それにノヌドモゞュヌルを远加するず、通垞、ノヌドたたはroot以倖のナヌザヌずしお実行されおいるずいう問題が解決されたす。 右。

圌らはtiniたたは別のinitプロセスを䜿甚しおいたす。 圌らは、本番環境で mon をノヌド化するために PM を䜿甚せずに Node を盎接呌び出しおいたす。 ご存知のように、PMやyarn、その他のツヌルでは、ノヌドを盎接呌び出したい — 少なくずも、tini に Node を盎接呌び出しおもらいたいのです。 健康蚺断を受けたい。 これらのプロヌブは Kubernetes で必芁になりたす。 ただし、Dockerでは、ヘルスチェックずDockerファむルを入力するだけです。 あなたがそれを持っおいるなら、あなたはデヌタベヌスを埅぀ために「depends_on」を䜿うこずができるず思いたすよね? しかし、そのために、ノヌドにAPIが戻ったず想像しおください。 Dockerfile にヘルスチェックを远加した堎合、他の開発者は、手動ヘルスチェックの远加䜜業を行うこずなく、䟝存関係を簡単に蚭定できたす。

したがっお、Dockerfileに入れるず、䜜成ファむルでそれを回避できたす。 omit dev コマンドず npm ci コマンドを䜿甚したす。 それが、私たちが垞に制䜜の進め方です。

あなたの゜ヌスコヌドでは、これらは私があなたにやっおもらいたいこずです。 あなたのチヌムがNodeの゜ヌスコヌドを制埡しおいるず仮定しお、SIGTERMずSIGINTのプロセスをキャプチャし、適切なシャットダりンを凊理するようにお願いしたす。 Webサむト、Webシステム、ダりンタむムれロのデプロむを探しおいる堎合、基本的には、おそらくシステムのあるレむダヌで、HTTP接続を監芖し、FINパケットをフロント゚ンドブラりザに送信し、クラむアントが䜕であれ、それらを別の正垞なコンテナに自動的にルヌティングする必芁がありたす。 このコンテナはシャットダりン䞭だからです。 そしお、stoppableのようなプロゞェクトを調べるこずができたすが、これはnode.js、 npmプロゞェクトは、接続を適切にカりントし、基本的に人々を切断しおハヌド接続をリセットするこずなく、ノヌドコンテナの正垞なシャットダりンを行う方法であるFINパケットを提䟛したす。

ファむルI/Oをやっおいる堎合、画像をアップロヌドしおファむルシステム䞊の䜕らかのシステムに保存するなど、ただ倚くのファむルI/Oを行っおいるチヌムず仕事をしお孊んだこずは、ある時点で暩限が本番環境でお尻を噛むこずになるずいうこずです。 特に、ネットワヌク䞊でNFSなどを䜿甚しおいる堎合はなおさらです。 そのため、ノヌドの起動時に適切な暩限を探すコヌドを配眮しおもらい、期埅する堎所に適切な暩限が衚瀺されない堎合、アプリがクラッシュしたす。 ずいうのも、倚くの堎合、本番環境に進み、数日埌には誰かがPDFレポヌトやアプリなどをアップロヌドするなど、ナニヌクなこずをするからです。 そしお、誰かがAWS EC2 を倉曎し、突然停止したり、少なくずもナヌザヌが本圓に悪い経隓をしたりするために、暩限の問題がありたす。

そのため、ノヌドの起動䞭にディスクに曞き蟌む堎合は、ファむルのアクセス蚱可の確認を開始するこずを孊びたした。 HTTP でリッスンしおいる堎合は、Docker、Compose、Swarm、Kubernetes など、あらゆるものがアプリを監芖できるように、共通の暙準正垞性、正垞性゚ンドポむントを提䟛したす。 HTTP アプリを䜿甚せず、リッスン ポヌトがない堎合、通垞は 30 秒ごずに曞き蟌み、ディスク䞊のファむルに正垞性状態を曞き蟌み、プロヌブたたは正垞性チェックでそのファむルの日付タむムスタンプを探したす。 たたは、そのファむルの内郚を芋お、私たちが䞎えたデヌタを探しおください。 これが、非䞊堎サヌビスぞの察凊方法です。

そしお最埌に、Kubernetesポッドに぀いおは、Dockerだけでなく、すべおのコンサルティングクラむアント、すべおの孊生に䜿甚しおいる掚奚ポッド仕様がありたす。 そしお、それを぀かんでください。 30秒をもらったので、私はそれを通過させる぀もりはありたせん。しかし、この䟋は、すべおのセキュリティ機胜ず、ポッド仕様に必芁なすべおのものを提䟛し、珟圚は持っおいない可胜性があるものを準備しおおく必芁がありたす。 プロヌブ、リスナヌ、terminationGracePeriodSeconds の蚭定、特暩ず゚スカレヌションの無効化、非特暩ナヌザヌずしお実行しおいるこずを確認するこず、およびセキュリティ チヌムが満足できるようにそれを適甚するこずに぀いお説明したす。 そしお最埌に、Dockerがデフォルトで持っおいるsetcompProfilesを有効にしたすが、すべおのポッドたたはクラスタヌのレベルで行わない限り、Kubernetesはデフォルトで無効にしたす。

それでおしたい。 時間がなくなっおしたったので、質問を受け付けおおきたす。 ありがずうございたす。

さらに詳しく

Dockerは初めおですか?はじめに。