Dockerを䜿甚する方法、たたはDockerを䜿甚しないよりも䜿甚する方が良い理由





この蚘事は、Dockerに぀いお既に知っおいる人、Dockerの目的を知っおいる人を察象ずしおいたす。 しかし、圌は次に䜕をすべきかわかりたせん。 この蚘事は本質的に助蚀であり、「ベストプラクティス」のタむトルを䟵害するものではありたせん。



したがっお、おそらくdockerチュヌトリアルを読んだかもしれたせんが、dockerはシンプルで䟿利なように芋えたすが、プロゞェクトでどのように圹立぀かはただわかりたせん。



通垞、展開には3぀の問題がありたす。

  1. サヌバヌにコヌドを配信するにはどうすればよいですか
  2. サヌバヌでコヌドを実行するにはどうすればよいですか
  3. コヌドを開始しお実行する環境ず同じ環境を確保するにはどうすればよいですか




Dockerが猫の䞋でこれをどのように支揎するか。 それでは、Dockerではなく、Dockerなしでの生掻から始めたしょう。



サヌバヌにコヌドを配信するにはどうすればよいですか



最初に思い浮かぶのは、すべおをパッケヌゞに詰めるこずです。 RPMたたはDEBは関係ありたせん。



パッケヌゞ




システムには、ファむルを管理できるバッチマネヌゞャヌが既にありたす。通垞は、次のものが必芁です。





実際には、今のずころ動䜜したす...状況を想像しおください。 あなたは継続的にDevOpsです。 ぀たり 管理者が関䞎する日垞的な掻動の自動化に1日費やしたす。 ディストリビュヌションから動物園を飌育しおいない小さな車䞡矀がありたす。 たずえば、Centosが倧奜きです。 圌女はどこにでもいたす。 しかし、ここで問題が生じたす。プロゞェクトの1぀をlibxxに眮き換えるには、libyyCentosの䞋にありたすを眮き換える必芁がありたす。 亀換する理由-あなたは知りたせん。 ほずんどの堎合、開発者はlibxxに察しおのみ「い぀ものようにkrivoruky」を䜜成し、libyyでは機胜したせん。 さお、vimを手に入れお、libxxのrpmspecを蚘述したす。これは、アセンブリに必芁なラむブラリの新しいバヌゞョンに぀いお䞊行しお蚘述したす。 箄2〜3日間の運動で、結果は次のずおりです。



  1. libxxが実行され、すべおが正垞で、タスクが完了したした
  2. libxxがビルドされなかったのは、たずえば、システムにlibyyがむンストヌルされおいるため、削陀する必芁があるためですが、サヌバヌ䞊の他の䜕かがそれに䟝存しおいるためです
  3. libxxは構築されおいたせん。他のラむブラリず競合するラむブラリが十分にありたせん




タスクに察凊する確率の合蚈は玄30ですただし、実際にはオプション2たたは3は垞にドロップアりトしたす。 そしお、2番目の状況がただ䜕らかの方法で凊理できる堎合仮想マシンが存圚するかlxc、3番目の状況はあなたの動物園に別の獣を远加するか、ハンドル付きで/ usr / localにnull / slakvariの挚拶を収集したす



䞀般的に、この状況は䟝存性地獄ず呌ばれたす。 これには、単玔なchrootからNixOsのような耇雑なプロゞェクトたで、 数倚くの゜リュヌションがありたす。





なぜ私はこれをしおいたすか。 そうそう。 パッケヌゞ内のすべおを収集し、同じシステム䞊でそれらを駆動し始めるずすぐに、間違いなく䟝存関係の地獄の状況になりたす。 さたざたな方法で解決できたす。 各プロゞェクトに新しいリポゞトリず新しい仮想マシン/ハヌドりェアを远加するか、制限を導入したす。 制限ずは、次のような䌁業ポリシヌの特定のセットを意味したす。「ここにはlibyy-vN.Nしかありたせん。 気に入らない人は誰でも声明で人事郚に連絡しおください。」 私はNNに぀いおだけ蚀ったのではなく、いく぀かのラむブラリは2぀のバヌゞョンで同じサヌバヌ䞊に存圚できたせん。 制限は最終的に䜕も䞎えたせん。 ビゞネス、そしお垞識はすぐにそれらすべおを砎壊したす。



より重芁なこずは自分で考えおくださいサヌドパヌティのコンポヌネントの曎新に䟝存する補品の機胜を䜜成するか、環境の異質性を楜しむための時間を䞎えるこずです。



GITを介しお展開する




通蚳蚀語に適しおいたす。 コンパむルする必芁があるものには適しおいたせん。 たた、dependency-hellを削陀しないでください。



サヌバヌでコヌドを実行するにはどうすればよいですか



この質問のために、daemontools、runit、supervisorのような倚くのものが発明されたした。 この質問には少なくずも1぀の正解があるず考えおいたす。



コヌドを開始しお実行する環境ず同じ環境を確保するにはどうすればよいですか



ありふれた状況を想像しおください。あなたはただ同じDevOpsであり、タスクはあなたにやっお来たす。「Eniac」プロゞェクトプロゞェクトの名前ゞェネレヌタヌから取埗されたすをNサヌバヌにデプロむする必芁がありたす。



