Dockerコンテナ内のプロセスはどのようなものですか?

Dockerコンテナ内のプロセスはどのようなものですか?

最近では、人々がDockerコンテナとは何か、より具体的に言えば、Dockerコンテナ内で呼び出されるコマンドとプロセスに関して内部的に何が起こっているのかについて人々が混乱していると言われています。

誰かが何が起こっているのかについての高度な概要を提供できますか?

答え1

Dockerは、人々がDockerが基本的なハードウェアを仮想化したと考えていたので、仮想化バケットに含まれていました。これはDockerが使用する用語(主に「コンテナ」という用語)から派生した誤った名前です。

ただし、Dockerはシステムハードウェアの仮想化に関して魔法のようなことをしません。代わりに、重要な施設の周りに「フェンス」を構築するLinuxカーネルの機能を活用して、プロセスがネットワーキング、ファイルシステム、権限(何よりも)などのリソースと対話できるようにして、完全な機能を備えたシステムと対話しています。勘違いを呼び起こします。 。

次の例では、Dockerコンテナを起動してから/bin/bash

$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#

これで、このコンテナ内で次のように実行しますps -eaf

    SS01

別のターミナルタブに切り替えると、Dockerコンテナをホストしているホストシステムにログインし、コンテナが「実際に」占有するプロセススペースを表示できます。

    SS02

これで、Dockerタブに戻ってその中で複数のプロセスを起動し、すべてをバックグラウンドに入れると、元のDockerコンテナで起動されたデフォルトのBashプロセスで実行されているいくつかのサブプロセスがあることがわかります。 。

メモ:このプロセスは、sleep 1000バックグラウンドで実行される4つのコマンドです。

    SS03

Dockerコンテナ内で、プロセスに48-51のプロセスID(PID)がどのように割り当てられるかを確認します。ps -eaf出力でも見ることができます。

    SS04

しかし、次の画像では、Dockerが実行する「魔法」のほとんどが明らかになります。

    SS05

この4つのsleep 1000プロセスは実際に元のBashプロセスのサブプロセスですか?また、元のDockerコンテナは/bin/bash実際にDockerデーモンのサブプロセスであることに注意してください。

sleep 1000これで、元のコマンドが完了するまで1000秒以上待ってから4つの新しいコマンドを実行し、次のように別のDockerコンテナを起動します。

$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#

ホストシステムの出力はps -eaf次のとおりです。

    SS06

他のDockerコンテナは、Dockerデーモンの下のプロセスとしてのみ表示されます。

ご覧のとおり、Dockerは実際には仮想化ではありません(伝統的な意味で) は様々なカーネルリソースの周りに「フェンス」を構築し、特定のプロセス+サブプロセスの可視性を制限します。

答え2

~へコンテナ内では、プロセスは分離(分離)する必要があります。実際に指定したプロセス(少なくともシェル)以外は、どのプロセスも表示しないでください。 「社会性」テストには適用されません。 chrootと唯一の類似点は、ホストカーネルを使用することです。 Dockerは、何かを分離する必要がある場合、またはホストシステムで実行されているものとは異なるバージョンのプラットフォームアーキテクチャソフトウェアを使用する必要がある場合に便利です。 (非常に古いJavaバージョンまたは他のPythonフォーク)作業しているフォルダとバイナリは、ホストコンピュータのフォルダとバイナリと異なる可能性があることに注意してください。同じ/binフォルダなどではありません。

編集:VMの代わりにchrootに似ています。

関連情報