Docker 佈署 RainLoop 相較於虛擬機器更加輕量且易於管理。首先,我們需要建置一個包含 RainLoop 應用程式的 Docker 映像,其中 Dockerfile 定義了 RainLoop 的安裝目錄、解壓縮安裝包、設定檔案許可權等必要步驟,確保 Apache 伺服器可以正確讀取檔案。透過 docker-compose,可以輕鬆啟動包含 postfix、dovecot、httpd 和 rainloop 等多個容器的應用程式,簡化佈署流程。在 LAMP 堆積疊建置過程中,選擇 MariaDB 作為關聯式資料函式庫,用於儲存結構化資料。安裝 MariaDB 後,需設定 root 使用者密碼並建立非 root 使用者,例如 webuser,以提高安全性。同時,需要授予 webuser 對特定資料函式庫的存取許可權,例如 mydatabase,並允許其執行建立表格、查詢、插入、更新和刪除資料等操作。最後,我們可以建立一個名為 my_users 的表格,並定義 user_id、user_first 和 user_last 等欄位,用於儲存使用者資訊。
在Docker中佈署RainLoop與建置LAMP堆積疊:Apache與PHP的整合應用
在前面的章節中,我們已經瞭解瞭如何使用虛擬機器來安裝與設定RainLoop,一款功能強大的網頁郵件客戶端。現在,我們將進一步探討如何利用Docker容器技術來佈署相同的服務,並深入瞭解LAMP(Linux、Apache、MySQL/MariaDB、PHP)堆積疊的建置過程。
Dockerfile解析與RainLoop容器化
首先,讓我們來分析用於建置RainLoop Docker映像的Dockerfile:
RUN mkdir -p /var/www/html/rainloop
RUN unzip rainloop-community-latest.zip -d /var/www/html/rainloop && \
chown -R www-data:www-data /var/www/html/rainloop/ && \
find /var/www/html/rainloop/ -type d -exec chmod 750 {} \; && \
find /var/www/html/rainloop/ -type f -exec chmod 640 {} \;
CMD tail -f /dev/null
內容解密:
RUN mkdir -p /var/www/html/rainloop:建立RainLoop的安裝目錄。unzip rainloop-community-latest.zip -d /var/www/html/rainloop:解壓縮RainLoop的安裝包到指定目錄。chown -R www-data:www-data /var/www/html/rainloop/:更改RainLoop目錄的所有者與群組為www-data,以確保Apache伺服器能夠正確讀取相關檔案。find命令用於調整目錄與檔案的許可權,確保安全性。CMD tail -f /dev/null:保持容器在前台執行,因為RainLoop本身不提供服務。
啟動多容器RainLoop Docker應用程式
使用docker-compose up -d命令可以一鍵建置映像、佈署容器並釋放終端。這樣,我們就可以得到四個容器:postfix、dovecot、httpd和rainloop,它們之間可以相互通訊並協同工作。
疑難排解
如果遇到問題,可以使用docker system prune命令來清除所有不必要的Docker資源,但需謹慎使用,因為它會刪除所有已建立的容器、映像和卷宗。
後續步驟
在下一章中,我們將繼續完成LAMP堆積疊的建置,安裝MariaDB並建立一個簡單的網頁應用程式,以讀取資料函式庫中的資訊並在瀏覽器中顯示。 MariaDB是一種流行的開源關聯式資料函式庫,能夠支援從小型指令碼到大型雲端應用程式等廣泛的使用案例。
MariaDB與SQL基礎
我們將首先學習一些MariaDB和結構化查詢語言(SQL)的基礎知識,瞭解資料如何在資料函式庫中儲存和檢索,為後續的PHP程式設計打下基礎。由於在命令列和PHP應用程式中執行的SQL命令語法相同,因此學習MariaDB的知識將有助於PHP程式設計。
資料函式庫基礎與 MariaDB 安裝設定
在現代的軟體開發與資料管理中,資料函式庫扮演著至關重要的角色。資料函式庫可以分為關聯式資料函式庫(Relational Databases)與非關聯式資料函式庫(NoSQL Databases)。關聯式資料函式庫提供結構化與統一的資料儲存方式,適合儲存已知格式的資料,如姓名、地址、金額和日期等。
關聯式資料函式庫與非關聯式資料函式庫的比較
關聯式資料函式庫透過預先定義的表格結構來儲存資料,這些表格可以獨立存在或參考其他表格中的資料。這種結構提供了內部的一致性,使得跨表格的複雜查詢能夠傳回一致的資料結果。相反,非關聯式資料函式庫提供了更大的靈活性,適合儲存格式未知的資料,如社交媒體上的動態訊息。
關聯式資料函式庫的特點:
- 結構化資料儲存
- 預先定義資料欄位
- 支援複雜查詢
非關聯式資料函式庫的特點:
- 非結構化或半結構化資料儲存
- 動態定義資料結構
- 適合儲存多變的資料
安裝與設定 MariaDB
本章節將指導如何在 Linux 系統上安裝 MariaDB 資料函式庫,並進行初始設定。
Step 1: 更新系統並安裝 MariaDB
首先,登入你的網頁伺服器並執行以下命令來更新系統和安裝 MariaDB:
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install mariadb-server
這些命令將更新你的系統並安裝 MariaDB 伺服器軟體。
Step 2: 設定 MariaDB root 使用者密碼
安裝完成後,需要為 MariaDB 的 root 使用者設定初始密碼。執行以下命令:
$ sudo mysql_secure_installation
這個命令會引導你完成密碼設定和其他安全相關的設定,如移除匿名使用者、禁止遠端 root 登入等。
登入 MariaDB
設定完密碼後,可以使用以下命令登入 MariaDB:
$ sudo mysql -u root -p
Enter password:
登入成功後,你將進入 MariaDB 的命令列介面。
基本 SQL 命令
在 MariaDB 命令列介面中,可以執行各種 SQL 命令來管理和查詢資料函式庫。例如,使用 SHOW databases; 命令可以列出目前系統中的所有資料函式庫:
MariaDB [(none)]> SHOW databases;
+
---
-
---
-
---
-
---
-
---
-+
| Database |
+
---
-
---
-
---
-
---
-
---
-+
| information_schema |
| mysql |
| performance_schema |
+
---
-
---
-
---
-
---
-
---
-+
3 rows in set (0.00 sec)
這些預設資料函式庫包含了 MariaDB 的基本組態資訊。
查詢 mysql 資料函式庫的使用者表格
可以使用 SELECT 命令來查詢 mysql 資料函式庫中的 user 表格,以檢視目前所有的 MariaDB 使用者:
MariaDB [(none)]> SELECT * FROM mysql.user;
這條命令將傳回 user 表格中的所有資料。
重點整理
本章節介紹了關聯式資料函式庫與非關聯式資料函式庫的基本概念,並詳細說明瞭如何在 Linux 系統上安裝和設定 MariaDB 資料函式庫。同時,也介紹了基本的 SQL 命令和如何使用它們來管理和查詢資料函式庫。
重點提示:
- 關聯式資料函式庫適合儲存結構化資料。
- 非關聯式資料函式庫適合儲存非結構化或半結構化資料。
- 正確設定 MariaDB 的 root 使用者密碼對於資料函式庫的安全至關重要。
- 使用 SQL 命令可以有效地管理和查詢資料函式庫。
管理MariaDB使用者與許可權設定
在MariaDB中,建立非root使用者對於資料函式庫的安全管理至關重要。這些使用者能夠執行常規的SQL命令,但不具備root使用者的所有許可權,從而提高系統的安全性。
建立MariaDB使用者
建立MariaDB使用者的語法包含使用者名稱和主機名稱。以下範例中,我們將建立一個名為webuser的使用者,並限制其僅能從localhost連線。
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'mypassword';
內容解密:
CREATE USER:用於建立新使用者的SQL命令。'webuser'@'localhost':指定使用者名稱為webuser,並限制其只能從localhost連線。IDENTIFIED BY 'mypassword':設定使用者的密碼為mypassword。
若要允許使用者從特定的IP地址或IP範圍連線,可以將localhost替換為特定的IP或IP範圍,如10.128.1.0/24,甚至可以使用%萬用字元允許從任何位置連線。然而,使用%或設定簡單的密碼(如mypassword)是不安全的,不應在生產環境中使用。
檢視現有使用者
執行以下SQL查詢,可以檢視目前已建立的使用者:
SELECT host, user FROM mysql.user;
內容解密:
SELECT host, user FROM mysql.user;:查詢mysql.user表格中的host和user欄位,以顯示目前的所有使用者及其允許連線的主機。
重新整理許可權與登出
在建立新使用者後,需要執行FLUSH PRIVILEGES;命令以提交變更。然後,可以登出root使用者,並以新建立的使用者身份重新登入。
FLUSH PRIVILEGES;
EXIT;
建立測試資料函式庫並授予許可權
目前,新建立的webuser尚無許可權存取任何資料函式庫。因此,需要以root使用者身份登入,建立一個新的資料函式庫,並授予webuser相應的許可權。
CREATE DATABASE mydatabase;
SHOW databases;
內容解密:
CREATE DATABASE mydatabase;:建立一個名為mydatabase的新資料函式庫。SHOW databases;:列出目前所有的資料函式庫,以確認新資料函式庫已成功建立。
此時,雖然已經建立了新的資料函式庫,但webuser仍然無法存取它。下一步是授予webuser對mydatabase的存取許可權。
圖表說明:MariaDB使用者與資料函式庫關係圖
此圖示說明瞭MariaDB中root使用者、新建立的使用者(如webuser)與資料函式庫之間的關係。root使用者負責管理新使用者的建立和資料函式庫的建立,而新使用者則被授予對特定資料函式庫的存取許可權。
綜上所述,透過合理地建立和管理MariaDB使用者,並授予適當的許可權,可以有效地提高資料函式庫的安全性和管理的靈活性。接下來的步驟將涉及如何進一步組態和使用這些資料函式庫,以支援Web應用程式的需求。
管理MariaDB資料函式庫與使用者許可權設定
在前面的步驟中,您已經成功建立了一個名為mydatabase的資料函式庫。然而,由於該資料函式庫是由MariaDB的root使用者建立的,預設情況下,webuser並沒有許可權對其進行操作。因此,您需要明確授予webuser相應的許可權,以便其能夠讀取、寫入和管理該資料函式庫。
授予使用者資料函式庫操作許可權
首先,使用USE指令切換到mydatabase,然後執行GRANT查詢陳述式來賦予webuser必要的許可權:
MariaDB [(none)]> USE mydatabase;
MariaDB [mydatabase]> GRANT CREATE, SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'webuser'@'localhost';
以上的SQL陳述式賦予了webuser在mydatabase資料函式庫上執行建立表格、查詢、插入、更新和刪除資料的許可權。這使得webuser能夠對資料函式庫進行所有必要的操作,包括建立表格和插入資料。
許可權說明
CREATE:允許建立新的資料表。SELECT:允許查詢資料表中的資料。INSERT:允許向資料表中插入新的資料。UPDATE:允許更新資料表中的資料。DELETE:允許刪除資料表中的資料。
您也可以使用GRANT ALL來賦予使用者所有的MariaDB許可權,或者使用*.*來對所有現有的資料函式庫賦予許可權,例如:
MariaDB [mydatabase]> GRANT ALL ON *.* TO 'webuser'@'localhost';
完成許可權設定後,請記得執行FLUSH PRIVILEGES來使變更生效:
MariaDB [mydatabase]> FLUSH PRIVILEGES;
驗證使用者許可權
為了確認webuser是否具有正確的許可權,您可以登出MariaDB並以webuser的身份重新登入,然後執行SHOW databases;指令:
MariaDB [(none)]> SHOW databases;
+
---
-
---
-
---
-
---
-
---
-+
| Database |
+
---
-
---
-
---
-
---
-
---
-+
| information_schema |
| mydatabase |
+
---
-
---
-
---
-
---
-
---
-+
2 rows in set (0.01 sec)
如果結果如上所示,則表示您已成功建立資料函式庫並賦予了webuser正確的許可權。
建立與填充資料函式庫表格
在MariaDB中建立資料表時,您需要定義每個欄位的型別和長度。例如,該欄位是整數、文字、日期還是其他型別。MariaDB提供了不同的欄位型別以維護資料的完整性。
建立my_users表格
以webuser身份登入MariaDB,並切換到mydatabase,然後執行以下SQL指令來建立一個名為my_users的簡單表格,用於儲存使用者的名字和姓氏:
$ sudo mysql -u webuser -p
MariaDB [(none)]> USE mydatabase;
MariaDB [mydatabase]> CREATE TABLE my_users (
user_id INT(3) NOT NULL AUTO_INCREMENT,
user_first VARCHAR(30) NOT NULL,
user_last VARCHAR(30) NOT NULL,
PRIMARY KEY (user_id)
);
Query OK, 0 rows affected (0.08 sec)
欄位定義說明
user_id INT(3) NOT NULL AUTO_INCREMENT:用於標識每一行資料的唯一整數值,會自動遞增。user_first VARCHAR(30) NOT NULL和user_last VARCHAR(30) NOT NULL:用於儲存名字和姓氏的可變長度字串,最大長度為30個字元。PRIMARY KEY (user_id):定義了user_id作為主鍵,確保每一行資料都有一個唯一的標識。
資料完整性
- 使用
NOT NULL來確保在插入新資料時,這些欄位不能為空,從而維護資料的完整性。
驗證表格建立結果
為了確認表格是否按照預期建立,您可以以webuser身份登入並執行以下指令:
$ sudo mysql -u webuser -p
MariaDB [(none)]> USE mydatabase;
MariaDB [mydatabase]> SHOW tables;
+
---
-
---
-
---
-
---
-
---
---
+
| Tables_in_mydatabase |
+
---
-
---
-
---
-
---
-
---
---
+
如果結果正確顯示了您建立的表格,則表示表格已成功建立。### Plantuml圖表示範:資料函式庫結構與表格關係
以下是一個簡單的Plantuml圖表,用於展示資料函式庫結構與表格關係:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Docker佈署RainLoop與LAMP堆積疊整合
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml
圖示說明
此圖示展示了MariaDB中的資料函式庫結構,特別是展示了mydatabase中的my_users表格,以及該表格包含的三個主要欄位:
- user_id(主鍵)
- user_first
- user_last
詳細解說
- MariaDB 是整個系統的核心,包含了多個不同用途的Database。
- mydatabase 是其中一個具體的Database,用於儲存特定應用程式的相關資料。
- my_users 是 mydatabase 中的一個Table,專門用於儲存使用者的相關資訊。
- 每個使用者在 my_users 表格中由 user_id 進行唯一標識,而 user_first 和 user_last 分別儲存了使用者的名字和姓氏。
這個結構展示瞭如何透過合理的設計來組織和管理資料,以確保資料的一致性和查詢的高效性。
資料表設計的最佳實踐
在設計資料表時,除了定義欄位型別和長度外,還應考慮以下幾個最佳實踐:
- 主鍵設計:選擇合適的主鍵(如自動遞增的整數ID)以確保每一行資料都有唯一的標識。
- 欄位命名規範:使用清晰且一致的命名規則,如使用下劃線分隔單詞(例如
user_first,user_last)。 - 欄位型別選擇:根據實際需求選擇最合適的欄位型別。例如,使用
VARCHAR(30)來儲存名字和姓氏,因為它們是可變長度的字串。 - NOT NULL 約束:對必須填寫的欄位使用
NOT NULL約束,以確保資料完整性。
透過這些最佳實踐,可以有效地提升資料表的設計品質,從而提高整個資料函式庫系統的穩定性和可維護性。