使用 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來搭建MariaDBWordPress的環境。通過編寫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),強烈建議不管是不是開發測試環境,都幫資料庫設置密碼,基本的環境變數請參考下表:

NameDescriptionDefault Value
ALLOW_EMPTY_PASSWORDAllow MariaDB access without any password.no
MARIADB_ROOT_USERMariaDB database root user.root
MARIADB_ROOT_PASSWORDMariaDB database root user password.nil
MARIADB_USERMariaDB database user to create during the first initialization.nil
MARIADB_PASSWORDPassword for the MariaDB database user to create during the first initialization.nil
MARIADB_DATABASEMariaDB database to create during the first initialization.nil

MaiaDB的Master-Slave Replication相關設定可參考下表:

NameDescriptionDefault Value
MARIADB_MASTER_HOSTAddress for the MariaDB master node.nil
MARIADB_MASTER_PORT_NUMBERPort number for the MariaDB master node.3306
MARIADB_MASTER_ROOT_USERMariaDB database root user of the master host.root
MARIADB_MASTER_ROOT_PASSWORDPassword for the MariaDB database root user of the the master host.nil
MARIADB_MASTER_DELAYMariaDB database replication delay.0
MARIADB_REPLICATION_USERMariaDB replication database user.nil
MARIADB_REPLICATION_PASSWORDPassword for the MariaDB replication database user.nil
MARIADB_PORT_NUMBERPort number to use for the MariaDB Server service.nil
MARIADB_REPLICATION_MODEMariaDB replication mode.nil
MARIADB_REPLICATION_SLAVE_DUMPMake a dump on master and update slave MariaDB databasefalse

完整內容可查閱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網站使用者及網站相關設定如下:

NameDescriptionDefault Value
WORDPRESS_BLOG_NAMEWordPress blog name."User's blog"
WORDPRESS_USERNAMEWordPress user name.user
WORDPRESS_PASSWORDWordPress user password.bitnami
WORDPRESS_EMAILWordPress user e-mail address.[email protected]
WORDPRESS_FIRST_NAMEWordPress user first name.UserName
WORDPRESS_LAST_NAMEWordPress user last name.LastName

部分伺服器相關設定如下:

NameDescriptionDefault Value
WORDPRESS_DATA_TO_PERSISTFiles to persist relative to the WordPress installation directory. To provide multiple values, separate them with a whitespace.wp-config.php wp-content
WORDPRESS_ENABLE_HTTPSWhether to enable HTTPS for WordPress by default.no
WORDPRESS_SCHEMEScheme to generate application URLs. Deprecated by WORDPRESS_ENABLE_HTTPS.http
WORDPRESS_HTACCESS_OVERRIDE_NONESet the Apache AllowOverride variable to None. All the default directives will be loaded from /opt/bitnami/wordpress/wordpress-htaccess.conf.yes
WORDPRESS_ENABLE_HTACCESS_PERSISTENCEPersist 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_PERMISSIONSForce 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_PROXYEnable WordPress support for reverse proxy headersno

郵件伺服器相關設定如下:

NameDescriptionDefault Value
WORDPRESS_SMTP_HOSTWordPress SMTP server host.nil
WORDPRESS_SMTP_PORT_NUMBERWordPress SMTP server port number.nil
WORDPRESS_SMTP_USERWordPress SMTP server user.nil
WORDPRESS_SMTP_FROM_EMAILWordPress SMTP from email.${WORDPRESS_SMTP_USER}
WORDPRESS_SMTP_FROM_NAMEWordPress SMTP from name.${WORDPRESS_FIRST_NAME} ${WORDPRESS_LAST_NAME}
WORDPRESS_SMTP_PASSWORDWordPress 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_datawordpress_data資料夾,

project-folder/
├── mariadb_data/
├── wordpress_data/
└── docker-compose.yml

將bash切換到專案資料夾,並執行以下指令:

docker-compose -f ./docker-compose.yml up --build -d

然後你會發現DB Container開不起來:

嗯。Permission denied

Bitnami的non-root container需要調整權限才不會遭遇Permission denied的問題 | Alfred's CyberLoom

然後在文件講解如何設定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伺服器且克服權限問題了。

成功透過Bitnami提供的Docker Image搭建資料庫及Wordpress堆疊 | Alfred's CyberLoom

E. 總結

通過編寫docker-compose.yml文件,對應用堆疊進行定義和管理,使用了Bitnami提供MariaDBWordPress伺服器Image,成功的搭建了我們自己的Wordpress伺服器。

如果前面的內容都懶得看,可以直接跳到D. Non-root Container,找出docker-compose.ymlone_click.sh,放到你的專案資料夾下,執行sudo chmod +x one_click.sh && ./one_click.sh指令,稍等片刻,即可在localhost下查看網站。

第一次看官方說明時其實看得母煞煞,像是non-root container就錯過了,這篇文章精簡了部分內容,希望譨夠讓看的人直接無腦啟動伺服器,稍微熟悉後再回去看官方文件,更容易理解文件的內容。