ラボれロからのDockerの玹介 初めおのマむクロサヌビス

こんにちは、HabraUser 今日は、Dockerに぀いおの別の蚘事を玹介したす。 そのような蚘事がすでにたくさんあるのに、なぜこれをしおいるのですか いく぀かの答えがありたす。 第䞀に、それらのすべおが、私がドッカヌを孊習する私の最初の段階で、私自身が非垞に圹立぀ものを説明しおいるわけではありたせん。 第二に、私はこの理論に぀いお人々に少し理論を盎接教えたいず思いたす。 重芁な理由の1぀は、この短期間のドッカヌの研究で蓄積されたすべおの経隓私は6か月以䞊䜜業しおきたしたを䜕らかの圢匏に蚭定し、最埌たですべおを敎理するこずです。 さお、最埌に、私がすでに螏んでいる熊手を説明し熊手に助蚀を䞎える、熊手を説明したす。その解決策は箱から出しおドッカヌに単に提䟛されおおらず、鋭い欲求で砎裂しおいる段階で考える䟡倀がある問題に぀いおこの技術がすべおに適しおいるわけではないずいう認識に至るたで、呚囲の䞖界党䜓をコンテナに移したす。



この蚘事では䜕を怜蚎したすか



パヌト0理論で、コンテナ、それが䜕であるか、そしお䜕を食べるかに぀いお説明したす

パヌト1から5には、rabbitmqキュヌを䜿甚しおPythonでマむクロサヌビスを䜜成するずいう理論ず実践がありたす。

パヌト6-あずがき



パヌト0.0タむダのりォヌムアップ



Dockerずは䜕ですか これは、Linux名前空間を䜿甚しお、アプリケヌションを盞互に分離する新しい方法です。 管理、拡匵、移行が非垞に簡単であり、アプリケヌション開発やパッケヌゞ構築から5分間のテスト1-2コマンドの実行チェック、クロヌズアンドフォヌゲットなど、ごみもクリヌンアップされるたで、幅広いタスクに適しおいたす。 オフサむトで詳现をご芧ください。 最初の段階では、コンテナがレむダヌで構成されおいるこずを想像するだけです。 ファむルシステムの状態のスナップショットから。 これに぀いおは少し埌で説明したす。



この蚘事のラボむンフラストラクチャは、Linuxを搭茉した同じOSでも、䞀連の仮想マシン\ vps \䜕でも再珟できたす。 Debian OSを搭茉した同じ専甚サヌバヌですべおを行いたした。 以䞋、同じDebian 9 OSで䜜業しおいるず仮定したす。OSからOSぞのコマンドずアプロヌチは異なる堎合があり、1぀の蚘事ですべおを説明するのは非珟実的であるため、最も銎染みのあるサヌバヌOSが遞択されたした。 仮想マシンをむンストヌルしお、むンタヌネットぞのアクセスを蚱可するのが難しくないこずを願っおいたす。



docker-ceをむンストヌルする必芁がありたす 公匏の男 

私はすでに曞かれたものを噛む぀もりはないので、ここでドキュメントぞのリンクを提䟛し、リストで玔粋な Debian9 x64にむンストヌルするためのコマンドを提䟛したす。 スヌパヌナヌザヌに代わっお実行されるコマンドは文字で始たり、通垞のナヌザヌコマンドは$で始たりたす。



# apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common # curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add - # add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable" # apt update && apt install docker-ce
      
      





パヌト0.1 VMずの比范



Dockerはプロセスタスクを分離する手段であり、これはDockerを仮想マシンずしお扱うこずは䞍可胜であるこずを芚えおおくこずが重芁です。 これは、具䜓的にはLinuxカヌネルのコンテナヌ化ツヌルcgroups +名前空間のラッパヌです。 しかし、仮想化のような倚くの同様の機胜がありたす。



  1. 独立性-コンテナは、ドッカヌサヌビスを搭茉した任意のOSに移動でき、コンテナは機胜したす。 正匏に-はい、実際、互換性がポニヌ、虹、蝶ず同じくらいバラ色かどうかはわかりたせん。他の経隓がある堎合は、共有しおください
  2. 自絊自足-コンテナは、起動された堎所であればどこでも機胜を実行したす。


それでも、通垞の仮想化ずは異なりたす。



  1. コンテナの内郚には、プロセスの操䜜に必芁な最小限の゜フトりェアセットがありたす。 これは本栌的なOSではなく、監芖、残りの堎所の監芖などを行う必芁がありたす。
  2. 仮想化ぞの異なるアプロヌチが䜿甚されたす。 それに぀いお読んでください 。 私は原則そのものを意味したす-おなじみのホストOSはありたせん。
  3. コンテナずコンテナが生成するデヌタには特別な泚意を払う必芁がありたす。 コンテナはデヌタ凊理ツヌルですが、ストレヌゞツヌルではありたせん。 䟋ずしお、コンテナは釘打ち機であり、入力デヌタは板ず釘であり、䜜業の結果は釘を板に打ち蟌むこずです。 同時に、釘のあるボヌドは釘打ち機自䜓の䞀郚ではありたせん。結果は分離され、ツヌルは分離されたす。 出力をコンテナ内に保存しないでくださいできたすが、ドッカヌりェむではありたせん。 したがっお、コンテナはワヌカヌ䜜業枈み、キュヌにレポヌトされるであるか、たたは、たずえばWebサヌバヌの堎合、倖郚ボリュヌムを䜿甚する必芁がありたす。 これはすべお非垞に簡単で、珟時点では悲しいこずはありたせん。


パヌト0.2コンテナ内のプロセス



Dockerが䜕であるかがわかったので、双県鏡で䞭身を芋おみたしょう。 次の仮定を芚えおおく必芁がありたす。



  1. コンテナは存続したすが、コンテナが生たれるプロセスは存続したす。
  2. コンテナ内では、このプロセスのpid = 1
  3. pid = 1のプロセスの近くで、他のプロセスをOSの機胜の範囲内で奜きなだけ生成できたすが、pid = 1のプロセスを匷制終了再起動するず、コンテナは終了したす。 ポむント1を参照
  4. コンテナ内には、 FHS暙準に埓っお通垞のディレクトリレむアりトが衚瀺されたす。 堎所は、元のディストリビュヌションコンテナの取埗元ず同じです。
  5. コンテナ内で䜜成されたデヌタは、コンテナ内に残り、他のどこにも保存されたせんホストOSからこのレむダヌにアクセスするこずもできたす。 コンテナを削陀するず、すべおの倉曎が倱われたす。 したがっお、デヌタはコンテナに保存されず、ホストOSに取り出されたす。


パヌト0.3これらのコンテナの入手先 保管方法



公匏および非公匏の画像のパブリックストアずプラむベヌトストアがありたす。 これらはdocker registryず呌ばれたす。 最も人気のあるのはDockerハブです。 サヌビスをドッキングするずき、最初にハブに行き、誰かがすでにこれを行っおいるかどうかを確認したすか



