面向WEB開發人員的Docker(五):部署開發WordPress
前面介紹了Docker的一些基本知識和使用,對于新技術或者新系統想去嘗試運行起來,Docker是一個最佳的選擇,上手容易,拋棄也容易,如果系統或者應用運行起來后不需要了可以直接刪除即可,對宿主機沒有任何的影響,也不會受到宿主機環境的干擾。本文將分享如何使用Docker構建WordPress環境,并運行起來。
WordPress是2003年首次發布的基于PHP和MySQL的開放源代碼內容管理系統。它為40%的網站提供支持,受到許多Web主機的支持,易于設置,并提供數千個免費主題和插件。
對于大多數人來說,WordPress是一個博客系統,其實不然,可以為以下需求提供解決方案:
- 可以作為網站的CMS,編輯內容,生成靜態網站
- 作為服務器端,為前端提供API,如Vue、React、Angular等
- 構建門戶、社區、視頻等內容網站
- ......
即使你不使用(或不想使用)WordPress,本文主要分享Docker如何構建一個運行環境來執行代碼,環境配置對于開發來說必不可少,但Docker值得你去嘗試。
本章中創建的文件包含在 https://github.com/QuintionTang/docker-wordpress 提供的示例代碼存儲庫的wordpress目錄中
環境要求
要運行WordPress需要配置的環境:
- Web服務器,通常為Apache
- PHP運行時和擴展,然后相應地配置Web服務器
- MySQL或MariaDB定義一個供WordPress使用的新數據庫
- WordPress本身,以及所有必需的主題和插件。
XAMPP之類的工具可以降低環境的配置難度,但是,有了Docker,你只需要幾分鐘就可以運行WordPress并開發代碼。
Windows用戶還將發現WordPress在基于Docker的基于Linux的文件系統上的運行要比本地NTFS驅動器快得多。
Docker配置
需要提取兩個Docker鏡像:
啟動這兩個鏡像,并加入Docker網絡中wpnet。
Docker volumes
創建兩個Docker volumes:
wpdata:存儲數據文件,在MySQL容器中掛載到/var/lib/mysqlwpfiles:WordPress應用程序文件夾,對應容器Apache服務器根目錄中/var/www/html。
可能有人會覺得掛載
wpfiles卷是一種反模式,這樣WordPress容器不再是無狀態的。不過WordPress并不是一個無狀態的應用程序。為了開發目的,Docker被用來模擬一個活動服務器環境。
掛載wpfiles卷有很多好處:
-
Docker的啟動速度更快:這樣無需每次啟動容器時都復制核心WordPress文件
-
WordPress應用程序可以自動更新:這將在安裝中發生,因此在開發期間對其進行復制非常有用
如果不掛載
wpfiles卷,則需要經常運行docker pull wordpress以下載最新的應用程序鏡像。
掛載開發目錄
wp-content子目錄將在主機PC上的項目目錄中創建。對應WordPress容器的/var/www/html/wp-content目錄,目錄包含所有插件、主題和上傳的資源。
WordPress開發人員一般只需在
wp-content目錄中創建和修改文件。
另外,對于項目開發,就需要將wp-content文件提交到Git倉庫更加容易,因為這個目錄是宿主機PC上唯一的WordPress文件夾。
localhost域名替換
WordPress將啟動在localhost:8001域上,在實際開發中如果涉及多個站點,不希望用端口進行切換,同時也會帶來一些問題。
- 瀏覽器可能會緩存來自一個站點的文件,并在另一個站點上顯示它們。
- WordPress將訪問域名存儲在其數據庫中,因此使用一個和生產環境一致的域名可以避免一些問題。
為了避免以上的問題,可以在文件中配置其他域以供開發使用,這就涉及更改本機hosts
- 在Linux和macOS上,修改文件:
/etc/hosts - 在Windows上,修改文件:
C:\Windows\System32\drivers\etc\hosts
在主機文件的底部添加一行,例如 127.0.0.1 devpoint.wordpress 并保存。對于 Windows 用戶必須運行nbtstat -R或重新啟動。
這樣,就可以使用 http://devpoint.wordpress 進行訪問,而不是http://localhost,實際上兩者都解析到 127.0.0.1。
修改
hosts,是前端經常用來模擬一個真實訪問常用的手段。
docker run --mount "src=wpfiles,target=/var/www/html" -v $PWD/wp-content:/var/www/html/wp-content
$PWD引用Linux和macOS上的當前目錄。它在Windows上不可用,因此必須使用正斜杠表示法指定完整路徑,如下:
docker run --mount "src=wpfiles,target=/var/www/html" -v /c/projects/wordpress/wp-content:/var/www/html/wp-content
Docker Compose配置
Docker Compose是一個用于管理具有關聯volumes和網絡的多個容器的工具。單個配置文件,通常命名為docker-compose.yml,定義容器,并可以在必要時覆蓋Dockerfile設置。詳細的介紹請參閱《面向WEB開發的Docker(二):什么是Docker、鏡像、編排?》
在項目目錄下創建目錄 wordpress
mkdir wordpress
cd wordpress
這里將使用Docker Compose,在目錄中創建docker-compose.yml文件,代碼如下:
version: "3" # 表示該 Docker-Compose 文件使用的版本為3
services:
mysql:
image: mysql:8
container_name: mysql
environment:
- MYSQL_DATABASE=wpdb
- MYSQL_USER=wpdbuser
- MYSQL_PASSWORD=devpoint
- MYSQL_ROOT_PASSWORD=devpointCn
volumes:
- wpdata:/var/lib/mysql
ports:
- "3306:3306"
networks:
- wpnet
restart: on-failure
wordpress:
image: wordpress
container_name: wordpress
depends_on:
- mysql
environment:
- WORDPRESS_DB_HOST=mysql
- WORDPRESS_DB_NAME=wpdb
- WORDPRESS_DB_USER=wpdbuser
- WORDPRESS_DB_PASSWORD=devpoint
volumes:
- wpfiles:/var/www/html
- ./wp-content:/var/www/html/wp-content
ports:
- "80:80"
networks:
- wpnet
restart: on-failure
volumes:
wpdata:
wpfiles:
networks:
wpnet:
下面就來對上面的代碼做個詳細的介紹:
環境變量
MySQL環境變量包括MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD和MYSQL_ROOT_PASSWORD :
MYSQL_DATABASE:數據庫名稱,這里定義為wpdbMYSQL_USER:數據庫用戶名稱,這里定義為wpdbuserMYSQL_PASSWORD:數據庫連接密碼,定義為devpointMYSQL_ROOT_PASSWORD:數據庫root用戶密碼,定義為devpointCn,在應用程序連接中不會用到 root 用戶,但對于備份數據或執行其他數據庫維護就需要,因此這里也進行了定義
接下來設置 WordPress 的環境變量,包括WORDPRESS_DB_HOST、WORDPRESS_DB_NAME、WORDPRESS_DB_USER、WORDPRESS_DB_PASSWORD:
WORDPRESS_DB_HOST:連接地址,這里我們定義為mysqlWORDPRESS_DB_NAME:連接數據庫名稱,上面定義的是wpdbWORDPRESS_DB_USER:連接數據庫用戶名稱,這里為wpdbuserWORDPRESS_DB_PASSWORD:對應的數據庫連接密碼,為devpoint
端口暴露
MySQL的端口3306是暴露給宿主機PC的,所以它可以連接和檢查數據庫使用任何MySQL客戶端。
ports:
- "3306:3306"
上面代碼的意思是容器中的3306端口和宿主機的3306端口對應。
如果不想將端口暴露給宿主機,就不需要與其對應,如下:
ports:
- "3306"
這樣暴露端口對Docker網絡中的其他容器也可用,但不會將其暴露給宿主機,從安全的角度可以起到隔離的效果。WordPress容器不會受到影響,但是宿主機上的MySQL客戶端將無法連接到容器中的MySQL數據庫。
接下來就是Apache端口的暴露,WordPress容器中綁定的端口為80,前面的80為綁定的宿主機端口。
ports:
- "80:80"
WordPress卷綁定掛載
WordPress容器定義了兩個,Mysql容器定義了1個:
wpfiles:對應Docker中Apache服務器根目錄下/var/www/htmlwp-content:對應Docker中/var/www/html/wp-contentwpdata:對應Docker中/var/lib/mysql
volumes:
- wpdata:/var/lib/mysql
volumes:
- wpfiles:/var/www/html
- ./wp-content:/var/www/html/wp-content
啟動WordPress環境
一切都準備好了,就是這么簡單!打開一個終端,訪問項目目錄,然后輸入:
docker-compose up

