Dockerコンテナの原理の分析

Dockerコンテナの原理の分析

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. docker exec -it 4784586d01e0 bash

この命令は、このコンテナに入り、bash 命令を実行することをコンテナに伝えます。

2. Docker が ps コマンドをサポートしていない場合は、次のコマンドを使用して ps コマンドをインストールする必要があります。

apt-get update & apt-get install procps

次にコンテナを終了し、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の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Docker チュートリアル: 基本概念 (イメージ、コンテナ、ウェアハウス) を詳しく説明します
  • Dockerイメージ、コンテナ、ウェアハウスの概念とアプリケーションの詳細な説明
  • Docker イメージ、コンテナ、ウェアハウスなどの概念に関する深い理解。
  • Docker に関する深い理解 (Docker イメージ、コンテナ、ウェアハウスの基本概念)
  • Dockerコンテナ監視の原理とcAdvisorのインストールおよび使用方法
  • Dockerコンテナデータボリュームの原理と使用法の分析
  • Dockerコンテナのメモリ監視の原理と応用

<<:  MySQLの保存時間の不一致の問題を解決する

>>:  JavaScript を使用して QR コードを解析する 3 つの方法

推薦する

JS で async と await を使用する方法

目次1. 非同期2. 待つ: 3. 包括的なアプリケーション1. 非同期async 、非同期コードが...

IE における条件付きコメントの利点と欠点

IE の条件付きコメントは、通常の (X)HTML コメントに対する Microsoft 独自の (...

Tomcatはスレッドプールを使用してリモート同時リクエストを処理します。

Tomcatが同時リクエストを処理する方法を理解することで、スレッドプール、ロック、キュー、および...

WeChatアプレットコンポーネントライフサイクルの落とし穴の記録

通常、コンポーネントのライフサイクルは、ビジネス ロジックが始まる場所です。ビジネスシナリオが複雑で...

Linux でタイムアウト付きの接続関数を試す

前回の記事では、Windows でタイムアウトを試してみました。この記事では、Linux で試してみ...

Linux コマンド sort、uniq、tr ツールの詳細な説明

並べ替えツールLinux の sort コマンドは、テキスト ファイルの内容を並べ替えるために使用さ...

Centos 7.4 サーバーの時刻同期設定方法 [NTP サービスに基づく]

この記事では、CentOS 7.4 サーバーで時刻同期を構成する方法について説明します。ご参考までに...

HTML の順序なしリストタグと順序付きリストタグの使用例

1. 上部と下部のリストタグ: <dl>..</dl>:上dt下層dd: カ...

Vue3 の ref toRef と toRefs の違いを理解する方法

目次1. 基本1.参照2. 参照3. 参照4. 最適な使い方2. 詳細な1. なぜrefが必要なのか...

レスポンシブ Web をデザインするにはどうすればいいですか?レスポンシブウェブデザインのメリットとデメリット

最近レスポンシブ デザインについて学んでいて、これについていくつか整理してみました。写真の一部はイン...

MySQL の接続数が多すぎるエラーの原因と解決策

目次概要本日正午、開発およびテスト環境の MySQL サービスで接続数が多すぎるというエラーが報告さ...

CSS3 を使用して円形スクロール プログレス バー アニメーションを作成する例

テーマ今日は、CSS3 を使用して円形スクロール プログレス バー アニメーションを作成する方法を説...

ウェブページ上でデスクトップ exe プログラムを呼び出す簡単な方法

この記事では主に、Web ページ上でデスクトップ exe プログラムを呼び出す方法を紹介します。 W...

Vueのフロントエンドシステムとフロントエンドとバックエンドの分離の詳細な説明

目次概要フロントエンド知識システムフロントエンドの3つの要素プレゼンテーション層 (CSS)動作レイ...

ツールキット: Bootstrap よりも強力なフロントエンド フレームワーク

注: 現在、最も人気のフロントエンド フレームワークは Bootstrap と Foundation...