2014-08-31 61 views
8

我试图通过docker运行php内置服务器(php -S localhost:8080),但我无法从主机访问网站 - 我总是以Connection重置为结束。Docker with php内置服务器

这里有一个简单的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"] 

它甚至有可能运行该服务器泊坞窗?在试图使其工作时,我发现当nginx安装并设置为在这个端口上侦听时,它可以从主机访问。 PHP内置服务器似乎对主机隐藏,因此无法提供任何请求。

任何人都成功地做这项工作?

+0

你是如何开始你的容器? – Behe 2014-08-31 16:38:34

+2

'docker run -it -p 8080:8080 container/bin/bash'然后我用'php -S localhost:8080'在需要的目录中手动启动服务器 – 2014-08-31 16:58:12

+0

请注意,PHP的内部WebServer运行单线程并且不是对于任何生产环境! – Paul 2014-11-03 08:06:00

回答

22

如果从码头集装箱内启动您的网络服务器php -S localhost:8080,则网络服务器将只接受源自码头集装箱本身的连接。

为了能够从你需要做两个更改泊坞窗主机与您的Web服务器进行通信:在您的Dockerfile

  • ,加EXPOSE 8080,或运行容器中时添加-p 8080docker run命令行。这将告诉搬运工主机的容器有一个计划,预计在端口通信8080
  • 开始php -S 0.0.0.0:8080 Web服务器,因此也接受来自泊坞窗容器本身之外的连接

一旦你有一个容器中运行通过这些更改,在码头主机上打开一个新终端,并使用docker ps命令查看码头主机上的哪个端口转发到容器中的端口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 

在搬运工主机的该示例端口49153将被使用。然后查询您的Web服务器来验证你可以用它沟通:

$ curl http://localhost:49153

+0

为什么'localhost:80'不接受来自外部世界的连接,但是'0.0.0.0:80'会呢? – gvlasov 2016-10-08 00:35:18

+3

@Suseika见http://stackoverflow.com/questions/20778771/what-is-the-difference-between-0-0-0-0-127-0-0-and-localhost – Thomasleveil 2016-10-08 21:21:03