簡體   English   中英

使用Docker容器化Apache,MySQL和PHP

[英]Containerizing Apache, MySQL and PHP With Docker

我一直在網上搜索並閱讀手冊,但似乎無法理解Docker設置的問題。

目標

為了對Apache,PHP和MySQL進行容器化,允許在每個項目的基礎上對其進行自定義。 部署堆棧的唯一依賴關系應該是docker。 所有其他依賴項/動作都應該能夠通過Dockerfile構建/運行。

概念證明

從我的Apache + MySQL + PHP堆棧通過docker-compose.yml文件-我想定位一個index.php頁面以成功呈現Hello Docker! 以及所有可用數據庫的列表。

問題

當我在瀏覽器中訪問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上創建了一個存儲庫,該存儲庫應允許您使用一些簡單的命令來測試我的設置:

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

您還必須在主機上的hosts文件中將add docker.dev添加到127.0.0.1

訪問docker.dev/index.php時如何呈現PHP而不是讀取源代碼?

如果有可能, 我不想使用PHP和Apache組合的映像。 我想要三個獨立的容器-PHP,Apache,MySQL。

如果您正在使用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

使用“前綴”的原因是您為容器創建了一個項目分組,以免與其他容器名稱沖突。

當然,您自然需要一個指向/var/www/html的nginx站點配置。 您幾乎沒有對php-fpm容器的配置要求。

關於nginx配置的附帶說明。 在nginx配置中未引用php容器的情況下,上述docker-compose.yml是不完整的。 看起來像這樣(大致而言):

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
}

您會注意到我將容器命名為“ php7”,實際上您可以docker-compose.yml添加另一個“ php5”容器,然后允許您定義使用不同版本PHP的nginx站點,這些站點均在同一docker-上運行撰寫設置。

我很高興這不能直接回答您的問題,因為它不能使用apache來解決,但是可以考慮。

希望這至少可以為您提供一些想法,以幫助您解決設置問題。

我解決了這個問題,並為對進一步解釋或概念驗證感興趣的任何人創建了一個回購協議。

請參閱我的倉庫: https : //github.com/dambrogia/docker-testing

TL; DR

我用來解決此問題的方法是通過fcgi://php:9000所有.php文件的所有apache請求代理到PHP-FPM。 默認端口9000

您可以在此處查看此Apache設置的實際操作。

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

您曾經遇到過“容器應該做一件事”的模因,這很好,但這並不意味着您應該將其分解為如此。 LAMP容器在Docker-land上是完全正常的,而且我不知道為拆分Apache和PHP付出了什么努力-我懷疑這是浪費工程精力。

如您所說,您希望能夠運行不同的PHP版本。 沒關系,您應該在Dockerfile自定義。 如果您打算構建一組可以從中繼承服務的容器,那么您可以簡單地擁有一個基本的Apache容器,在該容器上您可以在繼承Dockerfile的過程中添加PHP。

我運行了一組微服務,它們混合使用5.6和7.0。 它們都繼承自非常普通的alpine (版本不同:3.5、3.6和最新版本,將成為3.7)。 復制和粘貼我的Dockerfile需求大約需要15分鍾,再加上我可能會做的一些容器調整。 因此,如果您的目標是准備運行的一組容器,那么我不確定您將在實踐中節省多少時間。

綜上所述,如果您真的想追求這一點,則可以研究Piwik使用的機制。 我不熟悉它,但是PHP容器提供FastCGI,而這需要由Web服務器在另一個容器中進行代理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM