返回文章列表

Docker容器化佈署郵件伺服器

本文介紹如何使用 Docker 和 docker-compose 佈署包含 Postfix 和 Dovecot 的郵件伺服器,並搭配 LAMP 堆積疊設定 Apache 與 PHP,實作網頁郵件客戶端 RainLoop 的整合。文章涵蓋 Dockerfile 的撰寫、容器間的網路設定、Apache 虛擬主機設定以及

Web 開發 系統設計

隨著虛擬化技術的發展,容器化技術因其輕量級和高效率的特性,成為現代郵件伺服器佈署的理想選擇。本文將逐步引導讀者使用 Docker 建立和佈署一個功能完善的郵件伺服器,其中包含 Postfix 和 Dovecot,並進一步整合 LAMP 堆積疊,提供根據網頁的郵件存取服務。首先,我們會分別建立 Postfix 和 Dovecot 的 Docker 映像檔,並使用 docker-compose 協調容器之間的運作。接著,我們會在另一個虛擬機器上設定 LAMP 環境,並安裝 Apache 和 PHP,為網頁郵件客戶端 RainLoop 的佈署做好準備。最後,我們將整合郵件伺服器和網頁客戶端,實作一個完整的郵件解決方案。

使用Docker容器化技術佈署郵件伺服器

在現代化的郵件伺服器佈署中,容器化技術提供了一種輕量級且高效的解決方案。本篇文章將詳細介紹如何使用Docker和docker-compose來佈署一個包含Postfix和Dovecot的郵件伺服器。

Docker容器化技術的優勢

相較於傳統的虛擬機器(VM),Docker容器提供了更快的啟動速度和更高效的資源利用率。這使得容器化技術成為佈署郵件伺服器的理想選擇。

郵件伺服器架構設計

本例中的郵件伺服器將由兩個主要服務組成:Postfix作為SMTP伺服器,負責郵件的傳送和接收;Dovecot作為IMAP/POP3伺服器,負責提供郵件存取服務。這兩個服務將被佈署在獨立的Docker容器中,並透過docker-compose進行協調和管理。

Postfix服務容器組態

首先,我們需要為Postfix服務建立一個Dockerfile,用於定義容器的基礎OS、安裝必要的應用程式、組態環境變數以及執行啟動命令。

FROM ubuntu:20.04
ENV MYUSER=jadams
ENV MYPASS=mypassword
ENV DEBIAN_FRONTEND=noninteractive

WORKDIR /usr/src/app

COPY postfix-debconf .

RUN sed -i "s/TRUSTED_NETWORK/10.128.1.0\/24/g" postfix-debconf && \
    sed -i "s/HOSTNAME/devops.lab/g" postfix-debconf && \
    debconf-set-selections < postfix-debconf && \
    apt update && apt install -y postfix dovecot-core

EXPOSE 25

CMD ["postfix", "start-fg"]

內容解密:

  1. 基礎OS選擇:使用ubuntu:20.04作為基礎映像。
  2. 環境變數設定:定義了MYUSERMYPASS等環境變數,用於設定郵件伺服器的使用者名稱和密碼。
  3. 組態檔案複製與修改:將postfix-debconf檔案複製到容器中,並使用sed命令替換其中的預留位置變數。
  4. Postfix安裝與組態:使用debconf-set-selections匯入組態,並安裝Postfix和Dovecot核心套件。
  5. 埠暴露:暴露SMTP服務的25埠。
  6. 啟動命令:使用postfix start-fg命令以前台模式啟動Postfix服務。

Dovecot服務容器組態

接下來,為Dovecot服務建立另一個Dockerfile。

FROM ubuntu:20.04
ENV MYUSER=jadams
ENV MYPASS=mypassword
ENV DOCKER_HOST=10.128.1.6
ENV DEBIAN_FRONTEND=noninteractive

RUN apt update && apt install -y openssl && \
    useradd -rm -d /home/${MYUSER} -s /bin/bash -p "$(openssl passwd -1 ${MYPASS})" ${MYUSER} && \
    mkdir -p /home/${MYUSER}/mail/INBOX && touch /home/${MYUSER}/mail/Sent && \
    chown ${MYUSER}:${MYUSER} /home/${MYUSER}/mail -R && \
    apt install -y dovecot-imapd dovecot-pop3d

EXPOSE 143

CMD ["/usr/sbin/dovecot", "-F"]

內容解密:

  1. 使用者建立與郵件目錄設定:建立系統使用者,並設定郵件目錄及其許可權。
  2. Dovecot安裝:安裝Dovecot的IMAP和POP3套件。
  3. 埠暴露:暴露IMAP服務的143埠。
  4. 啟動命令:以前台模式啟動Dovecot服務。

docker-compose.yml組態

最後,使用docker-compose.yml檔案定義和執行多個Docker容器。

version: '3'
services:
  postfix:
    build: ./postfix
    ports:
      - "25:25"
    depends_on:
      - dovecot

  dovecot:
    build: ./dovecot
    ports:
      - "143:143"