たた、孊習時にあなたにずっお倧きな助けになりたす。 完成したDockerfileがハブに衚瀺されるため、クヌルなおじさんず、これをどうやっおやるのかを芗くこずができたす。 それらの倚くはgithubおよび他の同様のリ゜ヌスに保存されたす。



パブリックレゞストリに加えお、プラむベヌトのものもありたす-有料ず無料。 サヌビスに苊しんで、「はい、これらの人にレゞストリ内のこのパフドッカヌバッカナリアをすべお芋おみたしょう」ず叫ぶずきは、有料のものが必芁になりたす。 そしお真実は、DevOpsドッカヌを積極的に䜿甚するずき、人や自動化が䜕癟ものコンテナを構築するずき、遅かれ早かれそれをきれいにしお維持する方法から燃え始めたす。



もちろん、すべおがそれほど悪いわけではありたせん。 1日数十人ず1日に2、3ビルドの堎合、レゞストリが機胜したす。 さらに個人的な䜿甚のために。



レゞストリが圹立぀のはなぜですか それは、あなた、他の人、たたは自動化の間での保管ずコンテナの亀換の単䞀の堎所です。 そしおこれは本圓にクヌルなこずです。 完成したコンテナは、たった1぀のチヌムで配眮およびピックアップできたす。重量が1ポンドVMに比べおであれば、プラス面はすぐにわかりたす。 Dockerはツヌルであり、Dockerレゞストリには䜜業コンテナのデヌタは保存されないこずを芚えおおく必芁がありたす。 したがっお、開発者は非垞に䟿利なワヌクフロヌを持぀こずができたす。開発者は補品を䜜成し、新しいコンテナを構築し、それをリポゞトリにプッシュしたす。 テスタヌはそれを受け取り、テストし、先送りしたす。 Devopsは、たずえば、プロッドのロヌル玙容噚を䜿甚したす。 たた、サヌバヌが1台であろうず100台であろうず、ansibleずレゞストリを䜿甚しお、コンテナをprodにロヌリングするこずはあなたにずっお絶察に重芁ではありたせん。 これがCIの党䜓です-ビルドサヌバヌによっお新しいバヌゞョンを自動的にダりンロヌドできたす。 そのため、個人で䜿甚する堎合でも、レゞストリでVPS \ DSを取埗するこずを匷くお勧めしたす。コンテナを亀換するこずは非垞に䟿利です。



リポゞトリから画像をダりンロヌド



 docker pull wallarm/node
      
      





画像をリポゞトリにアップロヌド



 docker push example.com:5000/my_image
      
      





たた、プラむベヌトリポゞトリにログむンする必芁がありたす。これにはコマンドが必芁です



 docker login
      
      





ナヌザヌ名ずパスワヌドを入力する必芁がありたす。



次の1぀のコマンドでレゞストリを開始できたす。



 docker run -d -p 5000:5000 --restart=always --name registry registry:2
      
      





オフサむトの詳现 。 SSL、認可-これはすべお可胜です。



パヌト0.4コンテナヌずむメヌゞむメヌゞ



Dockerむメヌゞはレむダヌのセットです。 各レむダヌは、Dockerfileでのチヌムの䜜業の結果です。 倧たかに蚀えば、画像はコンテナを起動するためのテンプレヌトです。 このむメヌゞに基づいお起動されるのは、コンテナたたはむンスタンスのみです。 ぀たり 1぀のむメヌゞから、このむメヌゞのいく぀かの同䞀コピヌコンテナヌを実行できたす。 そしお、いく぀かの操䜜の埌、このコンテナからテンプレヌトを䜜成できたす-新しいむメヌゞ。 この䞍名誉はすべお/ var / lib / dockerに保存されたす。

ドキュメント



システム内のむメヌゞのリストは、次のコマンドで衚瀺できたす。



 # docker images
      
      





コンテナリスト



 docker ps
      
      





-aスむッチも停止したこずを瀺し、-sスむッチはそのサむズを瀺したす。 ぀たり 実際、このコンテナが実行時にどれだけディスクスペヌスを占有するか。



パヌト0.5コンテナずむメヌゞに名前を付ける方法



画像には、呜名に関連する3぀のフィヌルドがありたす。



1リポゞトリ

2タグ

3画像ID



リポゞトリ-本物たたは非本物、これはあなたの画像がどこからたたはどこからダりンロヌド/アップロヌドされるか、たたはあなたがそれをどこにもアップロヌドする぀もりがない堎合は単なる䜜り䞊げの名前です。

タグは通垞、補品のバヌゞョンです。 理論的には、これは任意の文字セットです。 蚱可リスト[a-z0-9.-]などから。タグがない堎合、 最新の単語が自動的に䜿甚されたす。 タグは、シンボルを介しお配眮されたすリポゞトリに代わっお、プッシュ\プル時に指定されおいない堎合は自動的に眮換されたす。

ImageID-ロヌカルで生成された画像の䞀意のID。この方法で操䜜できたす。



したがっお、あなたたたはコンテナの䜜成者は、リポゞトリおよび/たたはタグ、およびシステムにロヌカルに圱響を䞎えたす-ID。 しかし、ずころで、誰も異星人のリポゞトリ名を再利甚するこずを気にしたせん、別の質問はあなたがそれをプッシュプッシュ、ロヌドできないものです



䟋



1/2 / 3-blah.blah.blah-ロヌカルむメヌゞの名前、あなたがそれを発明した

projects / my_first_dockerはロヌカルむメヌゞの名前でもありたす

projects / my_first_dockerlatestは同じ名前ですが、タグが付いおいたす。 前のものず同等。

projects / my_first_docker1.13.33-ただし、これはこのリポゞトリ内のむメヌゞの特定のバヌゞョンです。

projects / my_first_docker1.13.34

projects / my_first_docker1.13.35

...など-これらはすべお同じプロゞェクトですが、画像のバヌゞョンは異なりたす。



Dockerの優れた機胜の1぀は、レむダヌの再利甚です。 これは、レむダヌが倉曎されおいない堎合、むメヌゞの新しいバヌゞョンが他のコンテナヌのレむダヌを䜿甚できるこずを意味したす。 たずえば、debianルヌトレむダヌは、すべおのdebianベヌスのコンテナヌで䜿甚されたす。 2番目のレむダヌ、たずえばnginxをむンストヌルし、3番目のレむダヌが構成を配眮する堎合、構成を倉曎しお新しいむメヌゞを䜜成するず、2぀の叀いレむダヌず1぀の新しいレむダヌで構成されたす。 しかし、喜んで倧急ぎしないでください。 この再利甚により倚くのスペヌスを節玄できたすが、ドッカヌはくしゃみごずに䜜成するこれらのレむダヌを敎理できたす。 再利甚のためにこれらの局は互いに地獄のような䟝存関係を持ち、最終的に、倚くのコンテナが組み立おられる倧芏暡なむンストヌルでは、これは私が䞊蚘で述べた非垞にパフなバカナリアになりたす。 しかし、あなたに起こるこずずしお蚀われたこずを受け取らないでください。私は、オフィス党䜓が自動化ず盞たっお䜕かを終日収集するずきに、1日に数十の新しいビルドを搭茉した負荷システムに぀いお話したす。 通垞のサヌバヌにはそのようなバッカナリアはありたせん-そこには数個のコンテナしかありたせん。 䞀方で、非垞に簡単にクリヌニングされたす-rm -rfだけです。 あなたにずっお最も重芁なのはコンテナです。コンテナはリポゞトリにあり、単玔に自動的に再床ダりンロヌドされたす。 ずにかく、䜜業の結果をコンテナに保存しないでください。



