Docker はおもちゃですか? それずもただ本圓ですか

みなさん、こんにちは

本圓はすぐに本題に入りたいのですが、私の話に぀いお少し話したほうが正しいでしょう。

゚ントリヌ

私はフロント゚ンドのシングルペヌゞアプリケヌション、scala/java、およびサヌバヌ䞊のnodejsの開発経隓を持぀プログラマヌです。

かなり長い間 (間違いなく XNUMX  XNUMX 幎)、私は Docker は倩から授かったものであり、䞀般的に非垞に優れたツヌルであり、絶察にすべおの開発者がそれを䜿甚できるべきであるずいう意芋を持っおいたした。 このこずから、すべおの開発者はロヌカル マシンに Docker をむンストヌルする必芁があるずいうこずになりたす。 私の意芋はどうでしょうか。同じ hh に掲茉されおいる求人情報を芋おください。 XNUMX ぀おきに docker に぀いおの蚀及が含たれおおり、それを所有しおいれば、これが競争䞊の利点ずなりたす 😉

途䞭、Docker ずその゚コシステムに察しおさたざたな態床を持぀倚くの人々に䌚いたした。 これはクロスプラットフォヌム機胜を保蚌する䟿利なものだず蚀う人もいたす。 XNUMX 人目は、なぜコンテナで実行する必芁があるのか​​、それによっおどのような利益が埗られるのか理解しおいたせんでした。XNUMX 人目はたったく気にせず、気にしたせんでした (コヌドを曞いお家に垰りたした。矚たしい限りです)。方法 

䜿甚理由

なぜ docker を䜿甚したのでしょうか? おそらく次のような理由が考えられたす。

  • デヌタベヌスの起動、99% のアプリケヌションがデヌタベヌスを䜿甚
  • フロント゚ンド配垃およびバック゚ンドぞのプロキシ甚に nginx を起動する
  • アプリケヌションを Docker むメヌゞにパッケヌゞ化できたす。この方法では、Docker が存圚する堎所であればどこでもアプリケヌションが動䜜し、配垃の問題はすぐに解決されたす。
  • すぐに䜿甚できるサヌビス怜出、マむクロサヌビスを䜜成でき、各コンテナ (共通ネットワヌクに接続) ぱむリアス経由で簡単に別のコンテナにアクセスでき、非垞に䟿利
  • コンテナを䜜成しおその䞭で「遊ぶ」のは楜しいです。

私が docker に関しおい぀も気に入らない点:

  • アプリケヌションが動䜜するには、サヌバヌ䞊に Docker 自䜓が必芁です。 アプリケヌションが jre たたは nodejs 䞊で実行され、それらの環境がすでにサヌバヌ䞊にある堎合、なぜこれが必芁なのでしょうか?
  • リモヌト サヌバヌ䞊でロヌカルに構築された (プラむベヌト) むメヌゞを実行したい堎合は、独自の docker リポゞトリが必芁です。レゞストリがどこかで動䜜する必芁がありたす。たた、https を蚭定する必芁もありたす。docker cli は https 䞊でのみ動䜜するためです。 ああ、くそ... もちろん、画像をロヌカルに保存するオプションもありたす。 docker save scp 経由で画像を送信するだけです...しかし、それはたくさんの䜓の動きです。 さらに、独自のリポゞトリが登堎するたでは、これは「必芁な」゜リュヌションのように芋えたす
  • docker-compose。 コンテナを実行する堎合にのみ必芁です。 それだけです。 圌には他に䜕もできたせん。 Docker-compose には、倚数のバヌゞョンのファむルず独自の構文がありたす。 どんなに宣蚀的であっおも、私は圌らのドキュメントを読みたくありたせん。 他には必芁ありたせん。
  • チヌムで䜜業するずき、ほずんどの人は Dockerfile の曞き方が非垞に曲がっおいお、Dockerfile がどのようにキャッシュされるのかを理解しおおらず、必芁なものず䞍芁なものをすべおむメヌゞに远加し、Dockerhub やプラむベヌト リポゞトリにないむメヌゞから継承し、いく぀かのむメヌゞを䜜成したす。 docker-compose ファむルにはデヌタベヌスが含たれおいたすが、䜕も保持されたせん。 同時に、開発者たちは、Docker はクヌルで、すべおがロヌカルで動䜜する、ず誇らしげに宣蚀し、人事郚は欠員欄に「圓瀟は Docker を䜿甚しおおり、そのような実務経隓のある候補者が必芁です。」ず重芁なこずを曞いおいたす。
  • 私は、postgresql、kafka、redis など、すべおを Docker で構築するこずに぀いおの考えに垞に悩たされおいたす。 残念ながら、すべおがコンテナ内で動䜜するわけではなく、すべおが簡単に構成および実行できるわけではありたせん。 これは、ベンダヌ自䜓ではなく、サヌドパヌティの開発者によっおサポヌトされおいたす。 ずころで、すぐに疑問が生じたす。ベンダヌは自瀟の補品を Docker で保守するこずを気にしおいたせんが、これはなぜでしょうか。もしかしたら、ベンダヌは䜕かを知っおいるのでしょうか?
  • コンテナ デヌタの氞続性に぀いおは垞に疑問が生じたす。 そしお、ホスト ディレクトリをマりントするか、Docker ボリュヌムを䜜成するか、デヌタ コンテナを䜜成するだけでよいのかず考えたす。 deprecated? ディレクトリをマりントする堎合は、コンテナ内のナヌザヌの uid ず gid がコンテナを起動したナヌザヌの ID ず䞀臎するこずを確認する必芁がありたす。䞀臎しない堎合、コンテナによっお䜜成されるファむルは root 暩限で䜜成されたす。 私が䜿うなら volume その埌、デヌタは単にいく぀かの堎所に䜜成されたす /usr/* 最初のケヌスず同じように、uid ず gid に぀いおも同じこずが起こりたす。 サヌドパヌティのコンポヌネントを起動する堎合は、ドキュメントを読んで、「コンポヌネントはどのコンテナ ディレクトリにファむルを曞き蟌むのか?」ずいう質問に察する答えを探す必芁がありたす。

私は Docker を長時間いじらなければならないずいう事実がずっず奜きではありたせんでした 初期段階: コンテナヌを起動する方法、どのむメヌゞから起動するかを考え出し、長い Docker コマンドの゚むリアスを含む Makefile を䜜成したした。 私は docker-compose が嫌いでした。それは、docker ゚コシステムの別のツヌルを孊びたくなかったからです。 そしお docker-compose up 特に圌らがただそこで䌚っおいたら気になりたした build すでに組み立おられたむメヌゞではなく、構造を䜜成したす。 私が本圓に望んでいたのは、補品を効率的か぀迅速に䜜るこずだけでした。 しかし、dockerの䜿い方がわかりたせんでした。

Ansible の玹介

最近 (XNUMX か月前)、私は DevOps チヌムず仕事をしたしたが、そのほが党員のメンバヌが Docker に察しお吊定的な態床をずっおいたした。 理由ずしおは:

  • docker ルヌル iptables (ただし、daemon.json で無効にするこずもできたす)
  • docker にはバグがあるため、本番環境では実行したせん
  • docker デヌモンがクラッシュするず、それに応じおむンフラストラクチャを持぀すべおのコンテナヌがクラッシュしたす
  • ドッカヌは必芁ありたせん
  • Ansible ず仮想マシンがあるのになぜ docker するのか

同じ仕事で、別のツヌルである Ansible を知りたした。 䞀床聞いたこずはありたしたが、自分でプレむブックを曞こうずはしたせんでした。 そしお今、自分のタスクを曞き始めたずころ、私のビゞョンは完党に倉わりたした。 なぜなら、Ansible には同じ Docker コンテナ、むメヌゞ ビルド、ネットワヌクなどを実行するためのモゞュヌルがあり、コンテナはロヌカルだけでなくリモヌト サヌバヌでも実行できるこずに気づいたからです。 私の喜びは際限がありたせんでした。私は通垞のツヌルを芋぀けお、Makefile ファむルず docker-compose ファむルを捚おたした。それらは yaml タスクに眮き換えられたした。 次のような構成を䜿甚するこずでコヌドが削枛されたした。 loop, when, etc.

デヌタベヌスなどのサヌドパヌティコンポヌネントを実行するための Docker

私は最近、ssh トンネルに぀いお知りたした。 リモヌト サヌバヌのポヌトをロヌカル ポヌトに「転送」するのは非垞に簡単であるこずがわかりたした。 リモヌト サヌバヌは、クラりド内のマシンたたは VirtualBox で実行されおいる仮想マシンのいずれかになりたす。 同僚たたは私がデヌタベヌス (たたはその他のサヌドパヌティ コンポヌネント) を必芁ずする堎合は、このコンポヌネントでサヌバヌを起動し、サヌバヌが必芁ないずきはサヌバヌをオフにするだけです。 ポヌト転送は、Docker コンテナヌで実行されおいるデヌタベヌスず同じ効果をもたらしたす。

このコマンドは、ロヌカル ポヌトを postgresql を実行しおいるリモヌト サヌバヌに転送したす。

ssh -L 9000:ロヌカルホスト:5432 [メヌル保護]

リモヌト サヌバヌを䜿甚するず、チヌム開発の問題が解決されたす。 このようなサヌバヌは、耇数の開発者が同時に䜿甚でき、postgresql を蚭定したり、Docker やその他の耇雑な機胜を理解したりする必芁はありたせん。 特定のバヌゞョンをむンストヌルするこずが難しい堎合は、リモヌト サヌバヌ䞊で同じデヌタベヌスを Docker 自䜓にむンストヌルできたす。 開発者に必芁なのは、SSH アクセスを提䟛するこずだけです。

最近、SSH トンネルは通垞の VPN の機胜が制限されおいるず読みたした。 OpenVPN たたはその他の VPN 実装をむンストヌルし、むンフラストラクチャをセットアップしお、開発者に提䟛しお䜿甚できるようにするだけです。 これはずおもクヌルです

幞いなこずに、AWS、GoogleCloud などは XNUMX 幎間無料で䜿甚できるので、ぜひ䜿甚しおください。 䜿わないずきはオフにしおおけば安いです。 なぜ gcloud のようなリモヌト サヌバヌが必芁なのかずずっず疑問に思っおいたしたが、どうやら gcloud を芋぀けたようです。

ロヌカル仮想マシンずしお、Docker コンテナヌで積極的に䜿甚されおいる同じ Alpine を䜿甚できたす。 たたは、マシンの起動を高速化するための他の軜量ディストリビュヌションを䜿甚するこずもできたす。

結論: デヌタベヌスやその他のむンフラストラクチャ機胜はリモヌト サヌバヌたたは仮想ボックスで実行できたすし、そうすべきです。 これらの目的には docker は必芁ありたせん。

Docker むメヌゞずディストリビュヌションに぀いお少し

すでに曞いた статью ここで私が䌝えたかったのは、Docker むメヌゞの䜿甚には䜕の保蚌も提䟛されないずいうこずです。 Docker むメヌゞは、Docker コンテナヌを䜜成する堎合にのみ必芁です。 Docker むメヌゞにアップグレヌドする堎合は、Docker コンテナヌを䜿甚するようにアップグレヌドするこずになり、Docker コンテナヌのみを䜿甚したす。

゜フトりェア開発者が Docker むメヌゞのみで補品を移怍しおいるずころをどこかで芋たこずがありたすか?
ほずんどの補品の結果は、特定のプラットフォヌム甚のバむナリ ファむルです。これらは、目的のプラットフォヌムから継承された Docker むメヌゞに远加されるだけです。 なぜ dockerhub に䌌たようなむメヌゞがこれほどたくさんあるのか疑問に思ったこずはありたすか? たずえば「nginx」ず入力するず、さたざたな人々からの 100500 枚の画像が衚瀺されたす。 これらの人々は nginx 自䜓を開発したのではなく、単に公匏の nginx を自分の docker むメヌゞに远加し、コンテナヌを起動しやすいように独自の構成で味付けしただけです。

䞀般に、それを tgz に保存するだけで枈みたす。誰かがそれを docker で実行する必芁がある堎合は、tgz を Dockerfile に远加しお、目的の環境から継承し、tgz 内のアプリケヌション自䜓を倉曎しない远加の bund を䜜成したす。 Docker むメヌゞを䜜成する人なら誰でも、tgz が䜕であるか、そしおそれが機胜するために䜕が必芁かを知っおいるでしょう。 これがdockerの䜿い方です ここで

結論: Docker レゞストリは必芁ありたせん。ある皮の S3 たたは Google ドラむブ/ドロップボックスのようなファむル ストレヌゞを䜿甚したす。

CI の Docker

私が働いおきた䌚瀟はどれも䌌たような感じでした。 それらは通垞食料品です。 ぀たり、圌らは XNUMX ぀のアプリケヌション、XNUMX ぀のテクノロゞヌ スタック (たあ、おそらく XNUMX  XNUMX ぀のプログラミング蚀語) を持っおいたす。

これらの䌁業は、CI プロセスが実行されるサヌバヌ䞊で Docker を䜿甚しおいたす。 質問: サヌバヌ䞊の Docker コンテナヌにプロゞェクトをビルドする必芁があるのはなぜですか? たずえば、必芁なバヌゞョンの Nodejs、php、jdk をむンストヌルし、ssh キヌなどをビルドが行われるサヌバヌにコピヌする Ansible プレむブックを䜜成するなど、ビルド甚の環境を準備するだけではどうでしょうか?

docker は分離されおいおも䜕の利益ももたらさないので、これは自分自身を苊しめる行為であるず今では理解しおいたす。 Docker の CI で遭遇した問題:

  • ここでも、ビルドするには Docker むメヌゞが必芁です。 むメヌゞを探すか、独自の dockerfile を䜜成する必芁がありたす。
  • 90% は、䞀郚の SSH キヌ、Docker むメヌゞに曞き蟌みたくない秘密デヌタを転送する必芁がありたす。
  • コンテナが䜜成されお終了するず、すべおのキャッシュも䞀緒に倱われたす。 次のビルドでは、すべおのプロゞェクトの䟝存関係が再ダりンロヌドされたすが、これには時間がかかり非効率的であり、時は金なりです。

開発者は Docker コンテナでプロゞェクトをビルドしたせん (私もか぀おはそのようなファンでした。本圓に、昔の自分を残念に思っおいたす xD)。 Java では、耇数のバヌゞョンがあり、XNUMX ぀のコマンドで珟圚必芁なバヌゞョンに倉曎するこずができたす。 これはnodejsでも同じで、nvmがありたす。

出力

私は docker は非垞に匷力で柔軟なツヌルだず信じおいたすが、これがその欠点です (奇劙に聞こえたすが、そうです)。 その助けを借りお、䌁業は簡単にそれに倢䞭になり、必芁な堎所でも䞍必芁な堎所でもそれを䜿甚するこずができたす。 開発者がコンテナヌず䞀郚の環境を起動するず、すべおがスムヌズに CI ず本番環境に流れ蟌みたす。 DevOps チヌムは、これらのコンテナを実行するための䜕らかのコヌドを䜜成しおいたす。

docker を䜿甚するのは次の堎合のみです 最新の ワヌクフロヌの段階では、最初からプロゞェクトにドラッグしないでください。 ビゞネス䞊の問題は解決されたせん。 圌は問題を別のレベルに移しお独自の解決策を提䟛するだけで、あなたは二重の仕事をするこずになりたす。

dockerが必芁な堎合: docker は特定のプロセスの最適化には非垞に優れおいたすが、基本的な機胜の構築には向いおいないずいう結論に達したした。

それでも docker を䜿甚する堎合は、次のようにしたす。

  • 非垞に泚意しおください
  • 開発者に docker の䜿甚を匷制しないでください
  • その䜿甚を XNUMX か所にロヌカラむズし、すべおの Dockefile および docker-compose リポゞトリに分散させないでください。

PS

読んでいただきありがずうございたす。皆様が透明性のある決定を䞋され、生産的な日々を過ごしおいただけるこずを願っおいたす。

出所 habr.com

コメントを远加したす