【问题标题】:php docker link apache dockerphp 码头工人链接 apache 码头工人
【发布时间】:2016-01-18 18:30:50
【问题描述】:

我构建了 2 个 docker,一个 docker 用 apache,一个 docker 用 php5,我使用 docker-compose 启动。

apache2 Dockerfile 位于 apache2 目录中:

FROM debian:latest
RUN apt-get update && apt-get install -y apache2
ADD test.php /var/www/html

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

和test.php:

<?php
phpinfo();
?>

php 目录下的 php5 Dorckerfile:

FROM debian:latest
RUN apt-get update && apt-get install -y php5

docker-compose.yml:

apache:
    build: ./apache2
    container_name: apache
    ports:
      - "80:80"
    links:
      - "php5"

php5:
    build: ./php
    container_name: php

然后我运行:

docker-compose up

apache2 服务器启动成功。然后我通过http://server_ip访问这个服务器,然后我得到了debian的索引。但是当我访问http://server_ip/test.php时,就会发生这种情况:

<?php
phpinfo();
?>

php 不起作用。我不知道为什么。

【问题讨论】:

  • php 和 apache 现在存在于两个不同的容器中,只能通过网络调用 /links / 数据交换相互交互,而不能通过简单的相互调用。您可能想要构建一个组合的 php5/apache 容器并确保使用 php5 模块。
  • @WolfgangFahl “通过网络调用/链接/数据交换相互交互”是什么意思?我不明白。
  • 您可以为 apache 和 php 使用单独的容器,但您需要使用在某个端口上运行的 php-fpm,然后您需要在您的 apache 配置文件中配置 php-fpm。跨度>

标签: php apache docker docker-compose


【解决方案1】:

您可以使用 PHP-FPM 分离 Apache 和 PHP。然而,DocumentRoot 必须安装在两个容器上。

Apache 必须能够访问本地文件(在其容器内)以及 PHP-FPM 服务器。

我目前也在做同样的事情,在这里看看我的 docker-compose.yml

https://github.com/cytopia/devilbox/blob/master/docker-compose.yml

两个卷(在 PHP 和 apache 中)都挂载到 /shared/httpd

【讨论】:

  • +1 关于“DocumentRoot 必须安装在两个容器上”的优点。我将把它添加到我提供的关于在单独的容器中连接 php-fpm 和 apache 的大纲答案中:stackoverflow.com/questions/43071337/…
【解决方案2】:

我会说它不可能将 php 的单独容器作为 apache 模块运行。我想这就是沃尔夫冈的意思。

如果你想在两个不同的容器中分离 apache 和 php,你需要将 php 作为 fpm 运行。
在这里寻找灵感:How to correctly link php-fpm and Nginx Docker containers together?

如果您需要将 apache 和 php 作为 apache_mod 运行,请使用这样的组合容器:https://github.com/docker-library/php/blob/fec7f537f049aafd2102202519c3ca9cb9576707/5.5/apache/Dockerfile 来自:https://hub.docker.com/_/php/

【讨论】:

【解决方案3】:

如果您不是特别需要将 Apache 与 PHP 分开,那么您最好使用官方的 php:5.6-apache image,它是 Apache 开箱即用的。

例如,您的 docker-compose.yml 可能如下所示:

version: '3'
services:
  web:
    image: php:5.6-apache
    ports:
      - "8080:80" # Map container port 80 to host machine port 8080
    volumes:
      - ".:/var/www/html" # Mount current folder as volume to container at /var/www/html

或者,举个更真实的例子,如果您还需要以下至少一项:

  • 自定义 Web 根目录(用于 Laravel、Symfony 等)
  • 已安装其他 Apache 模块
  • 已安装其他 PHP 扩展

你可能会做更多这样的事情:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:80" # Map container port 80 to host machine port 8080
    environment:
      APACHE_DOCUMENT_ROOT: "/var/www/yourapp.com/public"
    volumes:
      - ".:/var/www/yourapp.com" # Mount current folder as volume to container at /var/www/yourapp.com

然后是您的Dockerfile(我们从上面的docker-compose.yml 中引用):

FROM php:5.6-apache

# Declare an environment variable with a default value for changing Apache's document root
# We will override this in docker-compose.yml
ENV APACHE_DOCUMENT_ROOT /var/www/html

# Configure web root
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

# Install additional Apache modules
# This example: mod_rewrite & mod_headers
RUN a2enmod rewrite headers

# Install additional PHP extensions
# This example: memcached & mysqli
# For other extensions see official docs:
# https://hub.docker.com/_/php (section: How to install more PHP extensions)
RUN apt-get update && apt-get install -y libmemcached-dev zlib1g-dev \
    && pecl install memcached-2.2.0 \
    && docker-php-ext-enable memcached \
    && docker-php-ext-install -j$(nproc) mysqli

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多