その他の䟋



wallarm / node-これは、Wallarm瀟の最高のWAFがすでにハブのパブリックドッカヌからダりンロヌドされたむメヌゞです。

debianstretch-debianむメヌゞ、むメヌゞのバヌゞョン-stretch数字ではなく単語

centos7-debianに䌌おいたす。

mongo3.2-パブリックリポゞトリからダりンロヌドされたmongodbバヌゞョン3.2むメヌゞ

nginx-最新の安定したnginx-同様に。



そしお、ほずんどの堎合、ハブで必芁な゜フトりェアのさたざたなバヌゞョンを確認できたす。 たずえば、mongoを䜿甚するず、3.2ず3.4ず3.6の䞡方、さらには開発バヌゞョンもダりンロヌドできたす。 およびさたざたな䞭間䜓。 そしお他のたくさん。



それがどれほど䟿利か想像しおみおください-Monga 3.2が回転しおいるので、近くで別のバヌゞョンを詊しおみおください。 新しいバヌゞョンのコンテナをダりンロヌドしお実行するだけです。 たた、仮想マシンを遞択しお構成したり、クリヌニングしたりする必芁はありたせん。 Dockerむメヌゞを削陀する必芁があるのは、docker rmiコマンドを入力するだけだからです。 そしお、それは比類のない軜量です。 たずえば、200メヌトル。 たた、さらにクヌルにしたい堎合は、alpine linuxベヌスの既補の゜リュヌションを䜿甚できたす。 bind9-alpine。 1぀の悪魔。 3構成 15メガバむト!!! これは、すぐに䜿甚できる完党なむンストヌルです。



芚えおおいおください。同じむメヌゞには、任意の数のリポゞトリ名ずタグを含めるこずができたすが、同じむメヌゞIDを持぀こずになりたす。 同時に、この画像のすべおのタグが削陀されるたで、画像は削陀されたせん。 ぀たり debianむメヌゞをダりンロヌドしお新しいタグを芁求するず、リストには2぀のむメヌゞがありたすが、名前は同じですが、imageidは同じです。 debianstretchを削陀するず、タグの1぀を削陀するだけで、画像自䜓は生きたたたになりたす。



既存のむメヌゞに別の名前を蚭定するには、次のコマンドを䜿甚したす。



 docker tag <existing image name> <new image name>
      
      





画像を削陀するには



 docker rmi <image>
      
      





ただし、コンテナには2぀の名前がありたす。



1コンテナID

2名前



id-ここでも同じ-これは、むメヌゞの実行䞭の特定の䞀意のむンスタンスの䞀意の名前です。 簡単に蚀えば、実行䞭のむメヌゞの䞀意の名前です。 むメヌゞは䜕床でも実行でき、各コピヌには䞀意の名前が付けられたす。



名前-しかし、これは男性ずスクリプト䜜成にずっおより䟿利な名前です。 事実、さたざたなむメヌゞを起動するこずで、起動したコンテナの名前を確認したり、コンテナの起動時にこの排気を行うたで、起動した名前を正確に知るこずはできたせん。 stdoutにログむンできる堎合、コンテナ名は倱われたす。 そのため、-nameキヌを䜿甚しお実行䞭のコンテナの名前を事前蚭定し、すぐにわかる名前で操䜜できたす。



コンテナリスト



 docker ps
      
      





コンテナを削陀するには



 docker rm <container>
      
      





パヌト0.6さお、これらはすべお倖囜のコンテナですが、どうやっおれロから自分のものを䜜るこずができたすか



コンテナを䜜成するには、ビルドメカニズム-docker buildがありたす。 Dockerfileの呜什セットを䜿甚しお、独自のむメヌゞを構築したす。 内郚にコンテナを構築するずき、shシェルが䜿甚され、コマンドが実行されたす。



次のこずを知っおおく必芁がありたす。



  1. 完了した各コマンド-このコマンドによっお生成された倉曎の結果でファむルシステムレむダヌを䜜成したす。 ぀たり たずえば、apt install htopコマンドを実行するず、このコマンドの実行結果バむナリ、ラむブラリなどを含むレむダヌが䜜成されたす。 最終的に、そのような各レむダヌは互いに重ね合わされ、元のオペレヌティングシステムのむメヌゞに重ねられ、最終結果が埗られたす。 これにより、いく぀かの制限が生じたす。
  2. レむダヌは互いに独立しおいたす。 これは、コンテナ内のビルドプロセス䞭に実行されるサヌビスは、それ自䜓のレむダヌ内にのみ存圚するこずを意味したす。 顕著な䟋は、mysqlでデヌタベヌスをいっぱいにする詊みです。 これは通垞どのように起こりたすか mysqlサヌバヌを起動し、次のコマンドでデヌタベヌスに入力する必芁がありたす。 これは、ここでは機胜したせん。 mysqlの起動結果ログなどを保存するレむダヌが䜜成され、mysqlが終了したす。 次のレむダヌベヌスフィルコマンドの実行時では、マッスルは起動されなくなり、゚ラヌが発生したす。 この問題の解決策は、&&を䜿甚しおチヌムを統䞀するこずです。
  3. 3ただし、氞続デヌタは最初のコマンドから最埌のコマンドたで互いに重ね合わされ、レむダヌごずに氞続的に保存されたす。 したがっお、最初のコマンドでファむルを䜜成するず、最埌のコマンドでアクセスできたす。


パヌト0.7最埌に、「これはDockerの方法ではありたせん」



Dockerは、ビルド内のほずんどのごみ局です。 さらに、停止したコンテナの束を残すこずができたす。 1぀のコマンドですべおを削陀する



 docker system prune
      
      





これは枯湟劎働者の方法ではありたせん。



ドッカヌは、蚭蚈䞊、1぀のプロセス任意の数の子孫を含むを仮想化したす。 もちろん、1぀のコンテナに10個のプロセスを詰め蟌むこずを邪魔するこずはありたせん。

これは、たずえばスヌパヌバむザヌを䜿甚しお実行できたす。



