GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

コンテナ化とは何ですか?DockerとKubernetesとはどのように関連していますか?

コンテナは今でも多くの人にとって「Docker」を意味します。 Dockerは、ソフトウェアの開発とデプロイにおけるコンテナーの最新の使用法を普及させました。最近では、他のテクノロジーも出回っています。 Containerd、Docker、Kubernetesの相互関係は次のとおりです。

始まり

2013年のリリースでは、Dockerは、コンテナーの構築と実行に必要なすべてを備えた自己完結型のプロジェクトでした。欠けていたのは、クラウドでコンテナの展開を調整する簡単な方法でした。

2013年の終わりまでに、Google社員のグループは、Kubernetesになるプロトタイプですでにこれに取り組んでいました。 Kubernetesは、大規模なマシン群全体でコンテナ化されたワークロードの運用を簡素化することを目的としています。

当時、KubernetesはDockerと密接に関連していました。 Dockerを直接使用してコンテナーと対話しましたが、必要なのは機能のサブセット(実際にコンテナーを実行する部分)だけでした。

Dockerの開発者中心のUIがKubernetesの邪魔になりました。専用のツールであるDockershimを使用して、プロジェクトの人間に優しい側面をバイパスする必要がありました。 DockerとKubernetesの方向性が異なるため、問題はさらに複雑になりました。 Dockerは、独自のKubernetes代替手段であるSwarmをリリースし、組み込みのDocker「モード」としてオーケストレーションを提供しました。

コンテナの台頭

Kubernetesが成長し、Dockerを中心にサードパーティのツールが増えるにつれ、そのアーキテクチャの制限が明らかになりました。同時に、Open Container Initiative(OCI)は、コンテナー形式とランタイムの標準化を開始しました。これにより、複数のランタイムで使用できるコンテナーを定義するOCI仕様が作成されました。その例として、Dockerがあります。

次に、Dockerはコンテナーランタイムを新しいプロジェクトcontainerdに抽出しました。これには、コンテナの実行、低レベルのストレージの処理、イメージ転送の管理のためのDockerの機能が含まれます。 Containerdは、コンテナコミュニティに新しいコンテナソリューションを作成するための基盤を提供するために、Cloud Native Computing Foundation(CNCF)に寄付されました。

コンテナ化の出現により、Kubernetesのようなプロジェクトが必要な低レベルの「Docker」要素に簡単にアクセスできるようになります。実際にDockerを使用する代わりに、コンテナーランタイムへのよりアクセスしやすいインターフェースを使用できるようになりました。コンテナテクノロジーのOCI標準化は、他のランタイムも使用できることを意味します。

コンテナの役割を理解する

コンテナを完全に理解するには、コンテナの性質を調べる必要があります。コンテナは、実際にはさまざまなLinuxカーネル機能を抽象化したものです。コンテナーを実行するには、syscallsを使用してコンテナー化された環境をセットアップする必要があります。手順はプラットフォームとディストリビューションによって異なります。

コンテナ化されたドロップインは、この低レベルの配線を抽象化します。これは、コンテナソフトウェアがその上に構築する「クライアントレイヤー」として意図されています。これは、Dockerなどの開発者指向のソフトウェア、またはKubernetesなどのクラウド指向のdevopsツールである可能性があります。

以前は、Kubernetesの開発には2つの悪い選択肢が残されていました。それは、巨大なDockerインターフェースの周りにシムを書き続けるか、Linuxカーネル機能と直接対話し始めることです。コンテナ化されたものをDockerから切り離すことで、3番目の選択肢が利用可能になりました。Dockerを使用せずに、コンテナ化されたものをシステム抽象化レイヤーとして使用することです。

3つのテクノロジーの組み合わせの概要は次のとおりです。

  • ドッカー –端末からコンテナーを簡単に構築および実行できる高レベルのインターフェースを備えた開発者向けソフトウェア。コンテナランタイムとしてcontainerdを使用するようになりました。
  • コンテナ –比較的高レベルのコンテナインターフェイスを提供するカーネル機能の抽象化。他のソフトウェアプロジェクトでは、これを使用してコンテナを実行し、コンテナイメージを管理できます。
  • Kubernetes –containerdを含む複数のコンテナーランタイムで動作するコンテナーオーケストレーター。 Kubernetesは、1つ以上の物理的な「ノード」にコンテナを集約してデプロイすることに重点を置いています。歴史的に、KubernetesはDockerに関連付けられていました。

