PHP Docker容器不处理文件并提供源代码
Posted
技术标签:
【中文标题】PHP Docker容器不处理文件并提供源代码【英文标题】:PHP Docker container not processing files and serving the source instead 【发布时间】:2019-05-22 09:25:06 【问题描述】:我的 php Docker 容器没有处理文件,而是返回源代码。
以下内容被返回而不是被执行:
<?php
phpinfo();
?>
docker ps
的输出,表明我的两个容器都在运行并在各自的端口上侦听:
dan@server:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5e235112a35 php:7.2-fpm "docker-php-entrypoi…" 23 minutes ago Up 23 minutes 0.0.0.0:9000->9000/tcp php
2196a8f251d3 httpd "httpd-foreground" 5 days ago Up 33 seconds 0.0.0.0:80->80/tcp apache
虚拟主机配置,注意 FilesMatch
指令将 PHP 传递给容器。
<Directory /usr/local/apache2/htdocs/default>
Options -Indexes
AllowOverride All
Require all granted
</Directory>
<VirtualHost 192.168.2.35:80>
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /usr/local/apache2/htdocs/default
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php:9000"
</FilesMatch>
LogLevel trace1
ErrorLog logs/error.default.ca.log
CustomLog logs/access.default.ca.log combined
</VirtualHost>
Apache 日志,显示该文件正在由 Apache 提供服务。
192.168.2.30 - - [22/Dec/2018:02:40:49 +0000] "GET /default/index.php HTTP/1.1" 200 24
编辑
我正在尝试在单独的容器中运行 Apache、PHP 和 MariaDB。我先运行了 Apache,现在我正在尝试附加 PHP。
最后,我想添加 Nextcloud,IIRC 有一个没有 Apache 的容器,我可以在其中重复使用我现有的容器。
我的 PHP Dockerfile
FROM php:7.2-fpm
RUN buildDeps=" \
libmcrypt-dev \
default-libmysqlclient-dev \
libjpeg-dev \
libldap2-dev \
libmemcachedutil2 \
libpng-dev \
libpq-dev \
libxml2-dev \
" \
&& apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y $buildDeps $runtimeDeps \
&& pecl install mcrypt-1.0.1 && docker-php-ext-enable mcrypt.so \
&& docker-php-ext-install bcmath bz2 calendar iconv json intl mbstring mysqli opcache pdo_mysql soap zip \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
&& apt-get purge -y --auto-remove $buildDeps \
&& rm -r /var/lib/apt/lists/*
【问题讨论】:
【参考方案1】:首先,请注意,Apache 的官方 PHP 映像使用 /var/www/html
作为其默认 webroot(请参阅 documentation for the image)
您的问题可能是因为您基于 IP 地址定义了一个虚拟主机;
<VirtualHost 192.168.2.35:80>
当 docker 启动一个容器时,容器会在内部(容器-容器)网络上分配一个随机 IP 地址。此 IP 地址与您的 主机 的 IP 地址不匹配,并且您的容器配置不应依赖于 IP 地址(因为它会在容器启动时随时更改,如果您运行容器的多个实例,每个实例都会获得自己的 IP 地址)。
容器不是虚拟机,通常会处理单个服务/网站。假设您的容器将运行单个网站/虚拟主机,在这种情况下,您可以使用与默认配置相同的配置:
<VirtualHost *:80>
如果你不需要特殊配置,你可以使用镜像的默认配置,这样就可以了:
创建您的index.php
cat > ./index.php -<<'EOF'
<?php
phpinfo();
?>
EOF
创建你的 Dockerfile;
cat > ./Dockerfile -<<'EOF'
FROM php:7.3-apache
COPY index.php /var/www/html/
EOF
建立你的形象:
docker build -t mywebsite .
启动你的容器;将容器的80端口映射到宿主机的4000端口;
docker run -d -p 4000:80 --name mywebsite-container mywebsite
在浏览器中检查输出,或使用curl
:
curl http://localhost:4000
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body background-color: #fff; color: #222; font-family: sans-serif;
.....
【讨论】:
我没有注意到我在单独的容器中运行 Apache 和 PHP,首先构建了 Apache,然后构建了 PHP。目标是为 Apache、PHP 和 MariaDB 提供单独的容器。 更改为 *:80 让我更进一步并解决了我的问题。谢谢!以上是关于PHP Docker容器不处理文件并提供源代码的主要内容,如果未能解决你的问题,请参考以下文章