【问题标题】:Docker with php built-in server带有 php 内置服务器的 Docker
【发布时间】:2014-10-24 19:56:54
【问题描述】:

我正在尝试通过 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 内置服务器似乎对主机隐藏,因此无法处理任何请求。

有人成功完成这项工作吗?

【问题讨论】:

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

标签: php docker


【解决方案1】:

如果在 docker 容器中使用php -S localhost:8080 启动网络服务器,那么网络服务器将只接受来自 docker 容器本身的连接。

为了能够从 docker 主机与您的网络服务器通信,您需要进行两项更改:

  • 在您的 Dockerfile 中添加 EXPOSE 8080,或者在运行容器时将 -p 8080 添加到 docker run 命令行。这将告诉 docker 主机,您的容器有一个程序需要在端口 8080 上进行通信
  • 使用php -S 0.0.0.0:8080 启动网络服务器,因此它也接受来自 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。然后查询您的网络服务器以验证您是否可以与其通信:

$ curl http://localhost:49153

【讨论】:

  • 为什么localhost:80不接受外界的连接,而0.0.0.0:80会?
  • 谢谢!将 localhost 更改为 0.0.0.0 也为我修复了它!
  • 另请注意,如果您使用 Dockerfile,请以 CMD [ "php", "-S", "0.0.0.0:8080" ] 开头(作为 2 个单独的参数)
猜你喜欢
  • 2015-06-13
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多