如何在Docker上运行PHP脚本?

29

我有一个index.php文件:

<?php
echo "Hello World";
?>

从网站获取的Dockerfile: https://docs.docker.com/samples/library/php/
FROM php:7.2-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./index.php" ]

我构建镜像并运行容器:
docker build -t my-php-app .
docker run -p 7000:80 --rm --name hello-world-test my-php-app

我只看到文本“Hello World”,但我的应用程序在http://localhost:7000/上无法正常工作,为什么?

8
该容器没有网络服务器。你需要使用类似于 FROM php:7.2-apache 这样的东西。 - executable
2
在提到“你的应用程序”和“不起作用”时,你能更具体一些吗? - edbighead
当我尝试打开网站时,出现了ERR_CONNECTION_REFUSED错误,对于php:7.2-apache仍然存在同样的问题。 - Aleksander Chelpski
只需在文档中搜索... docker run -d -p 80:80 --name my-apache-php-app -v "$PWD":/var/www/html php:7.2-apache - executable
我想使用Dockerfile来运行这个。 - Aleksander Chelpski
我遇到了 ERR_CONNECTION_REFUSED :( - Aleksander Chelpski
5个回答

45
如果您想使用php-cli运行一些“即兴”脚本,您可以创建一个容器,在脚本执行后立即删除它。
只需进入带有您的代码的目录并运行: Unix
docker container run --rm -v $(pwd):/app/ php:7.4-cli php /app/script.php

Windows - cmd

docker container run --rm -v %cd%:/app/ php:7.4-cli php /app/script.php

Windows - PowerShell

docker container run --rm -v ${PWD}:/app/ php:7.4-cli php /app/script.php

--rm参数会在容器执行结束后自动删除容器。 -v $(pwd):/app/会挂载当前目录。 php:7.4-cli是镜像名称。 php /app/script.php是创建容器后要执行的命令。

2
正是我所需要的。非常适合测试简单的脚本和旧版 PHP 的行为。谢谢你。 - Henrik O. Skogmo
刚刚偶然发现这个,完美地解决了我遇到的问题。谢谢,非常有用! - RocketNuts
不知道为什么这个答案没有被接受——我尝试了,而且一切都有效。这个答案应该被接受。 - Green Joffer

22
您可以保留与php:7.2-cli相同的基础镜像:
FROM php:7.2-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./index.php" ]

构建镜像:

docker build -t my-php-app .

运行它:

docker run --rm --name hello-world-test my-php-app

您将获得:

Hello World

除了端口映射(-p 7000:80)之外,您所做的一切都是正确的,因为您没有运行Web服务器,所以这个映射并不必要。
==编辑
如果您想将其作为Web服务器运行,请使用以下Dockerfile:
FROM php:7.2-apache
COPY . /var/www/html/

...构建它:

docker build -t my-php-app .

...然后运行它:

docker run -p 8080:80 -d my-php-app

然后您的PHP脚本将在8080端口上运行。


但是我想运行Web服务器,因为我需要在浏览器中显示我的网站。 - Aleksander Chelpski
本文介绍如何使用Docker-compose https://thecodeframework.com/running-php-using-docker-compose-yml-file/ - Gagan

11

1. 创建简单的 PHP 脚本:

echo '<?php echo "Working";' > my.php

2. 运行 Docker:

docker  run -p 8080:8080 --rm -v $(pwd):$(pwd) php:7.4-cli php -S 0.0.0.0:8080  $(pwd)/my.php

3. 在浏览器中打开:

http://localhost:8080/


3
许多答案建议使用Apache来实现这一点,但这并非必需。您需要让容器中的应用程序在特定端口上持续运行。您可以保留php:7.2-cli镜像,但您的CMD应该不同:

CMD [ "php", "-S 0.0.0.0:80", "./index.php" ]

这将运行内置的PHP Web服务器,之后您可以使用您已经拥有的docker run命令暴露它。


为了避免出现“php_network_getaddresses: getaddrinfo failed…”错误,我不得不修改命令如下:CMD [ "php", "-S", "0.0.0.0:80", "./index.php" ] - w5m

0

这是一个在Windows 11上使用Docker的快速简单示例,假设您有与下面示例类似的目录结构:

C:\Users\YourName\Workspace\MyProject\program.php

program.php 的内容如下:

<?php echo "It works!"; ?>

然后,在命令提示符中,导航到项目目录:

cd C:\Users\YourName\Workspace\MyProject

使用CLI运行

docker run --rm -p 8080:8080 -v %CD%:/cli php:7.4-cli php -S 0.0.0.0:8080 /cli/program.php

视图:http://localhost:8080

使用服务器运行

docker run --rm -d -p 8081:80 -v %CD%:/server --mount type=bind,source="%CD%",target=/var/www/html php:apache

查看:http://localhost:8081/program.php

然后随意修改program.php并刷新页面。

环境

  • Docker版本20.10.16,构建aa7e414
  • Windows 11 Home,版本22H2,OS构建22622.436

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接