一切下載安裝全部自動完成,由于Docker需要下載鏡像、初始化數據庫并復制應用程序文件,因此該過程在第一次運行時可能需要花費幾分鐘。
安裝WordPress
在瀏覽器中打開前面我們設置好的域名devpoint.wordpress,首次執行此操作時,將進入WordPress安裝流程:

按照流程輸入基本信息,即可完成安裝。


下面選擇主題Appointment Dark,進行安裝,并啟用。

本地WordPress開發
現在,可以在宿主機PC的目錄wp-content中添加、編輯或刪除主題插件。
管理面板限制
WordPress允許直接從管理面板中安裝、編輯和刪除主題和插件文件,這在Windows上是允許的,但是Linux和mac OS用戶可能需要通過在宿主機上輸入以下命令授予對項目的wp-content文件夾的權限:
chmod -R 777 ./wp-content
主題制作
要開始開發一個新的WordPress主題,在宿主機上目錄wp-content/themes中創建主題文件夾,例如 devpoint ,并添加一個style.css樣式文件:
/*
Theme Name: DevPoint Theme
Version: 1.0.0
License: MIT
*/
body {
margin: 0px;
padding: 30px;
background-color: #efefef;
font-family: "Microsoft YaHei", "微軟雅黑", "pingfang sc", "宋體", Arial,
Helvetica, sans-serif;
line-height: 1.5;
color: #212529;
}
接著再添加一個 index.php 文件,代碼如下:
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<title><?php bloginfo('name'); ?></title>
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>">
<?php wp_head(); ?>
</head>
<body>
<header>
<h1><?php bloginfo('name'); ?></h1>
<p><?php bloginfo('description'); ?></p>
</header>
<main>
<?php
if ( have_posts() ) : while ( have_posts() ): the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<h2><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
</article>
<?php
endwhile;
endif;
?>
</main>
<?php wp_footer(); ?>
</body>
</html>
在WordPress管理面板的“外觀”>“主題”頁面中激活此主題,刷新頁面即可看到如下效果。

點擊啟用,既可完成自制主題啟用。

總結
到這里,已經基本可以使用Docker構建簡單的WEB應用了,在前端開發中,合理利用Docker,可以減少很多環境帶來的問題。