01 コンテナの本質とは何か?今日はコンテナとは何かを明確に説明することに焦点を当てます。 コンテナの概念を理解するには、まずプロセスとは何かを知る必要があります。 Linux オペレーティング システムでプログラムを実行する場合、このプログラムはバイナリ ファイルである可能性があります。呼び出されると、コンピューターのメモリ内のデータ、レジスタ内の値、スタック内の命令、およびさまざまなデバイス ステータス情報のコレクションになります。このようなコンピュータ実行環境の組み合わせはプロセスと呼ばれます。 コンテナは、プロセスの「境界」を提供します。簡単に言えば、コンテナはプロセスを「ラップ」します。本質的には、コンテナは、プロセスの動的なパフォーマンスを制限および変更することによって、この「ラップ」アクションを実現します。 コンテナが「境界」を持つ特別なプロセスであることは容易に理解できます。 ここで、MySQL コンテナのプロセス特性を見てみましょう。 1. まず、次のようにして、マシン上の mysql コンテナの containerID 値を確認します。 [root@VM-16-13-centos サービス]# docker ps | grep mysql 4784586d01e0 mysql "docker-entrypoint..." 3 か月前 3 か月前 k8s_mysql.16d54d16_mysql-pd7jr_default_0032bce0-2b0f-11eb-98ad-5254002dbd85_d775f414 ご覧のとおり、containerIDの値は4784586d01e0です。 2. まず、docker exec コマンド (このコマンドの概要については後述) を使用してコンテナに入り、ps -ef コマンドを使用してプロセスを表示します。 [root@VM-16-13-centos サービス]# docker exec -it 4784586d01e0 bash ルート@mysql-pd7jr:/# ps -ef UID PID PPID C STIME TTY 時間 コマンド mysql 1 0 0 2020 ? 03:20:20 mysqld ルート 882 0 0 09:42 ? 00:00:00 バッシュ ルート 888 882 0 09:46 ? 00:00:00 ps -ef mysqld プロセスのプロセス番号は 1 であることがわかります。 ここでさらに言いたいことがあります。 1. この命令は、このコンテナに入り、bash 命令を実行することをコンテナに伝えます。 2. Docker が ps コマンドをサポートしていない場合は、次のコマンドを使用して ps コマンドをインストールする必要があります。 次にコンテナを終了し、mysqld プロセスのプロセス ID を再度確認します。 [root@VM-16-13-centos サービス]# ps -ef|grep mysql ルート 5152 5059 0 2020 pts/5 00:00:00 mysql -uroot -px xxxx ルート 13644 24879 0 2020 pts/4 00:00:00 mysql -uroot -px xxxx polkitd 18853 18837 0 2020 ? 03:20:25 mysqld プロセス番号は 18853 であることがわかりました。 コンテナの内側と外側で実行される mysqld プロセスの結果は異なると結論付けることができます。 なぜこのようなことが起こるのでしょうか? その本質は、Docker コンテナ内のプロセスが新しい環境に分離され、これらのプロセスが再計算された PID 番号のみを参照できるようにすることです。前に述べたように、Docker は基本的に、プロセスのダイナミクスの一部を制約および変更することで、物理マシン上のプロセスを「パッケージ化」します。ここで見られる現象は、「パッケージ化」の結果です。 では、Linux は物理マシンのプロセスをどのように制限し、変更するのでしょうか?ここで新しい概念を紹介します: Docker などのほとんどの Linux コンテナでは、Linux の Cgroups テクノロジーが制約を作成する主な手段です。 02 Cgroupテクノロジーと名前空間テクノロジーの概要名前空間テクノロジーは主に、コンテナのリソース分離を提供するために使用されます。 Namespace 機能を実装する方法は比較的簡単です。通常、Linux プロセスを作成すると、システムは次のような clone コマンドを実行します。 int pid = clone(main_function、stack_size、SIGCHLD、NULL); 作成したプロセスの PID 番号を返します。 名前空間テクノロジーは、Linux がプロセスを作成するときに追加のパラメータを追加します。この新しいパラメータは一時的に newid と呼ばれます。このように、コンテナ内に表示されるプロセスの PID 番号はこの newid です。この名前空間を PID 名前空間と呼びます。 この名前空間に加えて、マウント名前空間やネットワーク名前空間など、マウントポイントとネットワークをそれぞれ分離するために使用される名前空間もあります。 もちろん、すべてのリソースを名前空間化できるわけではありません。たとえば、時間とオペレーティング システム カーネルは、サーバー上のすべてのコンテナーによって共有されます。 コンテナの実行が開始されると、ディスク、メモリ、CPU など、コンテナが使用するマシン リソースを制御する必要があります。そうしないと、物理マシンのリソースが使い果たされ、一部のシステム プロセスがクラッシュする可能性があります。 Cgroup テクノロジーは、Linux プロセスのリソースを制限するために特別に設計されています。完全な名前は Linux Control Group で、次のようにファイルとディレクトリの形式で /sys/fs/cgroups ディレクトリに保存されます。 [root@VM-16-13-centos サービス]# ls -l /sys/fs/cgroup/ 合計 0 drwxr-xr-x 4 ルート ルート 0 11月20日 11:38 blkio lrwxrwxrwx 1 root root 11 11月 20 11:38 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 11月 20 11:38 cpuacct -> cpu,cpuacct drwxr-xr-x 5 root root 0 11月20日 11:38 cpu,cpuacct drwxr-xr-x 3 ルート ルート 0 11月20日 11:38 cpuset drwxr-xr-x 4 ルート ルート 0 11月 20 11:38 デバイス drwxr-xr-x 3 ルート ルート 0 11月20日 11:38 フリーザー drwxr-xr-x 3 ルート ルート 0 11月20日 11:38 hugetlb drwxr-xr-x 5 ルート ルート 0 11月20日 11:38 メモリ lrwxrwxrwx 1 ルート ルート 16 Nov 20 11:38 net_cls -> net_cls、net_prio drwxr-xr-x 3 ルート ルート 0 11月20日 11:38 net_cls、net_prio lrwxrwxrwx 1 ルート ルート 16 Nov 20 11:38 net_prio -> net_cls、net_prio drwxr-xr-x 3 ルート ルート 0 11月20日 11:38 perf_event drwxr-xr-x 4 ルート ルート 0 11月 20 11:38 pids drwxr-xr-x 4 root root 0 11月20日 11:38 systemd 異なるファイル ディレクトリには、異なるリソース タイプに対する制限された値が保存されます。最もよく使用されるものは次のとおりです。 blkio: ブロックデバイスのI/O制限を設定します。通常はディスクなどのデバイスに使用されます。 cpuset: プロセスに個別のCPUコアと対応するメモリノードを割り当てる メモリ: プロセスのメモリ使用量に制限を設定します。 コマンドを使用してコンテナを起動すると、オペレーティング システムは、docker プロセスに対応する PID を対応するコントロール グループのファイルに入力し、現在のプロセスで使用される CPU リソース値を制御します。 03 コンテナ、イメージ、リポジトリの関係Docker には 3 つの基本概念が含まれています。
上の図に示すように、これら 3 つの部分が Docker のライフサイクル全体を構成します。 Docker イメージには、仮想マシン イメージに似たファイル システムが含まれており、読み取り専用のテンプレートです。このファイル システムは一般に rootfs とも呼ばれ、通常は bin、etc、sys、usr などの一連のディレクトリが含まれています。 Docker コンテナはイメージからインスタンス化されますが、これは私たちが学んだオブジェクト指向の概念と非常によく似ています。クラスがインスタンス化された後、イメージをクラス、コンテナをオブジェクトとして想像することができます。これにより、イメージとコンテナの関係を非常に簡単に理解できます。 Dockerリポジトリ: コードリポジトリと同様に、Dockerがイメージファイルを集中的に保存する場所です。 この関係は次のようにより明確に表現できます。 上記は、dockerコンテナの概念についての詳細な説明です。dockerコンテナの概念の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: JavaScript を使用して QR コードを解析する 3 つの方法
MySQL には、「group_concat」という関数があります。通常の使用では問題がないかもしれ...
1. MySQLは現在の日付と時刻を取得する関数1.1 現在の日付 + 時刻 (日付 + 時刻) ...
目次render.js 部分create-context.js 部分差分部分Reactのソースコード...
目次基本タイプあらゆるタイプ配列タプルインタフェース関数自己推論を入力する結合タイプ(1つ以上選択)...
1. IE8 の getElementById は id のみをサポートし、name はサポートしま...
かなりの数のウェブサイトがデジタルページング効果を使用しています。たとえば、このサイトのページングも...
目次導入1. 異食症2. レナ3. コンプレッサー4. ファブリック5. ぼかす6. 画像を結合する...
よく使用されるコマンドは次のとおりです。 chmod 777 文件或目錄例: chmod 777 /...
ここ2日間Javaを復習するつもりなので、練習にdubboを使ってショッピングモールプロジェクトを書...
目次HBuilderX での ESLint プラグインのインストールカスタム eslint-js ル...
1. QTからJSへのデータフロー1. QTはJS関数を呼び出し、JSはパラメータを通じてQTの値を...
序文Linux カーネルプログラミングでは、マクロ関数 container_of(ptr, type...
目次テーブルの目的例えばテーブル分割戦略すでにオンラインになっている実行中のテーブルはどうすればよい...
今日は、タブ バーをクリックして切り替えるという目的を実現するために、js と jQuery を使用...
1. はじめに英語に慣れていない人は、システムを英語から中国語に変更したいかもしれません。一方、クラ...