我试图通过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容器中启动带有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.然后查询您的网络服务器以验证您是否可以与之通信:
$curl http:// localhost:49153