內容解密:

  1. 服務定義:定義了postfixdovecot兩個服務,並指定了各自的建置目錄。
  2. 埠對映:將主機的25和143埠分別對映到postfixdovecot容器的對應埠。
  3. 依賴關係:指定postfix服務依賴於dovecot服務。

建置郵件伺服器容器與啟動

在定義好Docker Compose檔案後,即可建立Docker映像檔並執行容器。請導航至mailserver目錄(若尚未在此目錄下,可使用pwd命令確認目前工作目錄),並執行:

$ docker-compose up -d

此命令首先會建立Docker映像檔,然後根據這些映像檔啟動容器。終端機會顯示docker-compose執行建置步驟的輸出,包括下載Ubuntu映像檔、執行apt更新等命令。當完成後,容器會在背景執行(-d引數指示docker-compose在背景啟動容器)。

使用docker ps命令確認容器是否正在執行:

$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS                  PORTS                      NAMES
a71e3f2c7599   mailserver_dovecot     "/usr/sbin/dovecot -F"   5 hours ago     Up 5 seconds            0.0.0.0:143->143/tcp       postfix
2b39252097d1   mailserver_postfix     "/usr/sbin/postfix s..." 5 hours ago     Up 23 minutes           0.0.0.0:25->25/tcp         postfix

輸出結果顯示,名為dovecot的容器正在執行,使用的映像檔為mailserver_dovecot,並開啟了143埠。同樣地,名為postfix的容器也正在執行,使用的是mailserver_postfix映像檔,並開啟了25埠。

內容解密:

  1. docker-compose up -d:建立並在背景啟動容器。
  2. docker ps:列出目前正在執行的容器。
  3. 容器的命名規則:docker-compose根據目錄名稱自動建立映像檔名稱。

若要檢視容器的大小,可執行docker ps -s命令。在範例中,dovecot容器的大小約為110MB,而postfix容器的大小約為168MB。雖然相對較小,但已包含執行郵件服務所需的所有元件。

組態LAMP堆積疊:Apache與PHP

LAMP堆積疊結合了Linux、Apache、MariaDB(或MySQL)與PHP,為建立網站與網頁應用程式提供了強健且多樣化的平台。本章將介紹如何安裝與組態Apache,以在單一伺服器上託管兩個不同的網站。同時,也會安裝PHP並佈署根據PHP的RainLoop網頁郵件應用程式,以利用先前設定的郵件伺服器。

為何選擇LAMP?

Apache HTTP伺服器是免費、開源且跨平台的網頁伺服器軟體,驅動了超過65%的網站。當與PHP程式語言、MariaDB和Linux結合時,它成為了流行的內容管理平台(如WordPress、Drupal和Joomla)、購物車應用程式(如OpenCart)以及管理工具(如Webmin和Adminer)的基礎。Apache穩定且有完善的檔案記錄,經過數十年的測試與執行,這意味著在需要幫助時,可以輕易找到有用的線上範例、教學和技巧。

組態網頁伺服器虛擬機器並安裝套件

首先,建立一個新的Ubuntu虛擬機器於Proxmox,可以從頭開始建立或複製現有的伺服器(詳見第2章)。為伺服器分配至少16GB的儲存空間、2GB的RAM,以及在私有網路上的一個靜態IP地址。由於在第4章建立的docker.devops.lab主機的地址是10.128.1.6,因此可將此伺服器的地址設為10.128.1.7。在實驗室子網路(10.128.1.0/24)中,可以分配任何未使用的IP地址,但為了保持簡單,使用下一個未使用的IP地址。

# 範例程式碼:建立虛擬機器並分配資源

內容解密:

  1. 建立新的Ubuntu虛擬機器。
  2. 分配資源:至少16GB儲存空間、2GB RAM和靜態IP地址。
  3. 設定IP地址為10.128.1.7。

本章將繼續介紹如何安裝與組態Apache、PHP,以及佈署RainLoop網頁郵件應用程式,以完成LAMP堆積疊的建置。接下來的章節將探討如何安裝MariaDB(或MySQL),以完成整個LAMP堆積疊。

建立LAMP堆積疊:Apache與PHP的基礎設定

在前面的章節中,我們已經成功佈署了一個虛擬機器並更新了DNS設定。現在,我們將繼續安裝LAMP堆積疊的核心套件,包括Apache和PHP。

更新DNS設定以新增網站

首先,我們需要在DNS伺服器中新增新的A記錄和CNAME記錄,以便能夠使用網域名稱存取我們的網站。在DNS伺服器中新增以下記錄:

web IN A 10.128.1.7
myserver IN CNAME web

這些記錄將允許我們使用web.devops.labmyserver.devops.lab兩個網域名稱存取同一個主機。

DNS設定的重要性

正確的DNS設定是確保網站可被存取的關鍵步驟。記得在每次修改DNS記錄後遞增序列號,並使用rndc reload命令重新載入DNS設定。

安裝核心LAMP套件

安裝LAMP堆積疊需要多個套件,包括Apache、PHP和相關模組。在Ubuntu 22.04上,執行以下命令安裝必要的套件:

