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 8080
到EXPOSE 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