Docker コンテナの学習 [1]

1. コンテナの概要

1.1 コンテナとは

コンテナはサンドボックス テクノロジであり、主な目的はコンテナ内でアプリケーションを実行し、外部の世界から隔離することです。このサンドボックスは他のホスト マシンに転送すると便利です。基本的には特殊なプロセスです。名前空間、制御グループ、および chroot テクノロジーを通じて、リソース、ファイル、デバイス、ステータス、および構成を独立したスペースに分割します。

一般に理解されているのは、アプリケーション ソフトウェアが入ったボックスであり、その中にはソフトウェアの実行に必要な依存ライブラリと構成が含まれています。開発者は、内部のソフトウェアの動作に影響を与えることなく、このボックスを任意のマシンに移動できます。

1.2 コンテナの原理

コンテナのプロセスを外部から隔離するために、コンテナの最下位層は主に名前空間、コントロールグループ、chrootを使用します。

名前空間:

  1. PID 名前空間: 異なるコンテナーは pid 名前空間によって分離され、異なる名前空間は同じ pid を持つことができます。
  2. 名前空間のマウント: マウントにより、異なる名前空間のプロセスが異なるファイル構造を参照できるため、異なる名前空間のプロセスが参照するファイル ディレクトリが分離されます。さらに、ネームスペース内の各コンテナーの /proc/mounts 内の情報には、マウント ポイントの現在の名前のみが含まれます。
  3. IPC 名前空間: コンテナー内のプロセス対話には、セマフォ、メッセージ キュー、共有メモリなど、Linux の一般的なプロセス対話方法 (プロセス間通信 -IPC) が引き続き採用されています。
  4. ネットワーク名前空間: ネットワークの分離は Net を通じて実現され、各 Net には独立したネットワーク デバイス、IP アドレス、ルーティング テーブル、および /proc/net ディレクトリがあります。このようにして、各コンテナのネットワークを分離できます。
  5. UTS 名前空間: UTS (UNIX タイムシェアリング システム) では、各コンテナが独立したホスト名とドメイン名を持つことができるため、コンテナはホスト上のプロセスではなく、ネットワーク上の独立したノードと見なすことができます。
  6. ユーザー名前空間: 各コンテナーは異なるユーザー ID とグループ ID を持つことができます。つまり、ホスト上のユーザーではなく、コンテナー内のユーザーを使用してプログラムを実行できます。

コントロール グループ (コントロール グループ):
Cgroups は、Linux カーネルによって提供される物理リソース メカニズムであり、プロセス グループを制限、記録、および分離できます。名前空間テクノロジーはプロセスの視覚的な範囲のみを変更できるため、実際にリソースを制限することはできません。したがって、コンテナがホスト マシンのリソースをすべて使い切って、他のコンテナがクラッシュすることを防ぐために、Cgroup テクノロジを使用してコンテナのリソースを制限する必要があります。Linux の /sys/fs/cgroup ディレクトリには、cpu、memory、devices、net_cls などのサブディレクトリがあり、必要に応じて対応する設定ファイルを変更して、物理リソースのプロセス ID の最大使用率を設定できます。

ルートへの変更:
ルート切断の意味は、プログラムの実行中にプログラムが参照するルート ディレクトリの場所を変更し、異なるコンテナが異なる仮想ルート ディレクトリで動作できるようにして、相互に直接影響を与えないようにすることです。

1.3 コンテナと仮想マシン

通常、仮想マシンにはオペレーティング システム全体とアプリケーションが含まれており、実際のオペレーティング システムが内部で実行されます。本質的に、仮想マシンはハイパーバイザーによって仮想化されたハードウェアにインストールされるさまざまなオペレーティング システムであり、コンテナはホスト マシン上で実行されるさまざまなプロセスです。ユーザー エクスペリエンスの観点から見ると、仮想マシンは重量があり、多くの物理リソースを占有し、起動に時間がかかります。コンテナーは物理リソースの占有量が少なく、迅速に起動します。対照的に、仮想マシンはより完全に分離されていますが、コンテナーはさらに分離されています。
ここに画像の説明を挿入

1.4 コンテナの開発の歴史

ここに画像の説明を挿入

2 港湾労働者

コンテナーのことになると、誰もがデフォルトで docker を指しますが、なぜ他のものを指すのでしょうか? 理由は非常に単純で、docker は使いやすく、ほとんどのユーザーのニーズを解決してくれるからです。他の容器には、包装の不便さや互換性の悪さなど、多かれ少なかれ問題があります。Docker ソリューションでは、ローカル アプリケーションがパッケージ化されるだけでなく、ローカル環境 (オペレーティング システムの一部) も一緒にパッケージ化されるため、ローカル環境とサーバー環境は完全に一貫しており、実質的なワンタイム開発が可能になります。どこでも走れる。

Docker は、Go 言語に基づいたオープン ソースのアプリケーション コンテナ エンジンであり、Apache2.0 プロトコルに準拠したオープン ソースです。