$ sudo apt update && sudo apt install apache2 \
php8.1 libapache2-mod-php8.1 php8.1-common \
php8.1-curl php8.1-xml php8.1-mysql php-date \
php8.1-fpm php8.1-json php8.1-cli

重要套件解析

  • libapache2-mod-php8.1:提供Apache的PHP模組,使伺服器能夠理解和執行PHP檔案。
  • php8.1-mysql:提供PHP與MariaDB(或MySQL)之間的通訊模組,是建立與資料函式庫互動的PHP應用程式的必要條件。

建立兩個網站目錄

Apache允許單一例項服務多個不同的網域名稱。為了展示這一點,我們將建立兩個網站目錄。

首先,建立一個新的目錄/var/www/myserver,並將其所有權變更為Apache的使用者www-data

$ sudo mkdir /var/www/myserver
$ sudo chown www-data:www-data /var/www/myserver

這個新的目錄將用於存放第二個網站的檔案。

測試Web伺服器

完成上述步驟後,開啟瀏覽器並存取您提供的網域名稱(例如http://web.devops.lab)。如果一切正常,您應該能夠看到預設的Apache歡迎頁面。

PlantumlLAMP堆積疊架構

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title PlantumlLAMP堆積疊架構

rectangle "Request" as node1
rectangle "PHP" as node2
rectangle "Database Query" as node3
rectangle "Query Result" as node4
rectangle "Processed Data" as node5
rectangle "Response" as node6

node1 --> node2
node2 --> node3
node3 --> node4
node4 --> node5
node5 --> node6

@enduml

此圖示展示了LAMP堆積疊的基本架構,包括客戶端請求、Apache伺服器、PHP直譯器和MariaDB資料函式庫之間的互動流程。

設定Apache伺服器以支援多個獨立網站

在前面的章節中,我們已經成功安裝並設定了Apache伺服器,並且確認了伺服器能夠正常運作。在本文中,我們將進一步探討如何設定Apache以支援多個獨立的網站。

定義兩個不同的網站

為了建立兩個獨立的網站,我們需要編輯Apache的設定檔/etc/apache2/apache2.conf,並在/etc/apache2/sites-available目錄中新增網站特定的設定檔。基本上,apache2.conf檔案負責設定Apache伺服器全域的組態值。這些設定與防火牆規則不同,後者通常用於開啟或關閉伺服器上的特定連線埠。

編輯apache2.conf檔案

首先,開啟/etc/apache2/apache2.conf檔案,找到如下所示的預設指令:

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

在這個設定中:

  • IndexesFollowSymLinks指令允許Apache在沒有index.htmlindex.php檔案的情況下傳回目錄列表,並且允許遵循符號連結(軟連結)到伺服器上的其他位置。
  • AllowOverride None指令告訴Apache不處理任何在外部.htaccess檔案中找到的指令,這些檔案可以放置在網頁伺服器目錄的根目錄或其任何子目錄中。
  • Require all granted指令允許來自任何網域名稱的伺服器的HTTP請求。

設定預設索引檔案

預設的索引檔案名稱是在模組設定檔/etc/apache2/mods-available/dir.conf中指定的。預設情況下,其內容如下:

<IfModule mod_dir.c>
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>

我們可以將其修改為:

<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

這確保了當目錄中同時存在index.htmlindex.php時,伺服器會優先載入index.php

為第一個網站完成設定

預設情況下,/etc/apache2/apache2.conf中的設定適用於/var/www目錄下的所有網站,包括預設的網站檔案位置/var/www/html。如果我們希望為myserver網站設定不同的指令,我們可以在同一個檔案中新增特定的設定。

例如,為了為myserver.devops.lab新增特定的指令,我們可以在/etc/apache2/apache2.conf中新增如下內容:

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

<Directory /var/www/myserver>
AllowOverride All
</Directory>

這裡,第二個<Directory>區塊為/var/www/myserver目錄下的網站設定了不同的許可權。

程式碼組態解說

以下是一個範例組態,用於說明如何為Apache設定多個網站:

# 編輯Apache的主設定檔
sudo nano /etc/apache2/apache2.conf

# 在檔案中新增或修改相關設定
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

<Directory /var/www/myserver>
AllowOverride All
</Directory>

# 修改預設索引檔案的順序
sudo nano /etc/apache2/mods-available/dir.conf

# 將index.php放在第一位
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>

# 重啟Apache服務以套用變更
sudo systemctl restart apache2

內容解密:

  1. 編輯Apache的主設定檔:使用nano編輯器開啟/etc/apache2/apache2.conf檔案,以便進行必要的修改。
  2. 新增或修改相關設定:在<Directory>區塊中,我們可以根據需要對不同網站目錄進行設定,例如允許或禁止符號連結、覆寫設定等。
  3. 修改預設索引檔案的順序:透過編輯/etc/apache2/mods-available/dir.conf,我們可以控制Apache在存取網站時預設載入的索引檔案順序。
  4. 重啟Apache服務:變更設定後,需要重啟Apache服務以使新的設定生效。