這可能是一個有點令人困惑的問題...
我最近開始使用 docker,並嘗試設定一個基本的 lamp 伺服器。
我有一個帶有 httpd、php 和 mysql 的 centos docker 映像。
但是,在 docker 容器中,我無法像通常透過 systemd / service 那樣啟動服務。
我可以透過以下方式直接運行 httpd/usr/sbin/httpd
那麼運行 httpd via/usr/sbin/httpd
和 via 之間有什麼區別呢systemctl start httpd
?
有沒有「正確」的方法來停止或重新啟動httpd? - 我以為我可以終止該進程,但它似乎啟動了大約 10 個 apache 進程。
我知道這不是一個特別集中的問題,但任何指向相關資料的指示都將不勝感激。
答案1
systemctl
如果您的 PID 1 不是 systemd,則無法使用。您可以使用 找到您的 PID 1 ps -q 1
。
能夠以正常方式啟動和停止服務是本文提到的優點在非特權容器中執行 systemd。其他人正在記錄或追蹤子進程,如安德烈的回答中所述。
答案2
systemd 服務將以與直接運行類似的方式啟動進程,但它將追蹤所有分叉的進程和執行緒。這意味著當您systemctl stop apache
關閉所有子進程時,它將關閉。使用 systemd 進程也很好,因為它們將在背景運行,並且可以在系統啟動時啟動。
答案3
考慮到您在學習曲線上的位置,我不會使用 Docker 來完成您的任務。
如果您使用 Docker 進行進程隔離,則可以使用唯一的 Unix 用戶,或者 systemd 也包含指令來限制 systemd 服務可以存取的內容。例如參見Capabilities=
中的範例man systemd.exec
。
此外,為了使用 Docker 進行進程隔離,您可以在不同的 Docker 容器中執行每個資料庫和 Web 伺服器。
提供的另一個重要功能systemd
是流程管理。也就是說,如果您的httpd
進程崩潰,systemd 將為您重新啟動它。
我的建議是先使用 systemd 讓所有進程直接在主機伺服器上運行。許多現代軟體包systemd
已經附帶了設定檔。
一旦您充分了解systemd
並清楚添加 Docker 將提供什麼好處,然後您可以考慮將 Docker 加入其中。
在我的工作中,我們嘗試使用 Docker 來管理一組服務,但後來習慣於直接管理systemd
,結果是一個更乾淨的系統,團隊更喜歡用更少的bash
腳本將事物粘合在一起並進行維護。