linwebs

林林.台灣 | Linwebs - 課程

Docker容器虛擬化介紹 - 在 Docker 佈署 LAMP 架構

本文章為嘉大資工讀書會第二期課程內容
場次 5-2 【雲端系統佈署】 Docker 容器虛擬化介紹

此堂課的最後要教各位的是,如何在伺服器上用 docker 佈署簡易留言板系統。

簡易留言板系統 GitHub Repo: https://github.com/linwebs/simple_message_board

PS: 本課程圖片較多,此頁面圖片有經過壓縮處理,若圖片模糊不清,可點選圖片開啟圖片原始檔。

本頁目錄

在讀書會的前一堂課,我們教大家如何在伺服器上部署 LAMP 環境,在這次,我們使用 docker 在伺服器上部署環境,如此一來,可以省去許多繁雜的設定。

這次我們會將網頁伺服器和資料庫分別建立一個容器,並使用 docker network 將兩者連結,並會使用 dockerfile 來撰寫網頁伺服器的容器映像檔。

 

在 CentOS 安裝 docker Engine

之前我們部署的伺服器使用的是 CentOS 作業系統,現在,我們使用簡單的幾行指令,即可在 CentOS 作業系統中安裝 docker。

docker 官方文件: Install Docker Engine on CentOS

  1. 首先,我們進入 Azure 平台確認伺服器已經開啟,若未啟動,請將它啟動。


  2. 接下來使用 ssh 連線進入伺服器。
    PS: 連線步驟請參考上一次課程的【在 Azure 建立 Linux 虛擬機器
    $ ssh -i <私密金鑰路徑> <使用者名稱>@<伺服器IP位址>


  3. 先將之前使用的 Apache 網頁伺服器關閉。
    $ sudo systemctl stop httpd


  4. 再將 MariaDB 資料庫關閉。
    $ sudo systemctl stop mariadb


  5. 安裝 docker 軟體源。
    $ sudo yum install -y yum-utils
    $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo



  6. 安裝 docker。
    $ sudo yum install docker-ce docker-ce-cli containerd.io




  7. 啟動 docker,並且設為開機自動啟動。
    $ sudo systemctl start docker
    $ sudo systemctl enable docker


  8. 執行 hello-world 映像檔,測試 docker 是否正常運作。
    $ sudo docker run hello-world


  9. 將使用者加入 docker 群組,讓一般使用者不用 sudo 也可以使用 docker。
    加入群組後,需重新載入 bash 才會讓權限生效,故先斷開 ssh 連線。
    $ sudo usermod -aG docker <使用者名稱>


  10. 再次使用 ssh 連線後,不使用 sudo 執行 hello-world 映像檔,測試一般使用者能否正常使用 docker。
    $ docker run hello-world

 

建立 docker 網路

接下來建立一個名稱為 web 的 docker 網路給網頁伺服器和資料庫使用。
並查看 docker 網路情況。

$ docker network create web

$ docker network ls

 

建立資料庫容器

在此我們使用 docker hub 上的 MariaDB 官方映像檔來建立容器
Docker Hub: Mariadb

  1. 依照說明,使用以下指令建立一個容器。
    -d 讓容器在背景執行
    --name 指定新容器的名稱 (smb-db)
    --network 指定此容器要使用的 docker 網路 (web)
    -e 環境變數設置 (MariaDB 的 root 密碼在此設定為 testtest)
    使用最新版 (latest) 的 mariadb 映像檔

    $ docker run -d --name <容器名稱> --network <docker網路名稱> -e MARIADB_ROOT_PASSWORD=<root密碼> mariadb:latest


  2. 容器建立完畢後,可使用 ps 指令查看容器是否正確執行。
    $ docker ps


  3. 我們要部署的簡易留言板程式需要使用一個資料庫,在此臨時建立一個容器來連接 MariaDB 資料庫,進行操作。
    -it 開啟虛擬終端裝置,並啟動互動模式
    --network 指定此容器要使用的 docker 網路 (web)
    --rm 容器停止時,將其自動刪除
    使用 mariadb 映像檔 (預設為最新版,可不加 :latest)
    使用 mysql -h <資料庫位址> -u <使用者名稱> -p 指令連接資料庫,-p 為指定需要輸入密碼。
    在此會需要輸入上面步驟設定的 mariadb root 密碼,密碼輸入時並不會顯示,輸入完畢,按下鍵盤 Enter 按鍵即可確認。

    $ docker run -it --network <docker網路名稱> --rm mariadb mysql -h smb-db -u root -p
    Enter password:


  4. 建立一個名為 smb 的資料庫,且指定資料庫的字集編碼為 utf8mb4_unicode_ci
    CREATE DATABASE <資料庫名稱> COLLATE '<資料庫使用字集>';
    建立一個名為 smb 的全域(%) 使用者,且設定密碼為 smbsmb
    CREATE USER '<使用者名稱>'@'<區域>' IDENTIFIED BY '<此使用者的密碼>';
    賦予 smb 使用者可完整控制 smb 資料庫的權限。
    GRANT ALL PRIVILEGES ON `<資料庫名稱>`.* TO '<使用者名稱>'@'<區域>' WITH GRANT OPTION;
    操作完畢,使用 exit 退出此容器。

    完整指令:
    CREATE DATABASE smb COLLATE 'utf8mb4_unicode_ci';
    CREATE USER 'smb'@'%' IDENTIFIED BY 'smbsmb';
    GRANT ALL PRIVILEGES ON `smb`.* TO 'smb'@'%' WITH GRANT OPTION;

 

