很久很久以前,想要在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擴展庫。
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設定。
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的設定。
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就搞定了,收工。