Docker を使用すると、開発者はアプリケーションと依存関係を軽量でポータブルなコンテナにパッケージ化して、一般的な Linux マシンに配布したり、仮想化したりできます。

コンテナーは完全にサンドボックス メカニズムを使用しており、それらの間にインターフェイスはありません (iPhone アプリと同様)。さらに重要なのは、コンテナーのパフォーマンスのオーバーヘッドが非常に低いことです。

Docker は、開発環境、コード、構成ファイルなどをこのコンテナーにパッケージ化し、公開して任意のプラットフォームに適用できる仮想環境コンテナーです。たとえば、Python を使用して Web サイトの背景をローカルで開発する場合、開発とテストが完了した後、Python3 とその依存パッケージ、Flask とそのさまざまなプラグイン、Mysql、Nginx などをコンテナーにパッケージ化できます。次に、それを環境が必要な場所にデプロイします

docker と nvidia-docker
docker はコンテナーであり、nvidia-docker は docker をサポートするプラグインです。一般的な Web アプリケーションの場合、nvidia-docker は必要ありません。

2.1 Docker の利点

Docker は、アプリケーションを開発、配信、実行するためのオープン プラットフォームです。Docker を使用すると、アプリケーションをインフラストラクチャから分離できるため、ソフトウェアを迅速に配信できます。Docker を使用すると、アプリケーションを管理するのと同じ方法でインフラストラクチャを管理できます。コードを迅速に配信、テスト、デプロイするための Docker のアプローチを活用することで、コードを作成してから実稼働環境で実行するまでの遅延を大幅に短縮できます。

1. アプリケーションを迅速かつ一貫して提供する
Docker は、開発者が提供するアプリケーションまたはサービスのローカル コンテナを使用して標準化された環境で作業できるようにすることで、開発ライフサイクルを簡素化します。

コンテナーは継続的インテグレーションおよび継続的デリバリー (CI/CD) ワークフローに適しています。次のシナリオ例を検討してください。

開発者はローカルでコードを作成し、Docker コンテナを使用して同僚と作業を共有します。
Docker を使用してアプリケーションをテスト環境にプッシュし、自動テストまたは手動テストを実行します。
開発者はバグを見つけた場合、開発環境でバグを修正し、テストと検証のためにテスト環境に再デプロイできます。
テストが完了したら、更新されたイメージを実稼働環境にプッシュするのと同じくらい簡単に、修正を実稼働環境にプッシュします。

2. 応答性の高い展開とスケーリング
Docker は、移植性の高いワークロードを可能にするコンテナベースのプラットフォームです。Docker コンテナは、開発者のローカル マシン、データ センターの物理マシンまたは仮想マシン、クラウド サービス、またはハイブリッド環境で実行できます。

Docker の移植性と軽量性により、ワークロードを動的に管理し、ビジネス ニーズに応じてアプリケーションやサービスをリアルタイムでスケールアップまたは破棄することも容易になります。

2. 同じハードウェアでより多くのワークロードを実行
Docker は軽量で高速です。これは、ハイパーバイザー ベースの仮想マシンに代わる実行可能でコスト効率が高く、効率的な代替手段を提供するため、より多くのコンピューティング能力を活用してビジネス目標を達成できます。Docker は、より少ないリソースでより多くのことを実行できる、高密度環境および小規模から中規模のデプロイメントに最適です。

2.2 コンテナとイメージ

Docker のライフサイクルでは、イメージとコンテナーが 2 つの最も重要な部分です。イメージはファイルであり、読み取り専用テンプレートであり、コンテナの実行に必要なデータを含む独立したファイル システムであり、新しいコンテナの作成に使用できます。一方、コンテナはイメージに基づいて作成されたプロセスです。イメージ内のファイルについては、コンテナに書き込み機能があり、必要に応じて内部のソフトウェアや設定を書き換えて、新しいイメージとして保存することができます。import メソッドで生成された場合は、まったく新しいイメージになります。commitメソッドにより生成された新規イメージを使用する場合、新規イメージと元のイメージとの間には継承関係が存在します。
ここに画像の説明を挿入

2.3 Docker環境のインストール

https://blog.csdn.net/qq_38345468/article/details/110128659
Docker のインストール

3 Docker の使用を開始する

Docker は共通のプロセスを使用します。つまり、
ウェアハウス (通常は DockerHub) からイメージをダウンロード (プル) し、Docker が run メソッドを実行してコンテナーを取得し、ユーザーがコンテナー内でさまざまな操作を実行します。Docker は commit メソッドを実行してコンテナをイメージに変換します。Docker は、login や Push などのコマンドを使用して、ローカル イメージをウェアハウスにプッシュ (プッシュ) します。このイメージを他のマシンまたはサーバーで使用してコンテナを生成し、対応するアプリケーションを実行できます。

Docker カスタム イメージ
Docker エントリ操作

付録:

  1. docker公式サイト https://docs.docker.com/
  2. ドッカーハブ:https://hub.docker.com/

おすすめ

転載: blog.csdn.net/qq_41224270/article/details/128033646