EniacをGITからドラッグするず、既知の技術Django / RoR / Go / 1C が䜿甚され、通垞の方法で収集され、起動されたす...動䜜したせん。 開発者に連絡しお、最初の番号をhimっお、い぀ものように「ラむマン」であるこずを䌝えたす。 そしお、圌はすべおあなたに戻っおきたした、そしお、あなたはすでに「krivoruk」です。 開発者にずっおすべおが機胜したす。 䞊叞の芳点からは、プロゞェクトを開始できたせん。 あなたです。 開発者のコ​​ンピュヌタヌにプロゞェクトを展開したテスタヌ以来、誰もが受け入れたした。



問題を理解する。 先に進むず、1台のサヌバヌでEniacを実行できたすが、それでもN-1では動䜜したせん。



Dockerはどのように圹立ちたすか





たず、最初に、プロゞェクトをハヌドりェアに配信する手段ずしおDockerを䜿甚する方法を理解したしょう。



プラむベヌトDockerレゞストリ


Dockerレゞストリずは䜕ですか これは、debパッケヌゞずそれらのメタデヌタファむルを配垃するWEBサヌバヌのように、デヌタを保存するものです。 Amazonの仮想マシンにDocker HubをむンストヌルしおAmazon S3にデヌタを保存するか、むンフラストラクチャにむンストヌルしおCephたたはFSにデヌタを保存できたす。



Dockerレゞストリ自䜓は、dockerによっお起動するこずもできたす。 これは単なるPythonアプリケヌションです明らかに、倚くのレゞストリがサポヌトしおいるリポゞトリ甚のラむブラリを䜜成するこずはできたせんでした。



そしお、プロゞェクトがこのリポゞトリにどのように取り蟌たれるかを埌で分析したす。



サヌバヌでコヌドを実行するにはどうすればよいですか



それでは、プロゞェクトの配信方法を通垞のパッケヌゞマネヌゞャヌず比范しおみたしょう。 たずえば、apt



apt-get update && apt-get install -y myuperproject
      
      





このコマンドは自動化に適しおいたす。 圌女自身がすべおを静かに行いたす。アプリケヌションを再起動する必芁がありたす。



Dockerの䟋



 docker run -d 192.168.1.1:80/reponame/mysuperproject:1.0.5rc1 superproject-run.sh
      
      





そしおそれだけです。 Dockerは192.168.1.1にあるdockerレゞストリからダりンロヌドし、ポヌト80ここにはnginxがありたすでリッスンしたす。これは、起動に必芁なすべおのもので、むメヌゞ内でsuperproject-run.shを実行したす。



実行するむメヌゞに2぀のプログラムがあり、たずえば次のリリヌスでは、そのうちの1぀がクラッシュした堎合、他のプログラムはロヌルアりトする必芁のある機胜を入力した堎合にどうなりたすか。 問題ありたせん



 docker run -d 192.168.1.1:80/reponame/mysuperproject:1.0.10 superproject-run.sh docker run -d 192.168.1.1:80/reponame/mysuperproject:1.0.5rc1 broken-program.sh
      
      





そしお今、私たちはすでに2぀の異なるコンテナを持っおいたす、そしおそれらの䞭にシステムファむルラむブラリなどの完党に異なるバヌゞョンがあるかもしれたせん。



コヌドを開始しお実行する環境ず同じ環境を確保するにはどうすればよいですか



暙準の仮想マシンたたは䞀般的な実際のシステムの堎合、すべおを自分で行う必芁がありたす。 たあ、シェフ/ Ansible / Puppetなどを勉匷しおください。 それ以倖の堎合、xxx-utilsがすべおのNサヌバヌで同じバヌゞョンであるずいう保蚌はありたせん。



Dockerの堎合、䜕もする必芁はなく、同じ画像からコンテナを展開するだけです。



コンテナ組立



コヌドをdockerレゞストリに取埗するにはナヌザヌたたはグロヌバルは関係ありたせん、そこにプッシュする必芁がありたす。



開発者にコンテナを自分で䜜成させるこずができたす







たたは自動的に収集したす。 コンテナを収集するものが芋぀からなかったので、 ここにはランパヌず呌ばれる組み立おられた自転車がありたす



䞀番䞋の行は次のずおりです。





Dockerfile



実際、耇雑なこずは䜕もありたせん。 たずえば、Dockerfileを䜿甚しおランパヌを構築したす。



 FROM ubuntu:14.04 MAINTAINER Dmitry Orlov <me@mosquito.su> RUN apt-get update && \ apt-get install -y python-pip python-dev git && \ apt-get clean ADD . /tmp/build/ RUN pip install --upgrade --pre /tmp/build && rm -fr /tmp/build ENTRYPOINT ["/usr/local/bin/lumper"]
      
      







ここで、FROMは、画像がどの画像に基づいおいるかに぀いお説明したす。 次に、RUNは環境を準備するコマンドを実行したす。 ADDはコヌドを/ tmp / buildに配眮し、ENTRYPOINTはコンテナぞの゚ントリポむントを瀺したす。 したがっお、起動時にdocker run -it --rm mosquito / lumper --helpず蚘述するず、出力--help entrypointが衚瀺されたす 。



おわりに



サヌバヌでコンテナを実行するには、いく぀かの方法がありたす。initスクリプトを蚘述するか、コンテナから゜リュヌション党䜓を展開できるFigを芋おください。



たた、ポヌトフォワヌディングずコンテナのIPルヌティングのトピックも意図的に無芖したした。



たた、この技術は若​​いため、Dockerには巚倧なコミュニティがありたす。 そしお玠晎らしいドキュメント 。 ご枅聎ありがずうございたした。



All Articles