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

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

ちょっと面倒な質問なのに…

私は最近ドッカーを使い始めて、デフォルトのランプサーバーを設定しようとしました。

httpd、php、およびmysqlを含むcentos dockerイメージがあります。

ただし、dockerコンテナではsystemd / serviceを介して通常どおりサービスを開始できません。

次の方法でhttpdを直接実行できます。/usr/sbin/httpd

それでは、httpd viaとvia/usr/sbin/httpdの違いは何ですかsystemctl start httpd

httpdを停止または再起動する「正しい」方法はありますか? - プロセスを殺すことができると思いましたが、Apacheプロセスが10個ほど始まるようです。

私はこれが特に焦点を当てた質問ではないことを知っていますが、関連資料についてのアドバイスをいただきありがとうございます。

答え1

systemctlPID 1がシステム化されていないと機能しません。 1を使用してPIDを見つけることができますps -q 1

一般的な方法でサービスを開始および停止できることは、この記事で述べた利点です。権限のないコンテナでsystemdを実行する。 Andreの答えで述べたように、他の人は子プロセスを記録または追跡しています。

答え2

systemdサービスは直接実行するのと同様の方法でプロセスを開始しますが、すべての分岐プロセスとスレッドを追跡します。これは、systemctl stop apacheすべての子プロセスを閉じると終了することを意味します。 systemdプロセスを使用することもバックグラウンドで実行され、システムの起動時に開始される可能性があるため、お勧めします。

答え3

あなたが学習曲線のどこにいるかを考えると、私はあなたの仕事にDockerを使用しません。

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

また、Dockerを使用したプロセス分離のために、各データベースとWebサーバーを別のDockerコンテナで実行できます。

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

私の提案は、まずsystemdを使用して、すべてのプロセスがホストサーバーで直接実行されるようにすることです。多くの最新のソフトウェアパッケージには、systemdすでに設定ファイルが付属しています。

Dockerを追加すると、どのような利点があるかをよく理解し、明確になったらsystemdDockerをブレンドに追加することを検討できます。

私の職場では、Dockerを使用して一連のサービスを管理しようとしましたが、自分で管理することに慣れていました。systemdその結果、チームはより少ない数のbashスクリプトを使用して複数のものをまとめて維持することを好むきちんとしたシステムになりました。

関連情報