Docker、それは何で、目的は何ですか


111

数日前にDockerについて聞いたことがあります。

しかし、実際には、この「コンテナ」の目的は何なのかわかりません。

コンテナとは?

開発専用の仮想マシンを置き換えることはできますか?

企業でDockerを使用する目的は何ですか?主な利点は?



回答:


115

VM: VMソフトウェアを使用すると、UbuntuをWindows内にインストールできます。そして、両方が同時に実行されます。これは、オペレーティングシステム内でCPU、RAM、ディスク、ネットワークカードなどのコアコンポーネントを備えたPCを構築し、実際のP​​Cのように動作するようにそれらを組み立てるようなものです。このようにして、仮想PCは、ホストと呼ばれるオペレーティングシステムを備えた実際のPC内の「ゲスト」になります。

コンテナー:上記と同じですが、オペレーティングシステム全体を使用する代わりに、仮想OSの「不要な」コンポーネントを削減して、最小バージョンの仮想OSを作成します。これにより、LXC(Linux Containers)が作成されました。VMマシンよりも高速です。

Docker:仮想マシンやコンテナーとは異なり、Dockerコンテナーは別個のオペレーティングシステムを必要とせず、含めることもできません。代わりに、Linuxカーネルの機能に依存し、リソース分離を使用します。
Dockerの目的:その主な焦点は、ソフトウェアコンテナー内のアプリケーションの展開の自動化と、Linuxでのオペレーティングシステムレベルの仮想化の自動化です。標準のコンテナよりも軽量で、数秒で起動します。 ggg

(Dockerの場合、ゲストOSは必要ないことに注意してください)


1
dockerの開発と展開のワークフローに関するリソースを探してみましたが、何も見つからないようです。たとえば、laravel + angular4のlampp環境があるとします。チームメイトと特定のファイルを共有しますか?コンテナー内に配置した場合、アプリケーションソース(php html js / ts)を編集するにはどうすればよいですか?ソースコードでgit / svnを使用できますか?
アナバー

13
VMは「仮想マシン」の略です。それが「仮想マシンマシン」になるため、「VMマシン」と呼ぶ必要はありません。:)
Dzhuneyt

32

[注:この回答はLinuxコンテナに焦点を当てているため、他のオペレーティングシステムには完全には当てはまらない場合があります。]

コンテナとは?

それはアプリです:コンテナは、互いに分離されたアプリケーションを実行する方法です。コンテナーは、ハードウェアを仮想化して複数のオペレーティングシステムを実行するのではなく、オペレーティングシステムを仮想化して複数のアプリケーションを実行することに依存しています。つまり、OSのコピーが1つしか実行されておらず、アプリのインスタンスごとにメモリとCPUコアを事前に割り当てる必要がないため、同じハードウェアでVMよりも多くのコンテナを実行できます。他のアプリと同じように、コンテナーがCPUまたはメモリを必要とする場合、コンテナーはそれらを割り当て、完了時にそれらを解放し、他のアプリが後で同じ制限されたリソースを使用できるようにします。

それらはカーネルの名前空間を利用します:デフォルトでは、各コンテナーは以下が名前空間になっている環境を受け取ります:

  • マウント:ファイルシステム、/コンテナ内は/ホスト上とは異なります。
  • PID:プロセスID、コンテナ内のpid 1は起動されたアプリケーションです。このpidはホストから表示すると異なります。
  • ネットワーク:コンテナーは、デフォルトで独自のループバックインターフェイス(127.0.0.1)とプライベートIPで実行されます。Dockerは、Linuxブリッジネットワークなどのテクノロジーを使用して、複数のコンテナーをそれぞれのプライベートLANに接続します。
  • IPC:プロセス間通信
  • UTS:これにはホスト名が含まれます
  • ユーザー:すべてのユーザーIDをホストのオフセットからオフセットするようにオプションでシフトできます

また、これらの名前空間のそれぞれは、明示的にその分離を削除しない限り、ホストからのファイルシステムやプロセス、または他のコンテナー内のものをコンテナーが認識できないようにします。

その他のLinuxセキュリティツール:コンテナーは、SELinux、AppArmor、Capabilities、Seccompなどの他のセキュリティ機能も利用して、ルートユーザーを含むコンテナー内のユーザーがコンテナーをエスケープしたり、ホストに悪影響を与えたりできないようにします。

移植性のためにアプリを依存関係とともにパッケージ化する:アプリケーションをコンテナーにパッケージ化するには、アプリケーション自体だけでなく、そのアプリケーションを実行するために必要なすべての依存関係をポータブルイメージにアセンブルする必要があります。このイメージは、コンテナーの作成に使用される基本ファイルシステムです。アプリケーションを分離するだけなので、このファイルシステムには、オペレーティングシステム全体を仮想化するために必要なカーネルやその他のOSユーティリティは含まれていません。したがって、コンテナーのイメージは、同等の仮想マシンのイメージよりも大幅に小さくする必要があります。これにより、ネットワーク全体のノードへの展開が速くなります。その結果、コンテナーは、アプリケーションをクラウドおよびリモートデータセンターに展開するための一般的なオプションになりました。

開発専用の仮想マシンを置き換えることはできますか?

それは依存します:開発環境は、Linuxを実行している、とあなたはどちらかのハードウェアデバイスへのアクセスを必要としない、または物理的なハードウェアへの直接アクセスを持っていることが許容される場合、あなたはかなりまっすぐ進むのLinuxコンテナへの移行を見つけることができます。Dockerコンテナの理想的なターゲットは、ネットワーク経由でアクセスするWebベースのAPI(RESTアプリなど)のようなアプリケーションです。

企業でDockerを使用する目的は何ですか?主な利点は?

開発または運用:Dockerは通常、2つのパスのいずれかで環境に導入されます。アプリケーションをより迅速に開発してローカルでテストする方法を探している開発者、および仮想マシンで可能な場合よりも少ないハードウェアでより多くのワークロードを実行しようとしている操作。

またはDevops:理想的なターゲットの1つは、CI / CDデプロイメントツールからすぐにDockerを活用し、アプリケーションをコンパイルして、開発、CI、製品などにデプロイされるイメージをすぐに構築することです。コンテナは、多くの場合、アプリケーションを移動する時間を短縮しますコードのチェックインからテストに利用できるようになるまで、開発者はより効率的になります。また、適切に設計すると、開発者およびCIツールによってテストおよび承認されたものと同じイメージを実稼働環境にデプロイできます。そのイメージにはすべてのアプリケーションの依存関係が含まれているため、開発で機能した本番環境で何かが壊れるリスクは大幅に軽減されます。

スケーラビリティ:コンテナーの最後の重要な利点の1つは、水平方向のスケーラビリティを考慮して設計されていることです。負荷の高い状態のないアプリがある場合、イメージサイズが小さくなり、オーバーヘッドが減少するため、コンテナーのスケールアウトははるかに簡単で高速になります。このため、GoogleやNetflixなど、多くの大規模なWebベースの企業でコンテナが使用されています。


2
+1私はあなたの答えに完全に同意します。特に、「仮想マシンを置き換えることはできますか」という部分に同意します。Dockerは仮想マシンではないことを強調するコメントが他にもたくさんありますが、経験から、多くのユースケースでは、それは同じように機能するか、より優れた代替手段です。「物理ハードウェアに直接アクセスできることは許容できる」と言ったとき、どういう意味ですか?
タイレス、

2
@tyressホストがLinuxの場合、デバイスを直接Linuxコンテナーにマウントできます。私はそれがサウンドデバイスで行われるのを見てきましたが、/ devの何でも追加できます。これは一部のコンテナー分離をバイパスしますが、デスクトップアプリなどの特定のタスクには意味があります。
BMitch 2017

すごい。私はそのことを考えていませんでした。
タイレス、

@BMitch:非常にクリーンでエレガントな答え、thx !! コンテナーが何であるかを視覚化できるようになったと思います。しかし、コンテナーがDockerにどのように関連付けられているかで答えを更新できればすばらしいでしょう コンテナーとVMを比較すると、Dockerはハイパーバイザーと同等ですか?
rahulaga_dev '19年

1
Dockerは、コンテナーを実装するツールであり、Linuxコンテナーを実行するためにVMを組み込んだ、Dockerハブやデスクトップ環境のレジストリなど、必要な残りのエコシステムを提供します。
BMitch

6

同じ質問が数日前に頭に浮かびました。私がそれに頭を悩ませた後に見つけたものは、非常に単純な言葉で理解しましょう。

アプリケーションのアーキテクチャと開発の現在のプロセスですべてが問題ないように見えるのに、なぜdockerとコンテナーについて考えるのでしょうか。

nodeJs、MongoDB、Redis、RabbitMQなどのサービスを使用してアプリケーションを開発している例を考えてみましょう(他のサービスも考えられます)。