Containerdは、1つのコンテナーバックエンドのみです。 Open Containers Runtime仕様を実装する他のコンテナーには、runCおよびCRI-Oが含まれます。これらのランタイムは、DockerおよびKubernetesでも使用できます。それぞれに独自の違いがあります。

The OCI

OCIは、コンテナ標準の定義を担当する機関です。その作業は、異なるコンポーネントテクノロジー間の相互運用性を促進するのに役立ちました。

OCIのイメージ仕様は、コンテナがどのように見えるかを定義します。ランタイム仕様は、コンテナーを実行するためのインターフェースを設定します。コンテナ化されたようなプロジェクトは、これらの仕様を実装します。

重要なことに、OCIの優先事項の1つは、Dockerで普及しているコンテナーの使用エクスペリエンスをサポートすることです。そのイメージは、ユーザー定義の引数なしでターゲットプラットフォーム上で実行可能である必要があります(例:docker run hello-world:latest )。したがって、OCIイメージには、この自動構成を有効にするのに十分なメタデータが含まれている必要があります。

Container Runtime Interface(CRI)への参照も表示される場合があります。これは、OCI仕様に対するKubernetes固有の抽象化です。 CRIはOCI仕様に基づいて構築されており、Kubernetes内で交換可能なコンテナランタイムのサポートを有効にします。

私のDockerイメージはどうですか?

Dockerを使用して作成したイメージは、実際には「Dockerイメージ」ではありません。 Dockerはcontainerdランタイムを使用するようになったため、イメージは標準化されたOpen Container Initiative(OCI)形式でビルドされます。

Dockerイメージとそれらが使用されている環境との間の非互換性について心配する必要はありません。Dockerでビルドしたイメージは引き続きKubernetesを使用してデプロイできます。これは、Kubernetesがコンテナ化された(およびその他の標準に準拠したランタイム)を使用することで、OCIイメージもサポートしているためです。 ランタイム次第です DockerやKubernetesなどのツールが提供する高レベルのインターフェースではなく、イメージのプルと実行を処理します。

KubernetesとDocker

Kubernetesは2020年後半にDockerランタイムを廃止しました。これは、現在2021年後半に予定されている将来のリリースで削除されます。その後、KubernetesはDockerランタイムを提供しなくなります サポート。代わりに、containerdなどのOCI仕様と互換性のある代替ランタイムを使用する必要があります。

この発表は、開発者への影響についての懸念を引き起こしました。この変更は、ほとんどの既存のワークフローに影響を与えることはありません。すでに見てきたように、DockerはOCI準拠のランタイムが実行できるOCI準拠のイメージを生成します。 docker buildでビルドするすべてのイメージ Dockerランタイムが削除された後でも、Kubernetes内で引き続き機能します。

2つの異なるテクノロジーが検討されています–Dockerコマンドラインインターフェース コンテナの作成と実行に使用され、Docker runtime コマンドラインインターフェイスがラップアラウンドします。

混乱しすぎです!

ほんの数年で、コンテナは何人の開発者が働くかを変えました。周囲の生態系の拡大は、この変化の自然な副産物です。 Containers === Docker Kubernetesのようなツールがその潜在能力を最大限に発揮できなかったため、メンタリティがあまりにも息苦しいことが判明しました。

標準化への動きは、多数の新しい用語、ツール、およびテクノロジーをもたらしました。それでも、マシン上のDocker CLIを操作している場合でも、クラウド内のKubernetesクラスターを操作している場合でも、開発者にとって実際には何も変わりません。

各高レベルのユーザー向けインターフェース(DockerやKubernetesなど)は、交換可能な低レベルのコンテナーランタイム(containerdやrunCなど)を選択できるというメリットがあります。これにより、柔軟性が高まり、新しいコンテナベースのテクノロジーが標準に沿った方法で確立できるようになります。


Docker
  1. Makefileとは何ですか?どのように機能しますか?

  2. DockerをインストールしてLAMPスタックをデプロイする方法

  3. Dockerボリュームとは何ですか?また、それらをどのように使用しますか?

  1. Webサーバーとは何ですか?Webサーバーはどのように機能しますか?

  2. Podmanとは何ですか?Dockerとどのように異なりますか?

  3. コンテナと Dockerfile から Docker イメージを作成する方法

  1. Hadoop Mapreduceとは何ですか、どのように機能しますか

  2. Docker コンテナーをバックアップおよび復元する方法

  3. Docker コンテナを一時停止および再開する方法