取得簡易留言板程式
  1. 使用 git clone 取得簡易留言板程式。
    $ git clone https://github.com/linwebs/simple_message_board.git


  2. 進入簡易留言板程式的目錄,將設定檔範本 config.sample.php 複製一份,並命名為 config.php
    $ cd simple_message_board
    $ cp config.sample.php config.php


  3. 編輯簡易留言板程式的設定檔。
    前綴 url 為空白即可。
    資料庫主機需設為資料庫容器名稱(在 docker 網路內會自動對應 DNS Hostname)

    以下為設定檔參考範例:
    return array(
            'pre_url' => '',
          'website_title' => '簡易留言板',
            'anonymous' => '匿名',
            'db_host' => 'smb-db',
            'db_port' => 3306,
            'db_name' => 'smb',
            'db_user_name' => 'smb',
            'db_user_password' => 'smbsmb'
    );

 

撰寫網頁伺服器 Dockerfile

建立一個檔案名為 Dockerfile,D 記得為大寫,裡面撰寫 Dockerfile 的內容。

Docker Hub: PHP

FROM

在此我們使用 docker hub 上的 php 官方映像檔來建立容器,不過這次我們並不是使用 latest 版本的映像檔,而是使用標籤為 8.0-apache 版本的映像檔,因為單純的 php 容器僅包含 php, 而標籤為 8.0-apache 的映像檔有包含 apache 網頁伺服器,讓我們更方便的架設網站。

RUN

由於此次要架設的簡易留言板需使用到 apache 的 mod_rewrite 模組,所以將模組啟用的指令撰寫在 Dockerfile 內。

而且,映像檔中的 php 未包含連接 MySQL(MariaDB) 資料庫的外掛模組,需手動安裝,所以也將安裝的指令撰寫在 Dockerfile 內。

最後,因為此映像檔的預設編碼非 UTF-8,在容器內終端機顯示中文會呈現亂碼的狀態,故將指定使用 UTF-8 編碼的指令也撰寫在 Dockerfile 內。

COPY

將 dockerfile 目錄下的 simple_message_board 資料夾複製到容器內的網頁根目錄(/var/www/html)。

EXPOSE

宣告容器使用到 TCP 協定 80 埠的連接埠

完整 Dockerfile

FROM php:8.0-apache
RUN a2enmod rewrite \
    && docker-php-ext-install mysqli pdo pdo_mysql \
    && echo "export LANG=C.UTF-8" > ~/.bashrc
COPY simple_message_board /var/www/html
EXPOSE 80/tcp


 

建立網頁伺服器映像檔並部署程式
  1. 接下來將 Dockerfile 建立成映像檔。
    指定映像檔的名稱為 smb,標籤一樣可選填,若不填寫則預設為 latest
    Dockerfile 檔案位於當前路徑內 (.)

    $ docker build -t <要建立的映像檔名稱> <Dockerfile路徑>



  2. 建立並啟動網頁伺服器容器。
    -d 讓容器在背景執行
    -p 連接埠轉送 (80:80)
    --name 指定新容器的名稱 (smb-web)
    --network 指定此容器要使用的 docker 網路 (web)
    --rm 容器停止時一併刪除容器
    使用最新版 (latest) 的 smb 映像檔

    $ docker run -d -p <外部>:<內部> --name <容器名稱> --network <docker網路名稱> --rm smb:latest


  3. 容器建立完畢後,可使用 ps 指令查看容器是否正確執行。
    $ docker ps


  4. 最後打開瀏覽器,使用伺服器的對外 IP 地址瀏覽網頁,即可看到已成功使用 docker 部署簡易留言版網頁程式。


  5. 進入 /initialization 路徑後,點選【安裝】按鈕進行簡易留言板的安裝。


  6. 看到顯示【安裝完畢】表示簡易留言板已成功安裝,點選【前往首頁】即可開始使用簡易留言板系統。

 

恭喜你,已經成功完成在伺服器上部署 PHP & MySQL(MariaDB) 程式的簡易留言板系統!

PS: 若發現簡易留言版的貼文時間與現實相差 8 小時,可在伺服器執行以下指令,設定伺服器的時區。

$ sudo timedatectl set-timezone Asia/Taipei
建立時間:2021/8/27 AM 1:00
修改時間:2021/9/5 PM 7:08
作者: Linwebs

bookmark標籤