DockerはWindows上で実行されますか?
はい。Docker は Windows、MacOS および Linux で利用できます。 ダウンロードリンクは次のとおりです。
仮想マシン(VM)とコンテナの違いは何ですか?
これは素晴らしい質問であり、私はこれをたくさん得ます。 仮想マシンとコンテナの違いを説明する最も簡単な方法は、VMがハードウェアを仮想化し、コンテナがOSを「仮想化」することです。
上の画像を見ると、仮想マシンテクノロジーを使用しているときに複数のオペレーティングシステムが実行されていることがわかります。 これは、フルブローオペレーティングシステムをインストールおよび保守する際の起動時間やその他のさまざまな制約とオーバーヘッドに大きな違いをもたらします。 また、VM を使用すると、さまざまな種類のオペレーティング システムを実行できます。 たとえば、Windows 10とLinuxディストリビューションを同じハードウェアで同時に実行できます。 それでは、Docker コンテナーのイメージを見てみましょう。
この図でわかるように、インフラストラクチャにインストールされているホストオペレーティングシステムは1つだけです。 Dockerは、ホストオペレーティングシステムの「上」にあります。 各アプリケーションは、アプリケーションの実行に必要なすべての構成、ライブラリ、ファイル、および実行可能ファイルを含むイメージにバンドルされます。
テクノロジーの中核となるコンテナは、OSによって実行される単なるオペレーティングシステムプロセスですが、CPUやネットワークなど、消費してアクセスできるファイルやその他のリソースに制限があります。
コンテナはホストオペレーティングシステムの機能を使用するため、カーネルを共有するため、そのオペレーティングシステム用に作成する必要があります。 したがって、たとえば、Linuxバイナリを含むコンテナをWindowsで実行することはできません。
これは基本的なことであり、もちろん技術的な詳細はもう少し複雑になる可能性があります。 ただし、これらの基本的な概念を理解すれば、仮想マシンとコンテナーの違いを十分に理解できます。
イメージとコンテナの違いは何ですか?
これは尋ねられるもう一つの非常に一般的な質問です。 混乱の一部は、コンテナについて話すときにこれらの用語を交換することがあるという事実から生じていると思います。 私はそれの罪を犯したことを知っています。
イメージは、実行中のコンテナーを作成するために Docker によって使用されるテンプレートです。 イメージを定義するには、Dockerfile を作成します。 Docker が Dockerfile 内のコマンドを読み取って実行すると、結果は "コンテナー内" で実行できるイメージになります。
コンテナは、簡単に言えば、実行中のイメージです。 イメージの複数のインスタンスを実行したり、それらを作成、開始、停止したり、ネットワークを使用して他のコンテナーに接続したりできます。
Docker と Kubernetes の違いは何ですか?
この2つの間の混乱は、開発コミュニティがこれら2つが同じ概念であるかのように話していることに起因していると思います。 そうではありません。
Kubernetes はオーケストレーターであり、Docker はコンテナーの構築、出荷、実行からプラットフォームです。 Docker 自体はオーケストレーションを処理しません。
コンテナー オーケストレーションは、簡単に言えば、オーケストレーターが管理するノード間でのコンテナーの実行を管理およびスケジュールするプロセスです。
したがって、一般的に言えば、Dockerはコンテナの1つのインスタンスをユニットとして実行します。 同じイメージの複数のコンテナーを実行できますが、Docker はそれらを 1 つの単位として管理しません。
複数のコンテナーを 1 つの 1 つとして管理するには、オーケストレーターを使用します。 Kubernetes はコンテナー オーケストレーターです。 AWS ECSとAzure ACIも同様です。
コンテナーで実行されている Web アプリケーションに接続できないのはなぜですか?
デフォルトでは、コンテナは安全で外部のネットワークトラフィックから分離されており、デフォルトではポートを公開しません。 したがって、コンテナーの外部からのトラフィックを処理できるようにする場合は、コンテナーがリッスンしているポートを公開する必要があります。 Web アプリケーションの場合、これは通常ポート 80 または 443 です。
コンテナーの実行時にポートを公開するには、–publish フラグまたは -p フラグを渡します。
例えば:
$ docker run -p 80:80 nginx
これにより、Nginxコンテナが実行され、ポート80が外部に公開されます。
Dockerネットワーキングに関するすべては、 ドキュメントで読むことができます。
1つのコンテナで複数のアプリケーションを実行するにはどうすればよいですか?
これは、仮想マシンのバックグラウンドを持つ人々から得られる非常に一般的な質問です。 その理由は、VMを操作する場合、アプリケーションをオペレーティングシステム全体を所有していると考えることができるため、複数のプロセスまたはランタイムを作成できるためです。
コンテナーを操作する場合は、ここで説明するスペースがないさまざまなアーキテクチャ上の理由から、1 つのプロセスを 1 つのコンテナーにマップすることをお勧めします。 しかし、コンテナ内で1つのプロセスを実行する最大の理由は、実証済みの真のKISS原則に関するものです。 Keep it S imple Simon.
コンテナに1つのプロセスがある場合、コンテナは1つのことと1つのことだけを行うことに集中できます。 これにより、比較的簡単にスケールアップおよびスケールダウンできます。
このブログと私の Twitter ハンドル (@pmckee) で、コンテナーとマイクロサービスを使用してアプリケーションを設計および構築する方法に関するその他のコンテンツを確認してください。
コンテナーの実行時にデータを保持するにはどうすればよいですか?
コンテナーは不変であり、コンテナーの実行が停止した後も永続化するデータをコンテナーに書き込むことはできません。 コンテナは、いつでも実行を停止し、非常に簡単に別のプロセスに置き換えられる可能性のある変更不可能なプロセスと考える必要があります。
そうは言っても、データを書き込み、コンテナに実行時に使用させるか、永続化できるデータを実行時に書き込むにはどうすればよいでしょうか。 ここでボリュームが役立ちます。
ボリュームは、永続データの書き込みと読み取りに適したメカニズムです。 ボリュームは Docker によって管理され、コンテナーの外部に移動、コピー、および管理できます。
ローカル開発では、バインドマウントを使用して開発コンテナの外部のソースコードにアクセスすることを好みます。
ストレージの概要と、ボリュームとバインドマウントの詳細については、 ストレージに関するドキュメントを確認してください。
結論
これらは、Dockerを初めて使用する人からよく寄せられる質問のほんの一部です。 より一般的な質問と回答を読みたい場合は、 ドキュメントのFAQを確認してください。
また、twitter(@pmckee)で気軽に繋がり、よろしければ質問もお願いします。