返回文章列表

Docker佈署RainLoop與LAMP堆積疊整合

本文介紹如何使用 Docker 佈署 RainLoop 郵件客戶端,並逐步建置 LAMP 堆積疊,包含 Apache、MariaDB 和 PHP 的整合應用。文章涵蓋 Dockerfile 解析、多容器應用程式啟動、MariaDB 安裝設定、使用者許可權管理以及資料函式庫表格建立等關鍵步驟,提供一個完整且實用的

Web 開發 系統管理

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

內容解密:

  1. RUN mkdir -p /var/www/html/rainloop:建立RainLoop的安裝目錄。
  2. unzip rainloop-community-latest.zip -d /var/www/html/rainloop:解壓縮RainLoop的安裝包到指定目錄。
  3. chown -R www-data:www-data /var/www/html/rainloop/:更改RainLoop目錄的所有者與群組為www-data,以確保Apache伺服器能夠正確讀取相關檔案。
  4. find命令用於調整目錄與檔案的許可權,確保安全性。
  5. 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表格中的hostuser欄位,以顯示目前的所有使用者及其允許連線的主機。

重新整理許可權與登出

在建立新使用者後,需要執行FLUSH PRIVILEGES;命令以提交變更。然後,可以登出root使用者,並以新建立的使用者身份重新登入。

FLUSH PRIVILEGES;
EXIT;

建立測試資料函式庫並授予許可權

目前,新建立的webuser尚無許可權存取任何資料函式庫。因此,需要以root使用者身份登入,建立一個新的資料函式庫,並授予webuser相應的許可權。

CREATE DATABASE mydatabase;
SHOW databases;

內容解密:

  • CREATE DATABASE mydatabase;:建立一個名為mydatabase的新資料函式庫。
  • SHOW databases;:列出目前所有的資料函式庫,以確認新資料函式庫已成功建立。

此時,雖然已經建立了新的資料函式庫,但webuser仍然無法存取它。下一步是授予webusermydatabase的存取許可權。

圖表說明: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陳述式賦予了webusermydatabase資料函式庫上執行建立表格、查詢、插入、更新和刪除資料的許可權。這使得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 NULLuser_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表格,以及該表格包含的三個主要欄位:

  1. user_id(主鍵)
  2. user_first
  3. user_last

詳細解說

  • MariaDB 是整個系統的核心,包含了多個不同用途的Database
  • mydatabase 是其中一個具體的Database,用於儲存特定應用程式的相關資料。
  • my_usersmydatabase 中的一個Table,專門用於儲存使用者的相關資訊。
  • 每個使用者在 my_users 表格中由 user_id 進行唯一標識,而 user_firstuser_last 分別儲存了使用者的名字和姓氏。

這個結構展示瞭如何透過合理的設計來組織和管理資料,以確保資料的一致性和查詢的高效性。

資料表設計的最佳實踐

在設計資料表時,除了定義欄位型別和長度外,還應考慮以下幾個最佳實踐:

  1. 主鍵設計:選擇合適的主鍵(如自動遞增的整數ID)以確保每一行資料都有唯一的標識。
  2. 欄位命名規範:使用清晰且一致的命名規則,如使用下劃線分隔單詞(例如 user_first, user_last)。
  3. 欄位型別選擇:根據實際需求選擇最合適的欄位型別。例如,使用 VARCHAR(30) 來儲存名字和姓氏,因為它們是可變長度的字串。
  4. NOT NULL 約束:對必須填寫的欄位使用 NOT NULL 約束,以確保資料完整性。

透過這些最佳實踐,可以有效地提升資料表的設計品質,從而提高整個資料函式庫系統的穩定性和可維護性。