Docker与php内置服务器

Mic*_*ann 13 php docker

我试图php -S localhost:8080通过docker 运行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"]
Run Code Online (Sandbox Code Playgroud)

甚至可以用docker运行这个服务器吗?在尝试使其工作时,我发现当安装nginx并设置为侦听此端口时,可以从主机访问它.PHP内置服务器似乎是从主机隐藏的,因此无法提供任何请求.

有人成功地完成了这项工作吗?

Tho*_*eil 34

如果从docker容器中启动您的Web服务器,php -S localhost:8080那么Web服务器将只接受来自docker容器本身的连接.

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

  • 在Dockerfile中,添加EXPOSE 8080或运行容器时添加-p 8080docker run命令行.这将告诉docker主机您的容器有一个程序,该程序需要在端口8080上进行通信
  • 启动web服务器,php -S 0.0.0.0:8080因此它也接受来自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
Run Code Online (Sandbox Code Playgroud)

在此示例49153中,将使用docker主机的端口.然后查询您的网络服务器以验证您是否可以与之通信:

$ curl http://localhost:49153

  • @Suseika见http://stackoverflow.com/questions/20778771/what-is-the-difference-between-0-0-0-0-127-0-0-1-and-localhost (4认同)
  • 为什么 `localhost:80` 不接受来自外界的连接,而 `0.0.0.0:80` 会? (3认同)
  • 谢谢!将 `localhost` 更改为 `0.0.0.0` 也为我解决了这个问题! (2认同)