しかし、あなたは蚀う、圌らのすべおの人生が䞀緒になり、共有されるべきではないサヌビスに぀いおはどうですか 各友人がdrugug甚に生成するコンテンツを䜿甚したすか



これを矎しく正確に行うために、docker-composeがありたす-これは、コンテナのNずその関係を蚘述するyamlファむルです。 亀差するコンテナ、盞互に開くポヌト、共有するデヌタ。



䜜成の堎合、実際にはプロゞェクトを簡単に管理できたす。 たずえば、nginx + uwsgi + mongoバンドルは3぀のコンテナですが、nginx以倖のナヌザヌはuwsgiに、mongo以倖のナヌザヌはmongoに行きたせん。 そしお、圌らは垞に䞀緒に䜏んでいたす。 これはプラむベヌトケヌスです。 ここでは、次の状況が発生したす-アプリケヌションapiは頻繁に曎新されたす-あなたはそれを毎日曞いおプッシュしたす。 たた、たずえば、nginxたたはmongodbのリリヌスははるかに少ない頻床で行われたす。おそらく1か月、さらに長くなりたす。 では、倉曎がすべお1か所で発生するたびに、なぜこの重量玚を構築するのでしょうか nginxを曎新するずきが来たら、タグ名ずプロゞェクトの再構築党䜓を倉曎し、nginxで新しいコンテナをダりンロヌドするだけです。



パヌト1緎習はい぀ですか



この段階で、コンテナに觊れお必芁なコマンドを教えるこずができたす。 私は、手動でチュヌトリアルからチヌムを運転するこずのサポヌタヌです。 したがっお、スクリヌンショットのみ。



1. debianむメヌゞをダりンロヌドしおみたしょう



画像



2.䜕が起こったのか芋おみたしょう。 私の堎合、フィルタヌにdebianずいう単語を䜿甚したした。 そうしないず、他の画像の束が結論に萜ちおしたいたす。 䜿甚する必芁はありたせん。 その結果、異なるタグを持぀2぀の同䞀のimageidがありたす最初の2぀がありたす。

Z.Y. 未来ぞこんにちは debian10に䜏んでいおこの蚘事を読んでいる人にずっおは、私のものず同じ結果にはならないでしょう。 理由をご理解いただければ幞いです。







3. debianstretch image内でbashプロセスを実行したす。 そのpidを芋おください-それは1に等しいです。 すなわち これが私たちが螊っおいる䞻なプロセスです。 泚意しおください-ps auxを簡単に実行できたせんでした-コンテナに必芁なパッケヌゞがありたせん。 aptを䜿甚しお、通垞どおり配信できたす。







4.コンテナを終了しexit | Ctrl + D、bashの再起動を詊みたす-これは䞊郚コン゜ヌルにありたすスクリヌンショットを簡単にするために、別のコン゜ヌルを開くこずができたす。 䞋郚のりィンドりで-実行䞭のコンテナのリストを参照しおください







わあ procpsはどこに行きたしたか はいどこにもありたせん。 圌はここにいたせんでした。 むメヌゞを再起動したずきに、むンストヌルされたプログラムなしで同じキャストを䜿甚したした。 そしお、私たちの仕事の結果はどこに行きたしたか そしおそこに圌は嘘を぀いおいる-終了状態で。 以前に立ち䞊げお埌で停止した他のコンテナの束のように。





これはすべおゎミです。 しかし、それはただ埩掻するこずができたす



1.最初のタヌミナルでコンテナを終了したす

2. 2番目のタヌミナルで、コンテナのIDをコピヌしたす。これは、停止したものずしおtimeshtampによっお適切です

3. 1぀のタヌミナルで、startコマンドでこのコンテナを起動したす。 圌はバックグラりンドに行く

4. 2番目のタヌミナルで、実行䞭のコンテナのリストを確認したす。タむムスタンプたでに、7秒間実行されおいるコンテナは明らかに私たちのものです。

5.耳を切りたす。 execコマンドを䜿甚しお既に実行䞭のコンテナヌに接続し、2番目のbashむンスタンスを実行したす。

6. ps auxを実行したす-最初のbashはpid 1ずずもに存圚するこずに泚意しおください。 コンテナ内でpid = 7のbashを䜿甚しお管理したす。 そしお今、倖に出ればコンテナは生きたす。





だから

run -Xのむメヌゞを取埗し、プロセスYでコンテナヌZを䜜成したす

exec-コンテナヌZを取埗し、その䞭のプロセスNを開始したすが、プロセスYは以前ず同様に機胜したす。



結論



1仮想化するプロセスのみが生きおいる堎合、コンテナはバックグラりンドずフォアグラりンドの䞡方で生きるこずができたす。

2コンテナはむメヌゞからデプロむされたむンスタンスです

3デヌタを損倱するこずなくコンテナを停止および起動できたすただし、䟡倀はありたせん。これはdocker-wayではありたせん



パヌト2独自のdockerむメヌゞを䜜成する





dockerfileの䜿甚方法を孊習したす。

以䞋に2぀の開発アプロヌチを瀺したす。



1準備を敎えお自分自身を匱䜓化させる

2最初から自分で行う



最初のオプションは、すべおの䜜業が完党に完了しおいるこずを確信しおいる堎合です。 たずえば、nginxで既補の公匏コンテナを入手できるのに、なぜnginxをむンストヌルするのか。 これは、同じチヌムに所属しおいないシステムや、たずえば、debianでは叀いバヌゞョンがあり、ドッカヌハブでは最新の安定したシステムで構築されおいるシステムに特に圓おはたりたす。 さらに、自動アセンブリはすでに行われおいたす-新しいバヌゞョンがすぐに到着したす。



2番目のオプション-あなたは劄想的であるか、画像の䜜者のアプロヌチが奜きではありたせん䟋えば、公匏のものはありたせんでしたが、Vasya Pupkinのハブにのみありたした。 誰もワシリヌがそれをどのようにしたかを気にせず、それから自分で行っおください。たあ、たたは、jenkinsでdebパッケヌゞをビルドするためのdockerむメヌゞなど、独自のロゞックを䜜成する堎合は、どこにも芋぀かりたせん。しかし、これは非垞に䟿利です



Dockerfileは、指定したむメヌゞのクリヌンコンテナで実行される䞀連の呜什を含むファむルであり、出力ではむメヌゞが取埗されたす。



指定する必芁がある最も重芁なこずは、FROMおよびCMDディレクティブです原則的には、必ずしもそうではありたせん。そのようなファむルの䟋を瀺したす







。FROM-基瀎ずしお䜿甚するむメヌゞ。

MAINTAINERは、この開発の䜜成者この新しいむメヌゞの䜜業を開始する人です

。RUNは、コンテナヌ内で実行されるコマンドであり、それに基づいお新しいむメヌゞが取埗されたす。泚意しおください-通垞のbash転送ず&&-コヌドを読みやすく、矎しくしたす。

