使用Docker

时间:2017-10-29 07:22:45

标签: php mysql apache docker docker-compose

我一直在网上搜索和阅读手册,我似乎无法理解我的Docker设置有什么问题。

目标

对Apache,PHP和MySQL进行容器化,允许它们按项目进行自定义。部署堆栈的唯一依赖项应该是docker。应该能够通过Dockerfile构建/运行所有其他依赖项/操作。

概念证明

从我的Apache + MySQL + PHP堆栈到docker-compose.yml文件 - 我想定位index.php页面以成功呈现Hello Docker!以及所有可用数据库的列表。< / p>

问题

当我在浏览器中访问docker.dev/index.php时,而不是运行PHP代码,我只能查看PHP源代码。这就是我所看到的:

<?php

/**
 * This file:
 *     Has not been tested
 *     Does not use prepared statements
 *     Is for Proof of Concept only!
 */

$host = '127.0.0.1';
$user = 'root';
$pass = 'docker';

$conn = new mysqli($host, $user, $pass);

$sql = 'show databases';
$results = $conn->query($sql);

?>

<h1>Hello Docker!</h1>

<ul>
    <?php while ($row = $results->fetch_assoc()) : ?>
        <li><?= $row['Database'] ?></li>
    <?php endwhile ?>
</ul>

我的理解(可能是错误的)是Apache正确处理虚拟主机,但不知道通过Apache PHP模块加载PHP文件。

我已经将Apache设置为depends_on PHP并且我通过network(以及MySQL)将它们链接起来但显然我遗漏了一些东西,否则一切都会像我希望的那样工作)。

我在github上创建了一个repo,它允许你用一些简单的命令测试我的设置:

git clone https://github.com/dambrogia/docker-testing.git
cd docker-testing
docker-compose up -d

您还需要在主机上的主机文件中编辑添加docker.dev127.0.0.1

当我访问docker.dev/index.php时,如何渲染PHP而不是阅读它的来源?

如果可能的话,我不希望使用PHP和Apache组合图像。我想有三个独立的容器 - PHP,Apache,MySQL。

3 个答案:

答案 0 :(得分:3)

如果您正在使用PHP,并且希望每个容器只有一个进程,那么我建议使用Nginx并使用PHP-FPM,因为它比Apache更容易配置设置类型(至少是我发现的)。

您需要确保Nginx和PHP容器都有共同的共享卷。在该卷中,您将获得index.php。这是一个粗略的例子docker-compose.yml:

services:
  php7:
    image: "php:7.1.10-fpm"
    container_name: "prefix-php"
    volumes:
      - "./your/local/dir:/var/www/html"
  nginx:
    image: "nginx:1.13.6"
    container_name: "prefix-nginx"
    ports:
      - "80:80"
      - "443:443"
    links:
      - "php7"
    volumes:
      - "./your/local/dir:/var/www/html"

然后,您将在docker-compose.yml文件所在的目录中运行以下命令:

$ docker-compose -p prefix

&#34;前缀&#34;的原因是您为容器创建项目分组,以免与其他容器名称冲突。

当然,您需要一个指向/var/www/html的nginx站点配置。对于php-fpm容器,你几乎没有配置要求。

关于nginx配置的附注。上面的docker-compose.yml是不完整的,没有在nginx配置中引用php容器。这看起来像是这样(粗略地说):

server {
    listen 80 default_server;

    # ...more config, like root, index, server_name, etc

    location ~* \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass prefix-php:9000; # Note the container name here.
        fastcgi_index index.php;
        fastcgi_hide_header X-Powered-By;
        fastcgi_read_timeout 300s;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # ...more rules
}

您会注意到我将容器命名为#34; php7&#34;,您实际上可以添加另一个&#34; php5&#34;容器到此docker-compose.yml,然后允许您定义使用不同版本的PHP的nginx站点,所有这些站点都在同一个docker-compose设置上运行。

我很欣赏这并没有直接回答你的问题,因为它没有使用apache解决它,但它是一个可以考虑的替代方案。

希望这至少可以帮助您解决设置问题。

答案 1 :(得分:2)

我解决了这个问题,并为任何对更深入解释或概念证明感兴趣的人创建了一个回购。

请参阅我的回购:https://github.com/dambrogia/docker-testing

TL; DR

我用来解决此问题的方法是通过.php将所有fcgi://php:9000文件的apache请求代理到PHP-FPM。端口9000是默认值

您可以在行动here中看到此Apache设置。

设置的/var/www/html/$1部分是文件在PHP容器中的映射位置。

答案 2 :(得分:-1)

你遇到了“容器应该做一件事”的模因,这很好,但这并不意味着你应该把它拆分到这么远。 LAMP容器在Docker-land中是完全正常的,我不知道在分解Apache和PHP方面做了哪些努力 - 我怀疑这是浪费工程努力。

正如您所说,您希望能够运行不同的PHP版本。这绝对没问题,您应该在Dockerfile中自定义。如果您打算构建一组服务可以继承的容器,那么您可以简单地拥有一个基本的Apache容器,在继承Dockerfile s的基础上添加PHP。

我运行一组微服务,它们使用5.6和7.0的混合。它们都来自非常简单的alpine(不同版本:3.5,3.6和最新版本,将成为3.7)。复制并粘贴我的Dockerfile要求大约需要15分钟,加上我可能会做的一些容器调整。所以,如果你的目标是一套准备好的容器,我不确定你在实践中节省了多少时间。

所有人都说,如果你真的想要追求这个,你可以研究Piwik使用的机制。我不熟悉它,但PHP容器提供FastCGI,需要由另一个容器中的Web服务器代理。