ここで、Dockerやアプリケーションをコンテナ化する他の代替手段の存在を忘れた場合、アプリケーション開発と出荷プロセスの問題として、次のことに直面します。

  1. OS とのサービス(nodeJs、mongoDB、Redis、RabbitMQなど)の互換性(OSとの互換性のあるバージョンを見つけた後でも、バージョンに関連して予期しない問題が発生した場合は、互換性を再検討して修正する必要があります)。

  2. 2つのシステムコンポーネントがOSのアプリケーションで異なるバージョンのライブラリ/依存関係を必要とする場合(ライブラリと依存関係のバージョンの問題が原因でアプリケーションの予期しない動作が発生した場合は、毎回再検討が必要です)。

  3. 最も重要なのは、新しい人がチームに加わった場合、新しい環境をセットアップするのが非常に難しいことです。人は大量の指示に従い、何百ものコマンドを実行して最終的に環境をセットアップする必要があり、時間と労力がかかります。

    人々は彼らが正しいバージョンのOSを使用していることを確認し、OSとのサービスの互換性をチェックする必要があります。そして、各開発者はセットアップ中に毎回これに従う必要があります。

  4. 開発、テスト、本番などの環境異なります。一方の開発者が一方のOSを快適に使用でき、もう一方が他のOSを快適に使用できる場合、この2つの異なる状況でアプリケーションが同じように動作することを保証できません。 。

これらはすべて、アプリケーションの開発テスト、および出荷のプロセスにおいて私たちの生活を困難にします。

したがって、互換性の問題処理し、他のコンポーネントに影響を与えずにシステムコンポーネントの変更や修正を行うことができるものが必要です。

アプリケーションのコンテナー化とアプリケーションのデプロイメントの自動化、およびそれらの出荷を非常に簡単にすることが目的であるため、ここでdockerについて考えます。

ここに画像の説明を入力してください

dockerが上記の問題を解決する方法

  1. それぞれのサービスコンポーネント(nodeJs、MongoDB、Redis、RabbitMQ)を、同じOSの異なる環境の独自の依存関係ライブラリーを持つ異なるコンテナーで実行できます。

  2. docker設定を一度実行するだけで、すべてのチーム開発者が単純なdocker runコマンドで開始できます。ここで時間と労力を大幅に節約できました:)

そのため、コンテナは分離された環境であり、すべての依存関係とライブラリが独自のプロセスネットワークインターフェイスマウントと一緒にバンドルされています

すべてのコンテナーは同じOSリソースを使用するため、ハードウェアコストを抑えながら、起動にかかる時間を短縮し、CPUを効率的に使用します。

これがお役に立てば幸いです。


2

できるだけ簡単な答えを出してみます。

しかし、実際には、この「コンテナ」の目的は何なのかわかりません。

コンテナとは?

簡単に言うと、ソフトウェアを含むパッケージです。具体的には、アプリケーションとそのすべての依存関係がバンドルされています。通常のドッキングされていないアプリケーション環境はOSに直接フックされますが、DockerコンテナはOS抽象化レイヤーです。

また、コンテナーは画像とは異なります。コンテナーは画像のランタイムインスタンスです。オブジェクトがOOPに精通している場合のクラスのランタイムインスタンスと同じです。

開発専用の仮想マシンを置き換えることはできますか?

VMとDockerコンテナはどちらも、システムインフラストラクチャの上に抽象化を提供するという点で、仮想化手法です。

VMは、ハイパーバイザーを介してホストリソースに仮想アクセスする完全な「ゲスト」オペレーティングシステムを実行します。つまり、VMは多くの場合、実際に必要とするよりも多くのリソースを環境に提供します。一般に、VMは、ほとんどのアプリケーションが必要とするよりも多くのリソースを環境に提供します。したがって、コンテナーはより軽量な手法です。2つは異なる問題を解決します。

企業でDockerを使用する目的は何ですか?主な利点は?

コンテナ化はマイクロサービスと密接に関連しています。大きなアプリケーションを構成する小さなサービスは、多くの場合、テストされ、Dockerコンテナで実行されます。これにより、継続的なテストが容易になります。

また、Dockerコンテナーは読み取り専用であるため、DevOpsの主要な原則が適用されます。本番サービスは変更しないでください。

それらを使用することのいくつかの一般的な利点:

  • サービスの優れた分離
  • コンテナーにはアプリが必要とするすべてが含まれているため、優れた管理性
  • 実装技術のカプセル化(コンテナー内)
  • VMと比較した場合の効率的なリソース使用率(軽量のOS仮想化による)
  • 迅速な導入
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.