たた、ロゞックを蚘述するために、少なくずも10個のRUN-コマンドただし、それぞれが新しい行を蚘述するこずもできたす。

EXPOSE-docker-composeを䜿甚する堎合、どのポヌトで、どのプロトコルでコンテナヌの倖郚からアクセス可胜になりたす。ここで芚えおおく必芁があるのは、これはすぐに利甚できるずいう意味ではないこずです。぀たり぀たり、hostcontainer mappingを䜿甚しおこのポヌトのマッピングを開始するたで、䞭に入るこずはできたせん。したがっお、どの段階でどのポヌトを登録したかを知る必芁がありたす



1コンテナヌ内で、アプリケヌションは0.0.0.0:80をリッスンしたすそしお垞に0.0.0.0 !!!、localhostにバむンドできたせん-この方法でアプリケヌションは倖郚からアクセスできなくなりたす。 mysqlに関しおもです。コンテナの起動時にマッピングを指定するたで、誰もアプリケヌションに接続しないこずに泚意しおください。

2docker run -p 80:80 image



そしお、この方法でのみ-ポヌト80のホストを参照しお、ポヌト80のコンテナにマップしたす。コンテナが起動したずき、このポヌトは開いおいお、コンテナ内でアプリケヌションはポヌト80をリッスンしたす。したがっお、ホストポヌト80からアプリケヌションの80ポヌトに転送されたす。圓然、ポヌトはどれでも䜜成できたす。そのため、nginxが内郚でポヌト80をリッスンしおいる倚くのコンテナヌを起動でき、倖郚からのマッピングは次のように実行できたす800080、800180、800280 ...など、アむデアは明確です。したがっお、1぀の構成で1぀のむメヌゞを䜜成し、それを耇数回䞊行しお独立しお実行できたす。



CMD-これが重芁な堎所です。これは、コンテナの起動時に実行され、この間ずっず機胜するコマンドです。はい芚えおいたすかプロセスの実行䞭、コンテナは存続したす。ここでのアプロヌチはsystemdの堎合ず同じです-プロセスはバックグラりンドに移行しないでください-必芁はありたせん。プロセスはこのコンテナ内で1぀だけです。したがっお、ずころで、ロギングぞのさたざたなアプロヌチ。たずえば、出力をSTDOUTたたはログに残すこずができたす。䞻なこずは、開始埌のプロセスメむンプロセスがラむブのたたであるこずです。フォヌクフォヌクは奜きなだけ䜿甚できたす。

CMDに加えお、別のタむプのシャヌマニズムがありたす-ENTRYPOINT。これは通垞、CMD倀を匕数ずしお受け取るシェルスクリプトです。



次のこずを芚えおおく必芁がありたす



。1コンテナでプロセスを開始する最埌のコマンド= sum ENTRYPOINT + CMD。

2゚ントリポむントずcmdの組み合わせの任意のバリアントをdockerファむルに曞き蟌むこずができたす-どちらか䞀方、たたは䞡方を䞀床に残したす。



䟋

ENTRYPOINT ["/entrypoint.sh"]

CMD ["haproxy"、 "-c"、 "/etc/haproxy/haproxy.conf"]

合蚈。コンテナが起動するず、次のコマンドが起動されたす

。sh -c "/entrypoint.sh haproxy- c /etc/haproxy/haproxy.conf "。

スクリプト内でこれらの匕数をどうするかは、あなたが決めるのはあなた次第です。



なぜこの耇雑さが必芁なのですか適任者ぱントリヌポむントを䜜成しお、あらゆる機䌚を明らかにしたす。玔粋に自分でむメヌゞを䜜成する堎合は、玔粋にCMDを1぀だけ残し、ENTRYPOINTをたったく䜜成しないでください。



シナリオ1

匕数なしでコンテナヌを起動する

docker run haproxy

はENTRYPOINT + CMDを実行したす

sh -c "/entrypoint.sh haproxy -c /etc/haproxy/haproxy.conf"

どちらもコンテナに瞫い付けられおいたす。 entrypoint.shスクリプトでは、䜜成者は次のロゞックを䜜成したした。最初の匕数がhaproxyの堎合、haproxy = haproxy -db -W $ @。そしお、結果を実行したす。その結果、次のコマンドが起動されたす。



 haproxy -db -W -c /etc/haproxy/haproxy.conf"
      
      





シナリオ2

匕数を指定しおコンテナヌを開始し

たす。docker run haproxy bash

where bash-dockerfileからのCMDコマンドをオヌバヌラむドしたす。その結果、ENTRYPOINT + CMDは以䞋を提䟛したす

sh -c "/entrypoint.sh bash"

著者のロゞックによれば、最初の匕数が= Haproxyの堎合、このプロセスを開始するだけです。その結果、コンテナを単玔にシェルに入力したす。



シナリオ3

私は適切な堎所で蚭定を䜿甚しおhaproxyの起動を指定したす。

docker run haproxy haproxy -c /opt/haproxy.conf

ここで、最初のhaproxyはむメヌゞの名前であり、その埌ろにあるのは内偎に枡された匕数のみです。 CMDを再定矩するず、結果は次のようになりたす

。sh -c "/entrypoint.sh haproxy -c /opt/haproxy.conf"

そしお、アプリケヌションが起動したす。



 haproxy -db -W -c /opt/haproxy.conf"
      
      





これは、入力を操䜜するこずでできるこずの原始的な䟋です。 ENTRYPOINTずCMDの組み合わせをさたざたに䜿甚するための倚数のシナリオを怜蚎できたす。 Dockerfileにアクセスできない゚ンドナヌザヌでコンテナを起動する方法をいく぀か提䟛できるこずを芚えおおいおください。



瀺したコマンドに加えお、他にも倚くのコマンドがありたす。たずえば、ADD、COPY-コンテナヌ内にデヌタセットを配眮できたす。たた、ADDがアヌカむブを゜ヌスずしお指定するず、指定した堎所にコンテンツを展開しお配眮したす。たれにしか倉曎されないファむルのセットに䟿利です。



Dockerfile内の順序は重芁です 最適化の芳点から

Dockerfileに倉曎を加え、その埌むメヌゞを再構築するず、倉曎の開始元のコマンドセットに圱響したす。

䟋



 COPY config config RUN apt install 100500-programms-pack
      
      





構成の少なくずも1぀の文字を倉曎するず、100500プログラムのパックをむンストヌルするたびに䜕床も呌び出したす。しかし、これらの行が逆の順序で配眮されおいる堎合、ビルドはほが瞬時に行われたす-なぜなら これらのプログラムを含むレむダヌは既に存圚したす。



パヌト3FSコンテナヌずホストの通信



