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 つの方法
アンカーポイントの設定<a name="トップ"></a>...
JS スクリプト タグの属性は何ですか? charset : オプション。 src 属性で指定された...
通常の説明%はどのクライアントでも接続できることを意味しますlocalhostはローカルコンピュータ...
目次序文作成手順CentOSベースイメージを作成するコンテナを作成してカスタマイズするカスタムコンテ...
1. 基本環境1. オペレーティングシステム: CentOS 7.3 2. MySQL: 8.0.1...
1 QPS 計算 (1 秒あたりのクエリ数) MyISAMエンジンベースのDBの場合 MySQL&g...
Mavenパッケージを解凍する tar xf apache-maven-3.5.4-bin.tar....
1. 背景Docker サービスが開始されると、デフォルトで docker0 ブリッジが作成され (...
目次1. NanoIDがUUIDに取って代わる理由2. jsを生成する方法3. ナノID方式序文:ユ...
CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...
年、月、週、日グループによる MySQL クエリ1. 学年別検索 SELECT DATE_FORMA...
序文ほとんどの方がMySQLとインデックスを使用したことがあると思いますが、適切なインデックスを作成...
zabbix_agent のデプロイメント:推奨事項: zabbix_agent は docker-...
Dockerfile を使用すると、ユーザーはカスタム イメージを作成できます。基本構造Docker...
Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決しますコード例: var...