web-dev-qa-db-ja.com

Dockerコンテナ内でsystemdを実行することをお勧めしますか?

コンテナ内で「systemd」を使用することを計画しています。私が読んだ記事に基づいて、コンテナごとに1つのプロセスのみを制限することが望ましいです。

しかし、コンテナー内で「systemd」を構成すると、多くのプロセスを実行することになります。

決定を下す前に、コンテナー内でsystemdを使用することの長所と短所を理解しておくとよいでしょう。

5
Vijetha

可能な限り、コンテナ内のsystemdは避けることをお勧めします。

Systemd ファイルシステムをマウントし、いくつかのカーネルパラメータを制御し、プロセス出力をキャプチャするための独自の内部システムを持ち、システムスワップスペースを構成し、巨大なページとPOSIXメッセージキューを構成し、プロセス間メッセージバスを開始し、ターミナルログインプロンプトが表示され、一連のシステムサービスが管理されます。これらの多くは、Dockerがあなたのために行うことです。その他は、Dockerがデフォルトで防止するシステムレベルのコントロールです(正当な理由があります)。

通常、コンテナにoneの処理を実行させたい場合があります。これには、複数の調整プロセスが必要になる場合がありますが、通常、systemdの処理を実行したくない場合があります。プロセスマネージャを提供するだけではありません。 systemdは非常に多くのホストレベルのパラメーターを変更するため、Dockerの分離を解除する--privilegedとして実行する必要があることがよくありますが、これは通常は悪い考えです。

質問で言うように、通常、コンテナーごとに1つの「ピース」を実行するのが最適と見なされます。これができない場合は、 supervisord のような軽量のプロセスマネージャーが、DockerとUnixの両方の哲学にとって、initプロセスに必要な最小限のことを実行する方が適しています。

7
David Maze

s6 複数のプロセスが必要な場合、コンテナの初期化として人気があります。はい、それは「コンテナごとに1つのプロセス」ではなく、「コンテナごとに1つのもの」です。ウェブサイトの運営(例:それでも1つのことですが、通常は複数のプロセスです。

どのinitシステムを使用したいかという質問であると考える必要があります。

コンテナ内でPID-1として実行されている古い/ sbin/initまたはsystemd-daemonを使用できます。 「dockerstop」などのコマンドは、PID-1とのみ通信します。コンテナ内にJavaアプリケーションが1つしかない場合は、そのプロセスをコンテナのPID-1として直接実行することをお勧めします。

Systemdを実行する必要はほとんどありません。コンテナ内に複数のサービスがある場合、または一部のラッパースクリプトが「systemctl」を使用している場合でも、それをアクティブ化することをお勧めします。ただし、後者のユースケースも docker-systemctl-replacement でカバーされます。

0