web-dev-qa-db-ja.com

ホストプロセスリストに表示されるDockerプロセス

基本的に this githubチュートリアルに従って、Dockerを使用してSeleniumサーバーをセットアップしていました。

サーバーの設定に問題はありませんが、Dockerイメージ内で開始したプロセスが実際にホストプロセスリストに表示されていることに気付きました。

enter image description here

スクリーンショットを見るとわかるように、Dockerはbashスクリプトを実行し、jarファイルも実行しています。これは、ボックス内でのみ発生するはずです。これは、ホストのユーザーがコンテナの外の特定のプロセスを強制終了して、ボックス内の世界を完全に台無しにする可能性があることを意味しますか?

コンテナーを停止すると、すべてのプロセスが予想どおりになくなりました。

これはDockerが設計された方法ですか?。欠陥のある分離は、Virtualbox/Vagrantと比較して軽量と引き換えに受け入れる必要があるものです...または私は何か間違っていますか?

ありがとう!

26
B.Mr.W.

はい、これは意図したとおりです。プロセスはrootによって開始されるため、root権限を持つユーザーはプロセスを強制終了できますが、root権限を持つユーザーはそれよりも悪い場合があります(例:docker o_Oのアンインストール)...

この「欠陥のある」分離には、ホストマシンで実行されている単一の監視プロセスからすべてのコンテナー内で実行されているプロセス monitor の機能など、いくつかの大きな利点があります。

27
Ofri Raviv

これは、Dockerが軽量の仮想マシン "であるという一般的な誤解のようです。そのため、VirtualBoxまたはVMWareと同様の動作を期待するかもしれませんが、より高速です。

Dockerは仮想化を使用しないため、すべてのプロセスはネイティブホストカーネルによって実行され、互いに隔離されています。非rootユーザーはコンテナー内のプロセスを強制終了できませんが、rootはコンテナー全体を停止してプロセスを強制終了できます。

コンテナー内で実行されているプロセスと他のプロセスを区別するには、topを実行してからshift+fを押し、添付のスクリーンショットに示すようにnsPIDとnsUSERを選択します。

次に、サーバーで直接実行されている場合、各プロセスの横に名前空間が表示されます。この値は空である可能性が高く、コンテナー内で実行されているプロセスの場合、各コンテナーの名前空間IDが表示されます。 (名前空間でソートして、各コンテナーのプロセスを確認できます)

top nsPID and nsUSER

37
iTech

また、ホスト上のユーザーは、同じuidによって開始されたコンテナー内のプロセスを強制終了できることに注意してください。

コンテナーに追加された最初のユーザーが、ホストで作成された最初のユーザーと同じuidを持っている可能性が高いため、これは特に懸念されます。

$ ps -ef |grep '^install+ 26184'
install+ 26184 26177  1 Oct30 ?        00:18:18 /usr/lib/plexmediaserver/Plex Media Server

$ kill -9 26184

$ ps -ef |grep '^install+ 26184'

最初の列には自分のユーザー名が表示されます。これは、プロセスが自分のuidでコンテナーで実行されているためです。また、Sudoまたはadmin特権なしでプロセスを強制終了しました。

したがって、次のいずれかをお勧めします。

  • ホストとコンテナのbothに新しいアカウントとグループを作成し、同じuid/gidが使用されないようにします。または
  • Docker ser namespaces を有効にして、uidとgidをマップします。
1
Aaron Queenan