跳至主要内容

6.2 啟動 WordPress

先從啟動 WordPress 這個全球最受歡迎的網頁製作平台 / 網站管理系統開始。

下方這份 docker-compose.yml 是在本機運行的 WordPress 基本範例,也可以在本書的 GitHub 儲存庫內 ch-06 的 wordpress-example 中找到

version: '3.9'

services:
wordpress:
image: wordpress:6.0.2
ports:
- 8080:80
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=admin
- WORDPRESS_DB_PASSWORD=password
- WORDPRESS_DB_NAME=wordpress
volumes:
- .:/var/www/html

db:
image: mysql:5.7
environment:
- MYSQL_DATABASE=wordpress
- MYSQL_USER=admin
- MYSQL_PASSWORD=password
- MYSQL_RANDOM_ROOT_PASSWORD=1
volumes:
- db:/var/lib/mysql

volumes:
db:

這邊的資訊量有點大,會一個一個來做解釋,在 YAML 檔案裡面,都是用兩個空格來作為階層的區分,這邊將由上至下分段來解釋:

version: '3.9'

這個非常易懂,Docker Compose 經過多次版本的迭代,自然而然會有很多新功能以及被取代的舊功能,就像是區分 API 的版本一樣。

要注意的是,這個 version 單純是這份 docker-compose.yml 的紀錄,讓編輯者了解到這份檔案是某一個 Compose 版本,而 Docker Compose 並沒辦法做到根據檔案內撰寫的 version 來切換版本,最主要的還是機器上安裝的 Docker Compose 支援到什麼樣語法和功能。

當然 Docker Compose 在解析 docker-compose.yml 時,遇到過時或是比較新的語法都會跳出提示來通知使用者。

接著是 services,以這邊的例子來說,我們啟用了 wordpress 以及 db 兩個 service,概念其實和 docker container run 是一樣的,只是將 docker container run 需要的參數寫了下來,讓 Docker Compose 去執行。

services:
wordpress: <- 服務名稱 / DNS 名稱
...
db: <- 服務名稱 / DNS 名稱
...

這裡分別是 wordpress 以及 db,標記了服務名稱的同時也作為該服務在Docker 虛擬網路內中的 DNS 名稱,就像在 Docker 虛擬網路篇 中替容器命名以便作為 DNS 和其他容器溝通的手段一樣。

接著再來是 service 內部的參數,所有的參數都是官方提供的選項,並不是自己想填什麼就填什麼,具有一定的規範。

services:
wordpress:
image: wordpress:6.0.2
ports:
- 8080:80
envrionments:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=admin
- WORDPRESS_DB_PASSWORD=password
- WORDPRESS_DB_NAME=wordpress
volumes:
- .:/var/www/html
# 以上為 wordpress service 的設定參數

image: 指定映像檔的版本,就像在運行容器時一樣。

ports: 將指定的 port 對應到本機的 port,如同運行容器時的 --publish 一樣。

有時候參數並不是只有一個,可能會需要打開很多的 port,這時候在 YAML 檔案的格式中,可以透過這種 List 的方式把需要的參數條列出來。

ports:
- 8080:80
- 8000:80
- 8081:80
# 上面的寫法在 YAML 檔案中叫做 List,用『 - 』作為前綴

environments: 將環境變數傳入容器中,如同運行容器時的 --env 參數是一樣的道理;同上,超過一個以上的環境變數可以透過 List 的方式條列出來。

volumes: 以 WordPress 這個例子來說,分別使用了 Volume 以及 Bind Mount 兩種方法,就如同 --volume 在運行容器時所帶入的參數一樣。

在 wordpress 的 service 中使用了 Bind Mount,將此處綁定至容器中的 /var/www/html;而 db 的 service 中則用了 Volume 的方式建立一個容器外的 volume 作為資料庫的儲存空間。

version: '3.9'

services:
....
volumes: <- 告訴 Docker Compose 這個應用程式使用到的 volume
db: <- 我們在 db 這個 service 中有使用到 volume

這邊的 volumes 並非容器內的參數,而是整個 docker-compose.yml 最上層的選項。

需要提前告知 Docker Compose 這次整個服務所使用到的 volume,因為在 db 的服務中有寫入了 db:/var/lib/mysql 參數,所以要讓 Docker Compose 知道有這個 volume 存在。

若是不寫,Docker Compose 也會提醒您這個 db 這個 volume 不存在,提醒您要記得寫上去。

一鍵啟動所有服務

確定自己所在的資料夾內有上方那份範例的 docker-compose.yml 檔案,接著就可以執行 docker compose up --detach 的指令,如下:

