PHP Docker 容器不处理文件而是提供源
PHP Docker container not processing files and serving the source instead
我的 PHP Docker 容器没有处理文件,而是返回了源文件。
以下内容被返回而不是被执行:
<?php
phpinfo();
?>
docker ps
的输出,以表明我的两个容器都在 运行ning 并在各自的端口上侦听:
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
Virtualhost 配置,注意 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 运行ning,现在,我正在尝试附加 PHP.
最终,我想添加 Nextcloud,IIRC 有一个没有 Apache 的容器,我可以在其中重用现有容器。
我的PHPDocker文件
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/*
首先,请注意 Apache 的官方 PHP 映像使用 /var/www/html
作为其默认的 webroot(参见 documentation for the image)
您遇到的问题可能是因为您根据 IP 地址定义了虚拟主机;
<VirtualHost 192.168.2.35:80>
当docker 启动容器时,会在内部(容器-容器)网络上为容器分配一个随机IP 地址。此 IP 地址与您的 host 的 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;}
.....
我的 PHP Docker 容器没有处理文件,而是返回了源文件。
以下内容被返回而不是被执行:
<?php
phpinfo();
?>
docker ps
的输出,以表明我的两个容器都在 运行ning 并在各自的端口上侦听:
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
Virtualhost 配置,注意 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 运行ning,现在,我正在尝试附加 PHP.
最终,我想添加 Nextcloud,IIRC 有一个没有 Apache 的容器,我可以在其中重用现有容器。
我的PHPDocker文件
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/*
首先,请注意 Apache 的官方 PHP 映像使用 /var/www/html
作为其默认的 webroot(参见 documentation for the image)
您遇到的问题可能是因为您根据 IP 地址定义了虚拟主机;
<VirtualHost 192.168.2.35:80>
当docker 启动容器时,会在内部(容器-容器)网络上为容器分配一个随机IP 地址。此 IP 地址与您的 host 的 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;}
.....