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容器不处理文件并提供源代码的主要内容,如果未能解决你的问题,请参考以下文章

Docker概述

Docker下载镜像并创建容器运行

docker安装nginx容器小记

Docker--------企业级最佳入门

《Docker系列》Docker容器修改配置文件后,重启失败,如何修改配置并启动容器?

2015年五大Docker容器技术窍门