Docker。 なぜ、どのように

既にdockerを使用している人のための多くの 優れた 出版物があります。 これを学びたい人のための良い記事があります。 dockerが何であるかを知らないだけでなく、知る価値があるかどうかわからない人のために書いています。



私は意図的にいくつかの技術的な詳細を省略し、いくつかの場所では単純化を許可しています。 Dockerが必要なものであることがわかれば、他の記事でより完全で正確な情報を簡単に見つけることができます。



まず、いくつかの一般的な問題について説明します。



問題



最初の問題は、製品をクライアントに転送する方法です。



完了したサーバープロジェクトがあり、それをユーザーに転送する必要があるとします。 多くの異なるファイル、スクリプトを準備し、インストール手順を記述します。 そして、「何もうまくいかない」、「スクリプトが途中で落ちた-今何をすべきか」、「指示のステップの順序を間違えたため先に進めない」などのクライアントの問題を解決するために多くの時間を費やします。



製品が複製され、1つのクライアントではなく数百または数千の顧客がいる場合、すべてが悪化します。 製品の新しいバージョンをインストールする必要性を思い出すと、さらに難しくなります。



2番目の問題は複製可能性です。 5(または50)のほぼ同一のサーバーを上げる必要があります。 手作業で行うと、長く、費用がかかり、エラーが発生しやすくなります。



最後に、3番目の問題は再利用です。 ブラウザゲームを作成する部門があるとします。 すでにいくつかあるとします。 そして、それらはすべて同じテクノロジースタック(たとえば、java-tomcat-nginx-postgre)を使用します。 しかし、同時に、新しいゲームを作成するために、新しいサーバーでほぼ同じ構成を再準備する必要があります。 あなたはそれを受け取って言うことはできません-「ゲームの放浪者のようにサーバーが欲しいのですが、別のウェブアーカイブだけが必要です」



一般的なソリューション



これらの問題の通常の解決方法。



インストールスクリプト



最初のアプローチについては既に説明しました。必要なものをすべてインストールし、必要なすべてのサーバーで実行するスクリプトを作成できます。 (スクリプトは、単純なshファイルでも、特別なツールを使用して作成された複雑なものでもかまいません)。



このアプローチの欠点は、脆弱性とエラー耐性です。 スクリプトがどれほどうまく書かれていても、遅かれ早かれ、何らかのマシンに落ちます。 そして、このクラッシュの後、マシンは実際に「台無し」になります-スクリプトが実行できたアクションを「ロールバック」するだけで、クライアントは成功しません。



クラウドサービス



2番目のアプローチは、クラウドサービスの使用です。 必要なものはすべて、仮想サーバーに手動でインストールします。 その後、イメージを行います。 そして、必要な回数だけ複製します。



ここには2つの欠点があります。 まず、ベンダーロックイン。 選択したクラウドの外部でソリューションを実行することはできません。常に便利であるとは限らず、この選択に同意しない顧客が失われる可能性があります。 第二に、雲が遅いです。 現在クラウドによって提供されている仮想(および「ベアメタル」)サーバーは、専用サーバーに比べてパフォーマンスがはるかに劣っています。



仮想マシン



3番目のアプローチは、仮想マシンの使用です。 ここにも欠点があります:



サイズ-仮想マシンのイメージをダウンロードすることは必ずしも便利ではありません。非常に大きくなる可能性があります。 同時に、仮想マシンのイメージ内の変更には、イメージ全体を再度ダウンロードする必要があります。



高度なサーバーリソース共有管理-すべての仮想マシンがメモリまたはCPU共有を一般的にサポートしているわけではありません。 サポートするものは微調整が必​​要です。



Dockerアプローチ-コンテナー化



そして、ここにドッカーが表示されます





仮想マシンと同様に、Dockerは独自の事前構成済みオペレーティングシステムでプロセスを実行します。 ただし、同時に、すべてのdockerプロセスは、ホストシステムで実行されている他のすべてのプロセスとすべてのプロセッサおよび使用可能なメモリを共有する物理ホストサーバーで動作します。 Dockerで使用されるアプローチは、物理サーバーですべてを実行することと、仮想マシンによって提供される完全な仮想化の中間にあります。 このアプローチは、コンテナ化と呼ばれます。



Dockerの仕組み



画像作成



最初に、Dockerイメージ(またはイメージ)が作成されます。 このために作成したスクリプトを使用して作成されます。

画像は継承されます。通常、最初の画像を作成するために、完成した画像を取得してそれを継承します。

ほとんどの場合、このバージョンまたはそのバージョンのLinuxを含むイメージを使用します。 次に、スクリプトは次のようなものを開始します。



FROM ubuntu:16.04
      
      





RUN , .

RUN apt-get install -y mc



midnight commander.



, COPY.



:



COPY mzoo.war /opt/tomcat/webapps/ROOT.war
      
      





. , USER roman



roman. ENTRYPOINT [“/opt/tomcat/catalina.sh”]



, .



— . — : , Dockerfile docker build, docker image.



- , . image. .





docker image , . image – «», container «», .



— image, . , image. . , web- .



«» . , . , , . .



Union filesystem



— . ? , , — , .



. 100500 , , . union file system.



Union file system (layers). . . , , .



. , , , «» .



Container registry



, docker image . , . 100 , Ubuntu Ubuntu 100 . ?



, . , docker registry. Docker registry . ( ) docker registry. , . , , .



, , , registry , .



, registry - , , .

Docker registry open source , .





, , . . , , .





, . docker compose. , , ( A 5432 B)





:





, , «».



All Articles