当前位置: 首页 > 知识库问答 >
问题:

PHP Docker容器不处理文件,而是为源服务

狄玉书
2023-03-14

我的PHP Docker容器没有处理文件,而是返回了源代码。

正在返回而不是执行以下内容:

<?php 
phpinfo();
?>

docker ps的输出,以显示两个my容器都在各自的端口上运行和侦听:

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配置,请注意将PHP传递到容器的FilesMatch指令。

<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个答案

元玮
2023-03-14

首先,请注意,Apache的官方PHP映像使用/var/www/html作为其默认webroot(请参阅映像文档)

您案例中的问题可能是因为您基于IP地址定义了virtualhost;

<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;}
.....
 类似资料:
  • 我开始做一些类似资源类的东西,在那里我可以为我的应用程序保存我所有的文件,像图像和声音,但它变得非常混乱,所有的东西都在应用程序的乞求中加载。 这是包含所有内容的类:https://sourceb.in/s8rjgqqgss(头文件)https://sourceb.in/cjiq78hdov(cpp文件的一部分) 我很抱歉把它贴在不同的网站上,但正如你所看到的,它真的很乱,我也不知道如何让它变得更

  • 我目前正在开发Jersey/Hibernate web服务(在Tomcat 9容器中),它应该能够使用和生成JSON(应用程序/JSON)和XML(应用程序/XML)。它支持GET和POST来使用这些类型。DELETE是受支持的,并且可以工作,对于JSON,GET和POST也是如此。但是,当我尝试使用XML内容类型时,我得到了一个500内部服务器错误。 结构如下:(检查下面的代码)歌曲列表(son

  • 问题内容: 在我将其添加到本地服务器的文档根目录中的.htaccess文件之前,一切都进行得很好(我经常根据所使用的站点对其进行更改)。自从我这样做后,当我访问http:// localhost:8888时, 我的浏览器只下载index.php,而根本不处理它,而只处理原始代码。现在, 我从.htaccess文件中删除了该行,但仍然遇到此问题 。 我发现,如果我将127.0.0.1的替代条目添加到

  • 我在docker中有两个服务后端和前端(nodejs),它们通过nginx(也在docker中)处理。 Nginx配置: 我使用nginx location将所有请求代理给

  • grep用于在文件内搜索,查看是否有任何行与给定的正则表达式匹配。然而,我有这种情况--我想编写一个将与文件名本身(而不是文件内容)匹配的正则表达式。我将从系统的根目录运行它,以找到所有与正则表达式匹配的文件。

  • 很多 .NET 类提供两种方式处理系统事件。你可以附加指定一个事件处理器或者重载基类的虚函数。为什么提供两种方式做同一件事情?因为不同的情况需要不同的解决方案,这就是为什么。在子类中,你总可以重载虚函数。这样不相关对象就不能使用这个事件处理器。你可以写的一个漂亮的 Windows Presentation Foundation (WPF) 应用,需要响应鼠标按下事件。在你的 Form 类中,你可以