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 つの方法

推薦する

HTML でのアンカーポイントの適用

アンカーポイントの設定<a name="トップ"></a>...

JSscriptタグの属性は何ですか

JS スクリプト タグの属性は何ですか? charset : オプション。 src 属性で指定された...

新しく作成された MySQL ユーザーの % には localhost が含まれていますか?

通常の説明%はどのクライアントでも接続できることを意味しますlocalhostはローカルコンピュータ...

Dockerイメージ作成の完全なプロセス

目次序文作成手順CentOSベースイメージを作成するコンテナを作成してカスタマイズするカスタムコンテ...

CentOS7.3 での MySQL 8.0.13 のインストールと設定のチュートリアル

1. 基本環境1. オペレーティングシステム: CentOS 7.3 2. MySQL: 8.0.1...

MySQL の重要なパフォーマンス インデックスの計算と最適化方法の概要

1 QPS 計算 (1 秒あたりのクエリ数) MyISAMエンジンベースのDBの場合 MySQL&g...

Linux 継続的インテグレーションで Maven を自動的にインストールする方法

Mavenパッケージを解凍する tar xf apache-maven-3.5.4-bin.tar....

Docker で Docker0 ブリッジのデフォルトのネットワーク セグメントを変更する方法

1. 背景Docker サービスが開始されると、デフォルトで docker0 ブリッジが作成され (...

JSはUUIDとNanoIDというユニークなIDメソッドを生成します

目次1. NanoIDがUUIDに取って代わる理由2. jsを生成する方法3. ナノID方式序文:ユ...

Hyper-V インストール CentOS 8 の問題の分析

CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...

時間別にグループ化された MySQL クエリ ステートメント

年、月、週、日グループによる MySQL クエリ1. 学年別検索 SELECT DATE_FORMA...

MySQL インデックスの効率的な使用ガイド

序文ほとんどの方がMySQLとインデックスを使用したことがあると思いますが、適切なインデックスを作成...

docker で zabbix_agent をデプロイする方法

zabbix_agent のデプロイメント:推奨事項: zabbix_agent は docker-...

Dockerfileの指示と基本構造の説明

Dockerfile を使用すると、ユーザーはカスタム イメージを作成できます。基本構造Docker...

Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決します

Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決しますコード例: var...