プログラムをサービスとして実行するか直接実行するかの違いは何ですか

プログラムをサービスとして実行するか直接実行するかの違いは何ですか

ちょっとわかりにくい質問かもしれませんが...

最近、docker をいじり始めて、基本的なランプ サーバーをセットアップしようとしています。

httpd、php、mysql を備えた CentOS の Docker イメージがあります。

ただし、docker コンテナでは、systemd / service 経由で通常行う方法でサービスを開始することはできません。

httpdを直接実行することができます/usr/sbin/httpd

/usr/sbin/httpdそれでは、 ではなく を介して httpd を実行する場合の違いは何でしょうかsystemctl start httpd?

httpd を停止または再起動する「適切な」方法はありますか? - プロセスを強制終了するだけでよいと思いましたが、約 10 個の Apache プロセスが起動されるようです。

これは特に的を絞った質問ではないことは承知していますが、関連する資料へのご指摘があれば、ありがたく受け取ります。

答え1

systemctlPID 1 が systemd でない場合は使用できません。 で PID 1 を見つけることができますps -q 1

通常の方法でサービスを開始および停止できることは、この記事で言及されている利点の1つです。非特権コンテナで systemd を実行するその他には、Andrei の回答で説明されているように、子プロセスのログ記録や追跡があります。

答え2

systemd サービスは、直接実行するのと同様の方法でプロセスを開始しますが、すべてのフォークされたプロセスとスレッドを追跡します。つまり、シャットダウンするとsystemctl stop apacheすべての子プロセスがシャットダウンされます。また、systemd プロセスを使用すると、バックグラウンドで実行され、システムの起動時に開始できるため便利です。

答え3

あなたの学習段階を考慮すると、あなたのタスクには Docker を使用しないほうがよいでしょう。

プロセスの分離に Docker を使用している場合は、固有の Unix ユーザーを使用できます。また、systemd には systemd サービスがアクセスできるものを制限するためのディレクティブも含まれています。たとえば、を参照してCapabilities=くださいman systemd.exec

また、Docker でプロセスを分離するには、データベースと Web サーバーをそれぞれ異なる Docker コンテナーで実行します。

提供されるもう 1 つの重要な機能systemdはプロセス管理です。つまり、httpdプロセスがクラッシュした場合、systemd がプロセスを再起動します。

まず、systemd を使用してすべてのプロセスをホスト サーバー上で直接実行することをお勧めします。最近のパッケージの多くには、systemdすでに構成ファイルが付属しています。

Docker を追加することでどのようなメリットが得られるかを十分に理解したらsystemd、Docker を組み合わせることを検討してください。

私の仕事では、一連のサービスを管理するために Docker を使用しようとしましたが、後から直接管理することに慣れ、その結果、さまざまなものを結合して維持するためsystemdのスクリプトが少なくなり、チームが好むよりクリーンなシステムが実現しました。bash

関連情報