それでは、コンテナからホストOSのデヌタにアクセスする方法を芋おみたしょう。これにはいく぀かの理由がありたすファむル転送、蚭定、たたは単に凊理されたデヌタをディスクに保存する。前に述べたように、コンテナをオフにした堎合のようにデヌタは消えたせんが、それらはこのコンテナに残りたす。埌でそれらを匕き出すこずは䞍必芁で愚かな䜜業です。 Docker Way-コンテナヌ内にホストディレクトリ\ファむルをマりントしたす。さらに簡単な堎合は、倖郚のフォルダヌ\ファむルを内郚のフォルダヌ\ファむルにマッピングしたす。これはマりントであるため、䞀方の倉曎は垞に他方に衚瀺されたす。したがっお、ホストOSから構成に倉曎を加えるこずにより、コンテナヌ内のサヌビスの動䜜を倉えるこずができたす。たた、その逆-ホスト䞊のデヌタベヌスを、厳密に定矩された䟿利な1぀の堎所に保存したす。たたはログ。



このこずは-vスむッチで行われたす



 -v /source/folder:/destination/folder -v /path/to/file:/path/to/config
      
      





この堎所では、䟿利な人ぞの別のリンク、぀たり、簡単な説明付きのdockerチヌムの蚘事コレクションを提䟛できたす。 タむツ



堎合によっおは、蚭定よりも環境倉数を転送する方が簡単です。そしお、Dockerを䜿甚するず、DockerfileENVキヌ=倀でビルド甚に配線され、コンテナヌを起動するずきにキヌを介しお、およびそのような倉数が倚数ある堎合は別のファむルを介しお配線できたす。



パヌト4サヌビスの䟿利なランチャヌ



すでにいく぀かのコンテナを自分で構築しおいる堎合、問題が発生したす。どのように努力せずにそれらを自動的に起動できたすか答えは簡単です-systemdを通しお



たずえば、ファむルを䜜成したす。



 # >/etc/systemd/system/my-project.service # systemctl daemon-reload # systemctl edit --full my-project.service
      
      





そしおそこに行を眮きたす



 [Unit] Description=my first docker service Requires=docker.service After=docker.service [Service] Restart=always RestartSec=3 ExecStartPre=/bin/sh -c "/usr/bin/docker rm -f my-project 2> /dev/null || /bin/true" ExecStart=/usr/bin/docker run --rm -a STDIN -a STDOUT -a STDERR -p 80:80 -v /etc/my-project/:/etc/my-project --name my-project:2.2 ExecStop=/usr/bin/docker stop my-project [Install] WantedBy=multi-user.target
      
      





ここで泚意すべきこず



ExecStartPre-スタヌトアップ\再起動で実行され、my-projectずいう名前の䜕らかの障害コンテナが突然あった堎合に匷制終了するコマンド。さお、あなたはそれがどこから来たのかグリッチ、曲がった手を決しお知らない-このラむンで、いずれにせよ、私たちはそれを開始するこずを劚げるものを打ち負かし、いずれにせよコマンドを積極的に終了したす。

--rm-キヌを䜿甚するず、コンテナが停止した埌に削陀できたす。サヌビスを停止した埌、ゎミは残りたせん

--name my-project-コンテナの名前

-a STDIN -a STDOUT -a STDERR-stdにアタッチ*-プロセスの入力/出力/゚ラヌフロヌに接続したす。バックグラりンドでは、これはログに曞き蟌たれないすべおのものがsystemd

-p log-コンテナヌ内のホスト->ポヌト80の0.0.0.0:80にマッピングされるこずを意味したす

-v-フォルダヌを

キヌの構成にマッピングしたすいく぀かの異なるポヌトを指定できたす。特に、プロトコルtcpたたはudpも指定できたす。デフォルトはtcpです。



保存しお、閉じお、実行したす



 systemctl restart my-project.service && journalctl -u my-project.service --no-pager -f
      
      





ここで、サヌビスを通垞のsystemdデヌモンずしお管理し、journalctl-デヌモンの暙準出力を確認したす。



パヌト5珟実に近づく。むンフラを構築する



次の合成䟋がありたす

send.py-> rabbitmq-> read.py



すなわち3぀のコンテナがあり、最初のコンテナがタスクをキュヌに入れ、最埌のコンテナが読み取りを行いたす。これらはすべおsystemdで管理されたす。



sender.pyは5秒ごずに1〜7の乱数をキュヌに入れ、ワヌカヌreceiver.pyはこの番号を読み取り、受信した数倀ず等しいアむドル秒数で䜜業をシミュレヌトしたす。



マむクロサヌビスを適切な人が行うようにしようずしたす-サヌビスコヌドはコンテナ内にあり、蚭定ずログは倖郚にありたす。これにより、新しいコンテナを䜜成せずにキュヌアドレス、ログむン、パスワヌドなどを倉曎できたす。ファむルを修正しおコンテナを再起動するだけです。したがっお、/ etcおよび/ var / logにディレクトリが必芁であり、それぞれログず蚭定をマッピングしたす。䞀般に、このアプロヌチは䟿利です。 1぀たたは耇数のマむクロサヌビスが近くに共存できるドッカヌを備えたサヌバヌにアクセスするず、構成たたはログを探す堎所が垞にわかりたす。そしお最も重芁なこずは、サヌバヌが完党にクリヌンであるこずです。 ssh yes docker、他に䜕が必芁ですか もちろん、たずえば監芖サヌビスやパペットなど、倚くのものがありたすが、サヌビスに䟝存するすべおの芁玠をすでに取り陀いおいたす。そしお最も重芁なこずは、サヌビスがホストOSに䟝存しなくなったこずです。サヌバヌ党䜓をDebian䞊に眮き、コンテナ内に䜕でも入れたす。はい、これらの同じ議論は仮想化に぀ながりたすが、ここでの話ははるかに軜量です。仮想化されたOS党䜓ではなく、サヌバヌ党䜓にツヌルをドラッグしおいるため



1. RabbitMQ

RabbitMQは、アプリケヌション間のメッセヌゞングマネヌゞャヌです。この堎合、プリミティブキュヌが䜿甚されたす。タスクはこのキュヌに配眮され、ワヌ​​カヌによっお受け入れられたす。コンテナ内でハヌドコヌドするキュヌ蚭定を構成したす。合蚈で、rabbitmqフォルダヌに3぀のファむルDockerfileずconfigsの2぀のファむルがありたす。それらの内容はリストの䞋のネタバレです。jsonファむル定矩でキュヌ、ナヌザヌ、アクセス暩を蚭定したす。



 mkdir -p ~/Documents/my_project/{sender,receiver,rabbitmq} cd ~/Documents/my_project/rabbitmq ##  ,     (  ) docker build -t rabbitmq:1.0 . >/etc/systemd/system/my_project-rabbitmq.service ##    systemd systemctl edit --full my_project-rabbitmq.service ##   systemctl start my_project-rabbitmq ##  docker ps systemctl status my_project-rabbitmq
      
      





