簡體   English   中英

Docker中PHP和Apache / httpd的高級變體

[英]Alpine variants of PHP and Apache/httpd in Docker

我正在嘗試使用Docker,並希望從本地MAMP堆棧轉移到Docker。 當然我偶然發現官方的php:7.0圖像,但我也想使用Apache,所以看起來好像是php:7.0-apache是要走的路。 但是我看到有一個名為php:7.0-alpine的圖像php:7.0-alpine ,它更加纖薄,而Apache有兩個版本,即httpd:2.4httpd:2.4-alpine

是否有任何建議的組合使用Apache和PHP(分離或組合),同時仍然具有小圖像大小? 此外,我想知道在哪里可以查看圖像中的可用模塊,因為我想使用MariaDB和mod_rewrite,這可能有更多的依賴關系,這些依賴關系已被省略以保持較小的尺寸。


有關使用nginx實現所需基礎架構的信息

我遇到了這個非常詳細和令人敬畏的教程,關於如何將nginx和PHP以及MySQL分成不同的容器,但是使用FCGI將PHP附加到nginx。 這意味着我可以使用工具的所有不同的基於阿爾卑斯的圖像並使用FCGI鏈接它們。 不幸的是,我從未聽說過或曾與FCGI合作,但我想更多的研究將會產生有關如何使用Apache實現此基礎架構的信息。

使用FCGI運行官方Apache和PHP

除了為我提供的helmbert提出的解決方案之外,我還在使用官方的httpd:2.4-alpine圖像。 我想補充一些更多的信息和警告我在這方面的工作中偶然發現。

  • Apache配置稍微困難一些,因為它是一個較輕的版本,沒有通常的vhost數據結構,沒有a2en*和沒有a2dis*腳本。
  • /etc/apache2沒有通用文件夾結構。 一切都在/usr/local/apache2 ,你在/usr/local/apache2/conf/有你的全局httpd.conf 在此文件中,您必須手動取消注釋模塊行以加載它們以及httpd-vhosts.conf存儲在/usr/local/apache2/conf/extra/其他配置文件。
  • 我使用httpd-vhosts.conf為我的測試設置了基本選項:

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/htdocs

    <Directory /usr/local/apache2/htdocs>
        Options -Indexes +FollowSymLinks -MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /usr/local/apache2/main-error.log
    LogLevel warn
    CustomLog /usr/local/apache2/main-access.log combined
</VirtualHost>

  • 對於FCGI服務器,我必須取消注釋以下兩行:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

  • 每次更改配置中的內容時,您必須像往常一樣./bin/apachectl restart ,假設您在/usr/local/apache2
  • 由於我使用nano我必須使用apk --no-cache add nano手動安裝它。 這可以在交互式會話中完成,也可以使用Dockerfile全局分叉基礎映像。
  • 打開nano時出錯 - 在我的情況下,我必須在交互式shell中export TERM=xterm或在Dockerfile ENV TERM xterm
  • 事實證明, php-fpm必須能夠訪問相同的文件 - 這是我最初在提議的解決方案中沒有注意到的事情。 這意味着我將源文件安裝在兩個不同的路徑( httpd圖像中的/usr/local/apache2/htdocsphp-fpm圖像中的/var/www/html )並且必須正確轉發呼叫。 我在httpd.conf使用了以下行。

ProxyPassMatch "^/(.*\.php)$" "fcgi://fpm:9000/var/www/html/$1"

  • FCGI鏈接中的fpm名稱是使用--link fpm鏈接到httpd並自動添加到/etc/hosts容器的名稱。
  • 到目前為止,我通過交互式方式完成所有這些更改,成功實現了我想要的。 我將使用COPY命令或應用基本sed調用將所有更改添加到Dockerfile
  • 我知道有可能通過命令SetHandler "proxy:unix:/var/run/php7-fpm.sock|fcgi://fpm/"使用unix套接字,但我不知道這是否有用。

使用FCGI運行Apache / NGINX和PHP

如果你想在不同的容器中運行Apache和PHP,你需要使用PHP-FPM容器(例如,使用php:7-fpmphp:7-fpm-alpine圖像),然后使用FCGI連接兩個。 默認情況下, 官方PHP-FPM圖像為此公開TCP端口9000,這對於大多數情況應該是足夠的。

對於PHP-FPM, 官方PHP圖像應該沒問題(關於大小, 7.0.14-fpm-alpine標簽的大小只有31M)。 關於Apache,我喜歡webdevops/apache圖像 (我沒有任何關聯)。 它還附帶一個基於Alpine的版本,只有38M大小,與PHP-FPM一起使用。

以下是使用FCGI鏈接在一起的單獨PHP-FPM和Apache容器的方法:

$ docker run -d \
    -v /path/to/data:/var/www/html \
    --name fpm \
    php:fpm-7.0.14-alpine
$ docker run -d \
    -v /path/to/data:/var/www/html \
    --name apache \
    --link fpm \
    -e WEB_PHP_SOCKET=fpm:9000 \
    -e WEB_DOCUMENT_ROOT=/var/www/html \
    webdevops/apache:alpine-3

要使用Nginx,只需將webdevops/apache圖像替換為webdevops/nginx

添加自定義擴展

由於您還詢問了如何向映像添加其他PHP擴展:這在官方PHP映像的文檔中有所介紹。 您可以通過在自定義Dockerfile中運行docker docker-php-ext-install將自定義PHP擴展添加到PHP基本映像:

FROM php:7.0.14-fpm-alpine
RUN docker-php-ext-install pdo_mysql

這允許您基於其中一個PHP-FPM基礎映像構建自定義映像,並在Dockerfile添加所需的所有擴展。

暫無
暫無

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

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