使用Docker來建立Apache+PHP網頁伺服器


很久很久以前,想要在Linux伺服器上安裝Apache網頁伺服器和PHP,不外乎就是apt或yum install,安裝完還要打開設定檔手動修改設定。每次重新安裝新伺服器都要經過以上繁複過程。

現在,Docker的出現可以減少安裝過程中的繁複步驟,只需要設定一次即可快速在不同機器上還原相同的環境,真的超級方便!以前剛學習建立Linux伺服器時也是用package manager來進行伺服器安裝,每安裝一台伺服器就需要跑一次繁複流程。不過現在我大部分的服務都已經改用Docker形式部署,遷移伺服器只需要複製Docker設定檔和服務的資料,再跑一次docker-compose up -d就完成服務架設。(榮恩,這比魔杖好用多了!)

我使用的遷移方式是在Host主機上映射一個資料夾到Docker容器中的網頁目錄根(web root),這樣當容器建立好後,我就可以把舊的網頁複製到映射資料夾,給容器裏的Apache來執行。以下簡單分享我用Docker設定Apache+PHP的過程。

首先,我們先建立Apache+PHP伺服器的Dockerfile。這個檔案內容等於我們傳統安裝時下的指令。這裡我使用了PHP 7.4版本連Apache的官方映像。透過install-php-extensions這個程式,我們可以在裡面安裝需要的PHP擴展庫。

Dockerfile
FROM php:7.4-apache

ENV IPE_GD_WITHOUTAVIF=1

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# Use the default production configuration
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions gd exif gettext gmp igbinary pdo_mysql mysqli redis shmop xsl && \
    a2enmod rewrite

在PHP版本8.1以上安裝GD庫時,編譯時間會大大增加。使用IPE_GD_WITHOUTAVIF=1可以跳過編譯AVIF格式來減少編譯時間。

接下來新增docker-compose.yml檔案來跑我們的Docker。抄功課的同學請按照自己的需要修改ports和timezone設定。

YAML
version: "3.9"
services:
  server:
    build: .
    environment:
      TZ: "Asia/Hong_Kong"
    ports:
      - "7080:80"
    volumes:
      - ./data/www:/var/www/html
      - ./data/my_php.ini:/usr/local/etc/php/conf.d/my_php.ini
      - ./data/my_apache2.conf:/etc/apache2/conf-enabled/my_apache2.conf
    extra_hosts:
      - "host.docker.internal:host-gateway"

docker-compose up之前需要先手動建立兩個設定檔,一個用來自訂PHP的設定,另一個就是Apache的設定。

Bash
mkdir data
touch my_php.ini
touch my_apache2.conf

即使你不需要自訂設定,也需要先建立那兩個檔案,否則Docker就會當成資料夾來處理,最後my_php.ini在主機上看就會是一個資料夾而不是檔案。

至於PHP程式則可以放在主機資料夾./data/www中喂給Apache。

最後docker-compose up -d來編譯運行Docker容器。如無意外你的Apache+PHP伺服器就會在指定的port運行。日後需要遷移伺服器的時候,只要複製Docker設定檔和data資料夾到新主機,再跑一句docker-compose up就搞定了,收工。


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *