docker with many boats

使用 Docker Compose 架設 WordPress 環境

本文介紹如何使用 Docker Compose 架設 WordPress 服務 。(MySQL + Nginx + WordPress)

前言

在 2020 的年尾,下定決心要來建立自己的部落格後,查遍了網路上的 WordPress 架設,不外乎都是找個雲端主機,使用該雲端商提供的 WordPress 方案建立。要做客製化修改的話,就使用 ftp 連線進入修改檔案。而要定期備份資料庫和 WordPress 檔案的話,就是使用雲端主機提供的服務、使用 phpMyAdmin 備份或自己另外安裝外掛處理。

而身為一個專業的軟體工程師,凡事喜歡自己來,想要掌控一切(? 因此這專業的軟體工程師,就選擇使用 Docker Compose 架設 WordPress 環境。

接下來,就來介紹一下如何使用 Docker Compose 架設 WordPress 環境吧~

技術架構

MySQL + WordPress + Nginx

資料夾架構

  • db_data 資料夾 -> 放 database 產生的所有檔案
  • docker 資料夾 -> docker-compose.yml ,以及 database 的設定檔 (my.cnf) 跟 wordpress 的設定檔 (uploads.ini),環境變數的設定檔 (.env)
  • Nginx 資料夾 -> Nginx 的設定檔 (nginx.conf) 以及 ssl 證書 (ssl.csr, ssl.key)
  • logs 資料夾 -> Nginx 產生的 log 們 (access.log, error.log)
  • wordpress 資料夾 -> 放 wordpress 產生的所有檔案

Docker Compose 架構

在 docker-compose.yml 的設定檔內,分別會宣告三個 container

  1. db, 用來定義 mysql service
  2. wordpress, 用來定義 wordpress service
  3. webserver, 用來定義 nginx service

以下,就分別來介紹三個服務吧!

db container

db container 內會使用 .env 檔案定義環境變數 ; 而 /config/my.cnf 用來作為 MySQL 的設定檔。

env 環境變數

MYSQL_ROOT_PASSWORD=xxxxx
MYSQL_USER=xxxxx
MYSQL_PASSWORD=xxxxxx

上方的 env 檔案 ( .env ),內部設定了 MYSQL_ROOT_PASSWORD, MYSQL_USER, MYSQL_PASSWORD 這幾個作為 db container 內的環境變數。

MySQL 的設定檔

上方為 MySQL 的設定檔 ( /config/my.cnf ),都是一些基本的設定,沒有對 MySQL 做特別的調整。

在 docker compose 內設定 db container

上方為 db container 在 docker-compose.yml 中的宣告,值得注意的是:

  1. 將 db_data 資料夾掛載為 volume,/var/lib/mysql 內為 MySQL 產生的所有檔案,我們在 MySQL 內儲存的檔案都會在這個資料夾內。
  2. 將 config/my.conf 掛載為此 MySQL 的設定檔案。
  3. environment 內使用了 .env 檔案內設定的環境變數 (就是用這個寫法,不用懷疑)
  4. db container 預設是開在 3306 port,同一個 network 內可以呼叫,但沒有對外開啟。

wordpress container

wordpress container 內會使用 .env 檔案定義環境變數 ; 而 /config/uploads.ini 用來作為 wordpress 的設定檔。

wordpress 的設定檔

file_uploads = On
memory_limit = 300M
upload_max_filesize = 256M
post_max_size = 256M
max_execution_time = 600
date.timezone = UTC
max_input_time = 600
max_input_vars = 5000

上方為 wordpress 的設定檔 ( /config/uploads.ini ),都是一些基本的設定,從變數的取名應該都可以分辨。

在 docker compose 內設定 wordpress container

上方為 wordpress container 在 docker-compose.yml 中的宣告,值得注意的是:

  1. 用 depends_on 來讓 db container 先啟動,再啟動 wordpress container
  2. 將 wordpress 資料夾掛載為 volume, 而 /var/www/html 內為 wordpress 所有的檔案。
  3. /config/uploads.ini 會給 /usr/local/etc/php/conf.d/uploads.ini 使用
  4. environment 內使用了 .env 檔案設定的環境變數
  5. db container 預設是開在 3306 port,在此使用 db:3306 這種寫法讓 wordpress 跟 db 連線。(此為 docker compose 提供在同一個 network 下的 DNS 寫法。)

webserver container

webserver container 內會使用 /nginx/nginx.conf 作為 Nginx 的設定檔。而因為我們目前在本機做開發,會使用 /nginx/ssl.csr 和 /nginx/ssl.key 作為 ssl 的證書。

使用 openssl 替 localhost 增加 https

為了用來開發和測試 https 的設定是否正確。我們使用 openssl 產生 localhost 的 ssl 證書,替 localhost 增加 https。

以下以在 Mac 中做示範:

brew install openssl
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ssl.key -out ssl.csr 

509 那個可以理解為憑證的版本、2048 那個是加密的形式、3650 是指 3650 天後過期,也就是 10 年。

輸入上方指令後,會顯示一些問題要填,下方是我的回答,大家可以將 email 修改就好。

接著就會產生 ssl.csr 和 ssl.key 兩個檔案。同樣將此兩個檔案放在 nginx 資料夾內。

延伸閱讀

Nginx 的設定檔

稍微說明一下這份設定檔在做些什麼

  • log_format 顧名思義用來定義 log 印出來要長怎樣
  • 當使用者打 http://localhost:80 時,會 redirect 到 https://localhost
  • 當使用者打 https://localhost:443 時會驗證 ssl 憑證(也就是我們剛剛用 openssl 產生的)
  • 其他就是設定 logs、設定怎麼解析 php 檔案….之類的

在 docker compose 內設定 webserver container

上方為 webserver container 在 docker-compose.yml 中的宣告,值得注意的是:

  1. 用 depends_on 來讓 wordpress container 先啟動,再啟動 webserver container。
  2. 用 logs 資料夾掛載 volume,來接產生的 logs
  3. 用 wordpress 資料夾掛載 volume,讓 Nginx 知道要服務哪些內容

用 docker compose 指令操控

先進到 /docker 資料夾

cd /docker

啟動

docker-compose up -d --build

第一次跑會去拉 images,給他們一點時間。

第一次使用 firefox 打開會呈現此頁面,點選接受風險並繼續

firefox
firefox

第一次使用 safari 打開會呈現此頁面,點選參訪此網站

safari
safari

成功進入頁面後,可以看到網址都是以 https 開頭了~

Docker Compose 架設 WordPress 成功
Docker Compose 架設 WordPress 成功

結束

docker-compose down

查看 docker compose 產生的 logs

docker-compose logs db
docker-compose logs wordpress
docker-compose logs webserver

完整程式碼

其中 db_data, logs, wordpress 三個資料夾,會在 docker compose 啟動後自動創建~

結論

本站的架構 (MySQL + Nginx + WordPress) 當然可以直接手動安裝再使用,會選擇使用 Docker Compose 架設 WordPress 環境,主要是想在本機測試沒問題後,可以直接到雲端主機上無痛部署。(未來主要以 GCP compute engine 平台)

而選擇自己部署 WordPress 服務,不使用雲端主機提供的 WordPress 方案也是希望得到以下優點:

  1. 輕鬆客製化任何程式碼
  2. 使用最少的外掛,增加網站效能
  3. 方便資料庫的備份
  4. 方便檢查網站與伺服器產生的所有 logs

未來會再介紹如何做資料庫備份以及我在 logs 中發現了什麼驚人的事實~

那我們下次見囉!

參考連結

This Post Has One Comment

  1. James

    太感謝你了! 解決的我卡了超久的bug

發佈留言