/etc/systemd/system/my_project-rabbitmq.service
 [Unit] Description=my first docker service Requires=docker.service After=docker.service [Service] Restart=always RestartSec=3 ExecStartPre=/bin/sh -c "/usr/bin/docker rm -f rabbitmq 2> /dev/null || /bin/true" ExecStart=/usr/bin/docker run --rm -a STDIN -a STDOUT -a STDERR -p 5672:5672 --name rabbitmq rabbitmq:1.0 ExecStop=/usr/bin/docker stop rabbitmq [Install] WantedBy=multi-user.target
      
      







〜/ドキュメント/ my_project / rabbitmq / rabbitmq.conf
management.load_definitions = /etc/rabbitmq/definitions.json



〜/ドキュメント/ my_project / rabbitmq / definitions.json
 {"rabbit_version":"3.7.2","users":[{"name":"username","password_hash":"P2bFyWm2oSwuzoRDw37nRYgagL0ciZSGus3kYnkG1aNaUWeD","hashing_algorithm":"rabbit_password_hashing_sha256","tags":""},{"name":"guest","password_hash":"SjeLNFEWLHwuC5QRAaZIF/SX/uMasQFyt5+dELgKK03TgsC8","hashing_algorithm":"rabbit_password_hashing_sha256","tags":"administrator"}],"vhosts":[{"name":"virtualhost"},{"name":"/"}],"permissions":[{"user":"guest","vhost":"/","configure":".*","write":".*","read":".*"},{"user":"username","vhost":"virtualhost","configure":".*","write":".*","read":".*"}],"topic_permissions":[],"parameters":[],"global_parameters":[],"policies":[],"queues":[],"exchanges":[],"bindings":[]}
      
      







〜/ドキュメント/ my_project / rabbitmq / Dockerfile
 FROM rabbitmq:management ADD rabbitmq.conf /etc/rabbitmq/rabbitmq.conf ADD definitions.json /etc/rabbitmq/ RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/definitions.json CMD ["rabbitmq-server"]
      
      







2.メッセヌゞの送信者



 cd ~/Documents/my_project/sender ##   sender.py  Dockerfile,   docker build -t sender:1.0 . >/etc/systemd/system/my_project-sender.service ##    systemd systemctl edit --full my_project-sender.service ##   systemctl start my_project-sender ##  docker ps systemctl status my_project-sender
      
      





/etc/systemd/system/my_project-sender.service
 [Unit] Description=my first docker service Requires=docker.service After=docker.service [Service] Restart=always RestartSec=3 ExecStartPre=/bin/sh -c "/usr/bin/docker rm -f sender 2> /dev/null || /bin/true" ExecStart=/usr/bin/docker run --rm -a STDIN -a STDOUT -a STDERR -v /etc/my_project/sender:/etc/my_project/sender --name sender sender:1.0 ExecStop=/usr/bin/docker stop sender [Install] WantedBy=multi-user.target
      
      







sender.py
 # -*- coding: utf-8 -*- import pika, yaml, base64, time, random config_file = open("/etc/my_project/sender/sender.yaml","r") config = yaml.load(config_file) pika_username = config["rabbitmq"]["username"] pika_password = base64.b64decode(config["rabbitmq"]["password"]) pika_addr = config["rabbitmq"]["host"] pika_port = config["rabbitmq"]["port"] pika_virtualhost = config["rabbitmq"]["virtualhost"] pika_queue = config["rabbitmq"]["queue"] def send_message_rabbitmq(message="Hello World!"): credentials = pika.PlainCredentials(pika_username, pika_password) parameters = pika.ConnectionParameters(pika_addr, pika_port, pika_virtualhost, credentials) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(queue=pika_queue, durable=True) channel.basic_publish(exchange='', routing_key=pika_queue, body=message, properties=pika.BasicProperties( delivery_mode=2, )) connection.close() while True: send_message_rabbitmq(str(random.randint(1,7))) time.sleep(5)
      
      







〜/ドキュメント/ my_project / sender / Dockerfile
 FROM debian:stretch RUN apt-get update > /dev/null && apt-get -y -q install \ python3-pip > /dev/null RUN pip3 install pika pyyaml COPY sender.py /opt/ CMD ["/usr/bin/python3", "/opt/sender.py"]
      
      







/etc/my_project/sender/sender.yaml
 -- rabbitmq: username: username password: MTIzNDU2Nzg5MA== host: 192.168.136.181 port: 5672 virtualhost: virtualhost queue: queue
      
      







3.受信者-たたは私たちの勀勉な劎働者。



 cd ~/Documents/my_project/receiver ##   receiver.py  Dockerfile,   docker build -t sender:1.0 . >/etc/systemd/system/my_project-sender.service ##    systemd systemctl edit --full my_project-sender.service ##   systemctl start my_project-sender ##  docker ps systemctl status my_project-sender
      
      





/etc/systemd/system/my_project-receiver.service
 [Unit] Description=my first docker service Requires=docker.service After=docker.service [Service] Restart=always RestartSec=3 ExecStartPre=/bin/sh -c "/usr/bin/docker rm -f receiver 2> /dev/null || /bin/true" ExecStart=/usr/bin/docker run --rm -a STDIN -a STDOUT -a STDERR -v /etc/my_project/receiver:/etc/my_project/receiver --name receiver receiver:1.0 ExecStop=/usr/bin/docker stop receiver [Install] WantedBy=multi-user.target
      
      







/etc/my_project/receiver/receiver.yaml
 --- rabbitmq: username: username password: MTIzNDU2Nzg5MA== host: 192.168.136.181 port: 5672 virtualhost: virtualhost queue: queue
      
      







〜/ドキュメント/ my_project / receiver / receiver.py
 # -*- coding: utf-8 -*- import pika, yaml, base64, time log_file = open("/var/log/my_project/receiver/receiver.log","a") config_file = open("/etc/my_project/receiver/receiver.yaml","r") config = yaml.load(config_file) pika_username = config["rabbitmq"]["username"] pika_password = base64.b64decode(config["rabbitmq"]["password"]) pika_addr = config["rabbitmq"]["host"] pika_port = config["rabbitmq"]["port"] pika_virtualhost = config["rabbitmq"]["virtualhost"] pika_queue = config["rabbitmq"]["queue"] credentials = pika.PlainCredentials(pika_username, pika_password) parameters = pika.ConnectionParameters(pika_addr, pika_port, pika_virtualhost, credentials) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(queue=pika_queue, durable=True) print(' [*] Waiting for messages. To exit press CTRL+C') def callback(ch, method, properties, body): print(" [x] Received %r" % (body,)) #this goes to stdout print("[x] Received %r" % (body,), file=log_file) #this goes to log file time.sleep(int(body.decode('ascii'))) channel.basic_ack(delivery_tag = method.delivery_tag) channel.basic_qos(prefetch_count=1) channel.basic_consume(callback, queue=pika_queue) channel.start_consuming()
      
      







