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;}
.....