使用 Bitnami 的Docker Image快速部署 WordPress
內容目錄
WordPress作為全球最受歡迎的內容管理系統,擁有易用性和高度擴展性的特點。結合Docker的容器化技術,網站部署變得更加高效而簡便。再引入Bitnami的即用型安裝包,這樣的組合讓網站搭建者能以最小的精力完成配置,從而專注於建立優質內容和SEO優化。
A. Bitnami、Wordpress、Docker是什麼
1. 什麼是Bitnami?
Bitnami是一個專注於提供即用型應用堆疊的平臺,無論是在本地環境、虛擬機還是雲端,Bitnami都能提供簡易的一鍵部署解決方案。對於初學者和專業人士來說,Bitnami的應用包減少了安裝和配置軟體時的繁瑣過程,帶來穩定的性能和可靠性。
2. 什麼是WordPress?
WordPress是一個開源的內容管理系統(CMS),用於建立美觀且功能豐富的網站和部落格平台。自2003年推出以來,已成為數百萬個網站的首選工具。憑藉著大量的插件和主題支持,WordPress能夠滿足從個人部落格到大型企業網站的各種需求,同時對於SEO優化也有著良好的支援。
3. 什麼是Docker?
Docker是一個開源的平台,致力於幫助開發者建立、部署和運行應用程式在標準化的容器中。這些容器可以在任何支持Docker的系統上運行,確保應用在開發環境和生產環境中的一致性。通過容器化應用,Docker提升了資源利用率,並且簡化了應用的擴展和維護。
4. 這個組合的好處
透過將Bitnami、WordPress和Docker結合使用,用戶可以享受到多重便利。首先,借由Bitnami預配置的應用包,用戶可以立即獲得已最佳化且與最新版本同步的WordPress環境。其次,使用Docker來實現容器化運行,不僅提高了資源的隔離性與移植性,還使得多環境的應用部署和升級更為輕鬆高效。結果就是,更快速的開發周期、更靈活的部署選擇,以及更簡單的維護操作。
B. Bitnami的Wordpress套件
Bitnami官方提供了一個即用型的WordPress Image,搭配官方Github中的環境變數配置說明文件,讓我們可以透過Docker快速客製化建立我們自己的Wordpress伺服器。以下是Bitnami的一些優點:
1. 即時更新
Bitnami緊密追蹤上游原始碼的變更,並通過自動化的系統迅速發佈這些Image的新版本,最新的錯誤修正和功能更新能夠在最快的時間內供使用者使用,提升了系統的安全性和穩定性。
2. 一致性與靈活性
Bitnami容器、虛擬機和雲端映像都使用相同的元件和配置方式,可以根據項目的需求在不同格式之間輕鬆切換,減少相容性的問題。
3. 基於minideb
所有Bitnami的Image都是基於minideb或scratch開發的,前者是一個極簡主義的Debian容器映像,提供了一個小而熟悉的Linux環境;而後者則是一個完全空白的Image,適合需要完全從頭開始自定義的用戶。
4. 影像完整性
所有在Docker Hub上提供的Bitnami Image都使用Notation進行簽名,用戶可以驗證這些Image的完整性,確保使用的是來源可靠的Image。
5. 定期發佈更新
Bitnami定期基於最新的發行套件進行更新,以確保技術不會落後。
在選擇和使用Bitnami的WordPress Image時,能夠輕鬆享受到這些優勢,從而專注於網站的開發與內容發想。
C. 編寫docker-compose.yml
為了建構一個功能完整的WordPress網站,我們需要同時部署資料庫和WordPress系統。在這個範例中,使用Bitnami提供的Docker Image來搭建MariaDB和WordPress的環境。通過編寫docker-compose.yml
文件,對應用堆疊進行定義和管理。
1. MariaDB
services:
mariadb:
image: docker.io/bitnami/mariadb:11.4
volumes:
- /path/to/mariadb-persistence:/bitnami/mariadb
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_USER=bn_wordpress
- MARIADB_DATABASE=bitnami_wordpress
以上是官方的參考配置,
請將volumes下的/path/to/mariadb-persistence
替換為你希望的資料儲存位置,透過volumes的設定,即使Container重啟或刪除,資料依然不會消失。
其中為了方便開發測試,允許不使用密碼(ALLOW_EMPTY_PASSWORD=yes
),強烈建議不管是不是開發測試環境,都幫資料庫設置密碼,基本的環境變數請參考下表:
Name | Description | Default Value |
---|---|---|
ALLOW_EMPTY_PASSWORD | Allow MariaDB access without any password. | no |
MARIADB_ROOT_USER | MariaDB database root user. | root |
MARIADB_ROOT_PASSWORD | MariaDB database root user password. | nil |
MARIADB_USER | MariaDB database user to create during the first initialization. | nil |
MARIADB_PASSWORD | Password for the MariaDB database user to create during the first initialization. | nil |
MARIADB_DATABASE | MariaDB database to create during the first initialization. | nil |
MaiaDB的Master-Slave Replication相關設定可參考下表:
Name | Description | Default Value |
---|---|---|
MARIADB_MASTER_HOST | Address for the MariaDB master node. | nil |
MARIADB_MASTER_PORT_NUMBER | Port number for the MariaDB master node. | 3306 |
MARIADB_MASTER_ROOT_USER | MariaDB database root user of the master host. | root |
MARIADB_MASTER_ROOT_PASSWORD | Password for the MariaDB database root user of the the master host. | nil |
MARIADB_MASTER_DELAY | MariaDB database replication delay. | 0 |
MARIADB_REPLICATION_USER | MariaDB replication database user. | nil |
MARIADB_REPLICATION_PASSWORD | Password for the MariaDB replication database user. | nil |
MARIADB_PORT_NUMBER | Port number to use for the MariaDB Server service. | nil |
MARIADB_REPLICATION_MODE | MariaDB replication mode. | nil |
MARIADB_REPLICATION_SLAVE_DUMP | Make a dump on master and update slave MariaDB database | false |
完整內容可查閱Bitnami的說明。
2. WordPress
services:
wordpress:
image: docker.io/bitnami/wordpress:6
ports:
- '80:8080'
- '443:8443'
volumes:
- /path/to/wordpress-persistence:/bitnami/wordpress
depends_on:
- mariadb
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- WORDPRESS_DATABASE_HOST=mariadb
- WORDPRESS_DATABASE_PORT_NUMBER=3306
- WORDPRESS_DATABASE_USER=bn_wordpress
- WORDPRESS_DATABASE_NAME=bitnami_wordpress
以上是官方的參考配置,
跟MariaDB一樣,請將volumes下的/path/to/wordpress-persistence
替換為你希望的資料儲存位置,同時也請留意,ALLOW_EMPTY_PASSWORD
只適用於開發環境。
WordPress網站使用者及網站相關設定如下:
Name | Description | Default Value |
---|---|---|
WORDPRESS_BLOG_NAME | WordPress blog name. | "User's blog" |
WORDPRESS_USERNAME | WordPress user name. | user |
WORDPRESS_PASSWORD | WordPress user password. | bitnami |
WORDPRESS_EMAIL | WordPress user e-mail address. | [email protected] |
WORDPRESS_FIRST_NAME | WordPress user first name. | UserName |
WORDPRESS_LAST_NAME | WordPress user last name. | LastName |
部分伺服器相關設定如下:
Name | Description | Default Value |
---|---|---|
WORDPRESS_DATA_TO_PERSIST | Files to persist relative to the WordPress installation directory. To provide multiple values, separate them with a whitespace. | wp-config.php wp-content |
WORDPRESS_ENABLE_HTTPS | Whether to enable HTTPS for WordPress by default. | no |
WORDPRESS_SCHEME | Scheme to generate application URLs. Deprecated by WORDPRESS_ENABLE_HTTPS. | http |
WORDPRESS_HTACCESS_OVERRIDE_NONE | Set the Apache AllowOverride variable to None. All the default directives will be loaded from /opt/bitnami/wordpress/wordpress-htaccess.conf. | yes |
WORDPRESS_ENABLE_HTACCESS_PERSISTENCE | Persist the custom changes of the htaccess. It depends on the value of WORDPRESS_HTACCESS_OVERRIDE_NONE, when yes it will persist /opt/bitnami/wordpress/wordpress-htaccess.conf if no it will persist /opt/bitnami/wordpress/.htaccess. | no |
WORDPRESS_RESET_DATA_PERMISSIONS | Force resetting ownership/permissions on persisted data when initializing, otherwise it assumes the ownership/permissions are correct. Ignored when running as non-root. | no |
WORDPRESS_ENABLE_REVERSE_PROXY | Enable WordPress support for reverse proxy headers | no |
郵件伺服器相關設定如下:
Name | Description | Default Value |
---|---|---|
WORDPRESS_SMTP_HOST | WordPress SMTP server host. | nil |
WORDPRESS_SMTP_PORT_NUMBER | WordPress SMTP server port number. | nil |
WORDPRESS_SMTP_USER | WordPress SMTP server user. | nil |
WORDPRESS_SMTP_FROM_EMAIL | WordPress SMTP from email. | ${WORDPRESS_SMTP_USER} |
WORDPRESS_SMTP_FROM_NAME | WordPress SMTP from name. | ${WORDPRESS_FIRST_NAME} ${WORDPRESS_LAST_NAME} |
WORDPRESS_SMTP_PASSWORD | WordPress SMTP server user password. | nil |
以Gmail為例,可參考官方環境變數設定方式
wordpress:
...
environment:
- WORDPRESS_DATABASE_USER=bn_wordpress
- WORDPRESS_DATABASE_NAME=bitnami_wordpress
- ALLOW_EMPTY_PASSWORD=yes
- WORDPRESS_SMTP_HOST=smtp.gmail.com
- WORDPRESS_SMTP_PORT=587
- [email protected]
- WORDPRESS_SMTP_PASSWORD=your_password
...
D. Non-root Container
在Container說明上有一段話:
Why use a non-root container?
Non-root container images add an extra layer of security and are generally recommended for production environments. However, because they run as a non-root user, privileged tasks are typically off-limits. Learn more about non-root containers in our docs.
直接翻譯內容大概是這樣:非root比較安全,但有些事情做不了,想知道更多可以去看他們的文件。
我們可以試著直接執行剛剛的docker-compose.yml
:
services:
mariadb:
image: docker.io/bitnami/mariadb:11.4
volumes:
- ./mariadb_data:/bitnami/mariadb
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_USER=bn_wordpress
- MARIADB_DATABASE=bitnami_wordpress
wordpress:
image: docker.io/bitnami/wordpress:6
ports:
- '80:8080'
- '443:8443'
volumes:
- ./wordpress_data:/bitnami/wordpress
depends_on:
- mariadb
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- WORDPRESS_DATABASE_HOST=mariadb
- WORDPRESS_DATABASE_PORT_NUMBER=3306
- WORDPRESS_DATABASE_USER=bn_wordpress
- WORDPRESS_DATABASE_NAME=bitnami_wordpress
建議先開一個專案資料夾,把docker-compose.yml
放進其中,再建立mariadb_data
和wordpress_data
資料夾,
project-folder/
├── mariadb_data/
├── wordpress_data/
└── docker-compose.yml
將bash切換到專案資料夾,並執行以下指令:
docker-compose -f ./docker-compose.yml up --build -d
然後你會發現DB Container開不起來:
嗯。Permission denied
然後在文件講解如何設定volumes時,默默出現了一句話:
NOTE: As this is a non-root container, the mounted files and directories must have the proper permissions for the UID
1001
.
其實我一直在想,non-root container
這件事在文件中明明很早就提到,為什麼要在一個不起眼的地方才特別提一下呢?
Permissions for the UID 1001
根據他的提示,我們在本地端建立一個one_click.sh
,自動建立資料夾並更改權限,最後再自動執行docker-compose
指令。其中one_click.sh
記得透過
sudo chmod +x one_click.sh
讓這個檔案可被執行,同時第一行的USER也不要忘記修改成你自己。
USER="username"
GROUP="1001"
DIR="./mariadb_data"
if [ ! -d "$DIR" ]; then
echo "Directory $DIR does not exist. Creating..."
mkdir -p "$DIR"
fi
echo "Changing owner of $DIR to UID $GROUP..."
sudo chown -R "$GROUP":"$GROUP" "$DIR"
echo "Setting permissions for $DIR..."
sudo chmod -R 775 "$DIR"
echo "Adding user $USER to group $GROUP..."
sudo usermod -aG "$GROUP" "$USER"
DIR="./wordpress_data"
if [ ! -d "$DIR" ]; then
echo "Directory $DIR does not exist. Creating..."
mkdir -p "$DIR"
fi
echo "Changing owner of $DIR to UID $GROUP..."
sudo chown -R "$GROUP":"$GROUP" "$DIR"
echo "Setting permissions for $DIR..."
sudo chmod -R 775 "$DIR"
echo "Adding user $USER to group $GROUP..."
sudo usermod -aG "$GROUP" "$USER"
echo "docker-compose running ..."
docker-compose -f ./docker-compose.yml up --build -d
echo "All operations completed successfully."
確認成功執行後,開啟瀏覽器輸入localhost,即可看到Wordpress網站,切換到localhost/admin,輸入預設帳號(user)及密碼(bitnami)即可進入管理後台。
在Appearance -> Theme -> Add New Theme下挑選一個喜歡的主題,安裝並啟用;完成後回到localhost,當頁面產生變化,代表你成功安裝Worepress伺服器且克服權限問題了。
E. 總結
通過編寫docker-compose.yml
文件,對應用堆疊進行定義和管理,使用了Bitnami提供MariaDB
及WordPress
伺服器Image,成功的搭建了我們自己的Wordpress伺服器。
如果前面的內容都懶得看,可以直接跳到D. Non-root Container,找出docker-compose.yml
及one_click.sh
,放到你的專案資料夾下,執行sudo chmod +x one_click.sh
&& ./one_click.sh
指令,稍等片刻,即可在localhost
下查看網站。
第一次看官方說明時其實看得母煞煞,像是non-root container就錯過了,這篇文章精簡了部分內容,希望譨夠讓看的人直接無腦啟動伺服器,稍微熟悉後再回去看官方文件,更容易理解文件的內容。