docker与PHP内置服务器

我试图通过docker运行的PHP内置服务器( php -S localhost:8080 ),我不能从主机访问网站,但我总是最终与连接重置。

以下是我构build的一个简单的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容器中启动web服务器,使用php -S localhost:8080则Web服务器将只接受来自Docker容器本身的连接。

为了能够从泊坞窗主机与您的networking服务器进行通信,您需要进行两项更改:

  • 在你的Dockerfile中添加EXPOSE 8080 ,或者运行容器add -p 8080EXPOSE 8080 docker run命令行。 这将告诉docker主机,你的容器有一个程序,期望在端口8080通信
  • 使用php -S 0.0.0.0:8080启动webserver,这样它也可以接受docker容器外部的连接

一旦你有一个容器运行这些变化,在docker主机上打开一个新的terminal,并使用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 。 然后查询您的networking服务器来validation您可以与之通信:

$ curl http://localhost:49153