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 不存在,提醒您要記得寫上去。