我正试图通过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
对于docker compose
services:
api:
build: ./api
command: php -S 0.0.0.0:80
ports:
- 80:80
与dockerfile,放置在/api文件夹
FROM php:apline
WORKDIR /
COPY . .