这可能是一个有点令人困惑的问题......
我最近开始使用 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
脚本将事物粘合在一起并进行维护。