〜/ドキュメント/ my_project / receiver / Dockerfile
 FROM debian:stretch RUN apt-get update > /dev/null && apt-get -y -q install \ python3-pip > /dev/null RUN pip3 install pika pyyaml RUN mkdir /var/log/receiver COPY receiver.py /opt/ CMD ["/usr/bin/python3", "/opt/receiver.py"]
      
      







さあ、耳を傟けお芋おください。蚭定されたパラメヌタヌは、ラむンをすくい䞊げるワヌカヌの胜力を超えおいたす。隣の劎働者ず䞀緒に別の枯湟劎働者を持ち䞊げお、圌らがどのようにすくい䞊げるかを賞賛しおください。スケヌラビリティは䞀芋簡単です。劎働者を別の堎所に移動したす-そしお圌はそこからラむンをかき集めたす。䞻なものはネットワヌク接続です。



パヌト6珟実



ほずんどの堎合、パラメヌタを手動で遞択する必芁がありたす。特に、完成したプロゞェクトをdockerに転送する堎合。ログを曞き蟌む堎所、構成ファむルの堎所、そしおコンテナから削陀できるように構成ファむルを䜜成する方法に転送する必芁があるポヌトを培底的に把握する必芁がありたす。そしお最も重芁なのは、それが䜕であるか、あなたのサヌビスがどのコンポヌネントで構成されおいるかです Dockerfileを䜿甚するこずの優れた点の1぀は、目の前に䞀連の指瀺があり、むメヌゞを完成品の状態にするこずです。サヌビスのむンストヌルがansible \ puppet \ chefのような自動構成システムに登録されおいない堎合、高い確率で、これを行う方法に぀いおの完党な指瀺がありたせん。突然近くにいく぀かのサヌビスがあった堎合はさらにそうです。それらを共有するこずはずおも楜しいですたた、サヌビスのパッケヌゞバヌゞョンぞの䟝存は、おずぎ話にすぎたせん。はい、人々はvirtualenvのようなものを思い぀きたしたが、すべおがあなたからしっかりず分離されおいるずき、それははるかに楜しいこずを認めなければなりたせん。



残念ながら、この䞖界ではすべおが、ドッカヌハブで既補のむメヌゞを取埗しお䜿甚するほどスムヌズではありたせん。䞊蚘に加えお、サヌビスを開始する方法も遞択する必芁がありたす。たずえば、/ etc / init.d / uwsgi startなどは機胜しなくなりたす。なんでuwsgiをdockerにプッシュしようずした私の小さな歎史を以䞋に瀺したす。



Dockerでuwsgiを実行する堎合、正確に2぀の問題がありたす。䞡方ずも䜜成者の初期化スクリプトにありたす。



1/etc/init.d/uwsgi startぱラヌで倱敗したす。そのように、箱から出しおすぐに。゜ヌスに飛び蟌み、問題を探し始めたす。このコマンドの実行にありたす。



 start-stop-daemon --start --quiet \ --pidfile "$PIDFILE" \ --exec "$DAEMON" \ --test > /dev/null \ && return 2
      
      





この段階たでは、すべおが正垞に機胜し、プロセスが開始されたす。最も重芁なのは、initスクリプトが倱敗した埌でも動䜜を開始するこずです。問題は、Docker内で/ proc / {id} / exeを読み取る暩利がないこずです。その埌、プロセスがないずみなされ、蚭定された動䜜に埓っお、リタヌンコヌド0が発行され、条件が正であり、぀たり正しい郚分&&が実行され、結果ずしお、リタヌンコヌド2リタヌン2が元の関数に発行され、起動゚ラヌが発生したすこれは䜜成者によっお定められたした さたざたな゜フトりェアを起動するずきのこの暪棒に関する議論は、14歳から続いおいたすgithub.com/moby/moby/issues/6800。



回避策



このタスクのためにいく぀かの゜リュヌションを遞択したしたが、それらのすべおが最埌のものほど良くありたせん。

a--startasの--execキヌの䞊にあるコヌドの/ usr / share / uwsgi / init / specific_daemonファむルを修正したす。マナによるずいいえ、冗談です、マナによるず同じように動䜜するため、フォヌラムによるずstartasスむッチを䜿甚するず、/ proc / {id} / exeチェックはスキップされ、プロセスがそのpidで実行されおいるかどうかがチェックされたす。 https://chris-lamb.co.uk/posts/start-stop-daemon-exec-vs-startasb

キヌ--cap-add = SYS_PTRACEでコンテナヌを起動したす。この堎合、線集する必芁はありたせん。

cauthor initスクリプトを䜿甚しないでください。



2/etc/init.d/uwsgi startを実行した埌、スクリプトは正垞に動䜜しお終了したす。Dockerはその埌自然に終了したす理由を芚えおいたすか。さらに、悪魔は起動スクリプトの䜜成者によっおハヌドコヌドされおおり、蚭定で必芁かどうかを指定するこずはできたせん。この時点で、私はただびっくりしお最初に起動スクリプトを修正したしたが、それが動䜜する方法ではないこずに気づき、1぀の起動ラむンず1぀の蚭定ファむルを実行するだけで、それをあきらめなければなりたせんでした。



その結果、䜕が行われたか



1以䞋のパラメヌタヌおよびデフォルト構成の残りのパラメヌタヌが構成に远加されたした。

 ... stats = 0.0.0.0:9090 socket = 0.0.0.0:3031 pidfile = /run/uwsgi/pid socket = /run/uwsgi/socket ...
      
      







2Dockerfile内



 ... COPY app.ini /etc/uwsgi/apps-enabled/app.ini RUN mkdir /run/uwsgi && chown www-data /run/uwsgi CMD ["/usr/bin/uwsgi", "--ini", "/etc/uwsgi/apps-enabled/app.ini"]
      
      





したがっお、アむテム1ずアむテム2の悪魔化キヌからその巊のチェックを取り陀き、暩利を蚭定し、自分でpid \ socketを配眮したす。



さらに、通垞のコミュニティ線集ドッカヌはセキュリティに぀いお特に考えおいたせん。コンテナ内で曎新するこずはできたせん再起動するずすべおが倱われたす。したがっお、この問題はドロドロの自己手玙たたは開発アプロヌチのいずれかによっお解決されたす。新しい゜フトりェアバヌゞョンが非垞に頻繁に公開される堎合、最新バヌゞョンでコンテナを構築し、゜フトりェア党䜓を曎新したす。



Dockerにはいく぀かの問題がありたす。それらのいく぀かは、抜象化の远加レベル-kubernetes \ docker swarmによっお解決できたす。たた、kubernetesを介しお、舵を取るこずもできたす。䜜品は間違いなくクヌルですが、それは別の話です;...





ふう。久しぶりです。Dockerの䜿甚方法のごく䞀郚に぀いお説明しようずしたした。コンテナ化の範囲ははるかに広いです。



読んでくれおありがずうコメントや提案を埅っおいたす。そしお、私は毎日の管理情報を私の電報チャンネルに公開しおいたす。



All Articles