
本文详细阐述了 `jelastic/nginxphp` docker 镜像在本地环境启动时服务(如 nginx 和 php-fpm)不运行的问题及其解决方案。由于该镜像专为 virtuozzo devops 平台设计,其默认启动命令是 `systemd`。教程将指导用户如何通过覆盖 docker cmd 来直接启动 nginx 服务,从而在本地成功运行并验证 `jelastic/nginxphp` 容器。
jelastic/nginxphp Docker 镜像的设计理念与 Docker Hub 上常见的通用 Nginx 镜像有所不同。它并非旨在作为独立的、开箱即用的 Web 服务器容器在本地直接运行,而是专为 Virtuozzo DevOps 平台优化,以支持该平台提供的所有功能和自动化特性。这意味着该镜像在启动时,其默认的 CMD(命令)是 /usr/lib/systemd/systemd,而非直接启动 Nginx 或 PHP-FPM 服务。
当用户尝试在本地环境直接运行此镜像时,例如使用 docker run -p 8080:80 jelastic/nginxphp:1.14.2-php-7.2.9,容器虽然会启动,但由于 systemd 进程被启动,而没有显式地去启动 Nginx 或 PHP-FPM,导致外部访问(如 curl 127.0.0.1:8080)时会收到“Empty reply from server”的错误,且在容器内部查看进程列表 (docker exec [container_id] ps aux) 也无法找到 Nginx 或 PHP-FPM 相关的进程。
为了验证上述情况,我们可以使用 docker inspect 命令来查看 jelastic/nginxphp 镜像的详细配置,特别是其默认的 Cmd。
docker inspect jelastic/nginxphp:1.14.2-php-7.2.9
在输出的 JSON 配置中,您会找到类似以下片段:
立即学习“PHP免费学习笔记(深入)”;
"Cmd": [
"/usr/lib/systemd/systemd"
],这明确指出,该镜像的默认启动命令是 systemd。在标准的 Docker 实践中,容器通常只运行一个主进程,并且该进程在前台运行。systemd 是一个初始化系统,它本身并不会直接提供 Web 服务,而是负责管理和启动其他服务。因此,在本地 Docker 环境中,如果需要直接运行 Nginx 服务,就必须覆盖这个默认的 CMD。
要在本地环境中成功运行 jelastic/nginxphp 镜像并使其提供 Web 服务,我们需要在 docker run 命令中显式地指定 Nginx 的启动命令,从而覆盖镜像默认的 CMD。
以下是正确的 docker run 命令示例:
docker run -p 8080:80 jelastic/nginxphp:1.14.2-php-7.2.9 /usr/sbin/nginx '-g daemon off;'
命令解析:
在执行上述 docker run 命令后,您可以打开一个新的终端窗口,通过 curl 命令验证 Nginx 服务是否已成功启动并监听在主机的 8080 端口:
curl 127.0.0.1:8080
如果 Nginx 成功运行,您应该会收到一个正常的 HTTP 响应(例如 Nginx 的欢迎页面或您在容器中配置的默认页面内容),而不是“Empty reply from server”错误。
您也可以通过 docker exec 进入容器内部,使用 ps aux 命令来查看 Nginx 进程是否正在运行:
docker ps # 获取容器ID docker exec [容器ID] ps aux | grep nginx
通过理解 jelastic/nginxphp 镜像的设计初衷并正确覆盖其默认 CMD,开发者可以在本地环境中有效地利用此镜像进行开发和测试工作。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号