$ docker compose up --detach
[+] Running 4/4
⠿ Network docker-compose-wordpress_default Created 0.1s
⠿ Volume "docker-compose-wordpress_db" Created 0.0s
⠿ Container docker-compose-wordpress-wordpress-1 Started 1.1s
⠿ Container docker-compose-wordpress-db-1 Started 0.9s

迎面而來的應該是資料夾中會開始出現 .php 的檔案,還記得我們在 wordpress 的 service 中使用了 Bind Mount 嗎?

這會把 wordpress 容器中 /var/www/html 的檔案都寫回本機中,是不是很酷啊?

憑空誕生的 .php 檔案

接著再打開瀏覽器迎接 WordPress 啟動的驚喜之前,我們先來解釋一下這段啟動的指令有什麼需要注意的地方。

首先是 Network docker-compose-wordpress_default Created 這一行,Docker Compose 為了讓檔案中被標示的服務能夠運行再一起,預設會在啟動時建立一個虛擬網路,如同 Docker 虛擬網路篇 中提到的,要在同一個虛擬網路中的容器才可以透過容器名稱作為 DNS 輕易地溝通。

至於虛擬網路的命名預設則為 檔案目錄的名稱_default,當然也可以提前告知 Docker Compose 要使用的虛擬網路名稱,在之後部署的章節將會提到;目前則以 Docker Compose 預設的行為做解釋。

接著是 Volume "docker-compose-wordpress_db" Created 這行,道理如同虛擬網路一樣。

因為在 docker-compose.yml 檔案中有特別標示了需要 volume db,所以 Docker Compose 在啟動時預設會用 檔案目錄的名稱_volume名稱 作為命名。

如果不想要這麼長的 volume 名稱當然也可以,之後會有範例提到;目前則以 Docker Compose 預設的行為做解釋。

再來是兩個容器的啟動,這邊就相對的直覺很多,就是單純的啟動容器,命名的規則則是 檔案目錄的名稱-服務名稱-編號

而為什麼需要編號呢?是因為 Docker Compose 為了擴展容器數量而預留的空格,來做到基本的負載平衡。

接著我們打開瀏覽器輸入 http://localhost:8080,就會看到下方 WordPress 的語言選擇介面。

WordPress 語言選擇介面

選擇完語言後,會略過原先 WordPress 填入資料庫資訊的介面,直接來到網站設定的環節。

這是因為我們已經在 docker-compose.yml 檔案中設定好關於資料庫的環境變數;下方是被略過的畫面,可以參考一下。

被略過的資料庫設定介面

網站基本設定

接著填寫完網站的基本資訊並且登入後,就會進入 WordPress 的控制台,也代表在本地端利用 Docker Compose 運行 WordPress 應用程式是成功的。

WordPress 控制台

接著為了驗證資料庫是否有確實作用,先新增文章,並關閉所有服務,接著重新啟動,來確認資料有確實地被保存下來。

先點擊左邊導覽列的文章,並點擊新增文章,接著隨便輸入想要輸入的內容。

接著點擊右上角的發佈,在確認發布後。

點擊左上角的 WordPress 圖示回到控制台,接著將游標移動到左上角,點擊造訪網站

造訪網站

這樣就能夠在前台看到自己剛剛新增的文章。

前台的文章顯示

一鍵停止所有服務

接著回到終端機,輸入 docker compose down 指令,這將會依照 docker-compose.yml 的檔案內容來刪除容器以及預設建立的虛擬網路。

$ docker compose down
[+] Running 3/2
⠿ Container docker-compose-wordpress-wordpress-1 Removed 1.2s
⠿ Container docker-compose-wordpress-db-1 Removed 1.6s
⠿ Network docker-compose-wordpress_default Removed 0.1s

除了需要手動刪除的 volume 之外,容器以及虛擬網路都被刪除了,注意是刪除,不是停止唷!

若是要停止容器的服務則是使用 docker compose stop 的指令。

接著為了驗證資料庫的實際作用性,我們再次輸入下方指令。

$ docker compose up --detach
[+] Running 4/4
⠿ Network docker-compose-wordpress_default Created 0.2s
⠿ Container docker-compose-wordpress-wordpress-1 Started 0.7s
⠿ Container docker-compose-wordpress-db-1 Started 0.7s

接著打開瀏覽器輸入 http://localhost:8080 則會看到和上面最後一張圖片相同的畫面,證實了資料庫確實有作用,新增的文章也有被保存在 Volume 裡面。

接著下一個小節,將藉由我自己製作的前後端分離服務,一個簡單的 Todo-list 來和大家更深入的研究 docker-compose.yml 還有什麼特殊的參數可以使用吧!