Docker带有内置的php服务器

28

我正在尝试通过Docker运行PHP内置服务器(php -S localhost:8080),但我无法从主机访问站点 - 我总是最终出现“连接重置”的错误。

这是我构建的一个简单的Dockerfile:

FROM centos:centos6

RUN rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

RUN yum --enablerepo=remi,remi-php55 install -y php php-opcache php-cli php-pear php-common && yum clean all
RUN php -r "readfile('https://getcomposer.org/installer');" | php
RUN echo "date.timezone = Europe/Prague" >> /etc/php.ini
RUN mv composer.phar /usr/bin/composer
RUN php -r "eval('?>'.file_get_contents('http://backend.bolt80.com/piecrust/install'));"
RUN mv piecrust.phar /usr/bin/chef

CMD ["/bin/bash"]

使用Docker运行此服务器是否可行?在尝试使其正常工作时,我发现当安装并设置nginx侦听该端口时,可以从主机访问它。 但PHP内置服务器似乎对主机隐藏,因此无法处理任何请求。

有人成功地让它正常工作吗?


你是如何启动容器的? - Behe
2
docker run -it -p 8080:8080 container /bin/bash,然后我在所需的目录中手动启动服务器,使用 php -S localhost:8080 - Michal Zimmermann
请注意,PHP的内部Web服务器是单线程运行的,不适用于任何生产环境! - Paul
docker run -it -p 8080:8080 image /bin/bash - Alex S
2个回答

69

如果您在 Docker 容器内使用 php -S localhost:8080 启动 Web 服务器,则该 Web 服务器只会接受来自 Docker 容器本身的连接。

要能够从 Docker 主机与您的 Web 服务器通信,需要进行两个更改:

  • 在 Dockerfile 中添加 EXPOSE 8080,或者在运行容器时将 -p 8080 添加到 docker run 命令行。这将告诉 Docker 主机,您的容器有一个期望在端口 8080 上通信的程序。
  • 使用 php -S 0.0.0.0:8080 启动 Web 服务器,以便它还接受来自 Docker 容器本身之外的连接。

一旦您对容器进行了这些更改并运行起来了,就可以在 Docker 主机上打开一个新终端,并使用 docker ps 命令查看将哪个端口从 Docker 主机转发到容器中的端口 8080。例如:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                     NAMES
fbccf4058b07        test:latest         "php -S 0.0.0.0:8080   4 minutes ago       Up 4 minutes        0.0.0.0:49153->8080/tcp   sad_hawking

在这个例子中,将使用docker主机的端口49153。然后查询您的Web服务器以验证您是否可以与其通信:

$ curl http://localhost:49153


4
为什么localhost:80不会接受来自外部世界的连接,但0.0.0.0:80可以呢? - gvlasov
5
@Suseika 请查看https://dev59.com/AGIi5IYBdhLWcg3w9wUU。 - Thomasleveil
2
谢谢!将“localhost”更改为“0.0.0.0”也解决了我的问题! - Giel Berkers
1
请注意,如果您使用 Dockerfile,请从 CMD [ "php", "-S", "0.0.0.0:8080" ](作为 2 个单独的参数)开始。 - Laoujin

0

关于 docker compose

services:
  api:
    build: ./api
    command: php -S 0.0.0.0:80
    ports:
      - 80:80

使用 Dockerfile,放置在 ./api 文件夹中

FROM php:apline
WORKDIR /
COPY . .

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