此堂課的最後要教各位的是,如何在伺服器上用 docker 佈署簡易留言板系統。
簡易留言板系統 GitHub Repo: https://github.com/linwebs/simple_message_board
PS: 本課程圖片較多,此頁面圖片有經過壓縮處理,若圖片模糊不清,可點選圖片開啟圖片原始檔。
本頁目錄
在讀書會的前一堂課,我們教大家如何在伺服器上部署 LAMP 環境,在這次,我們使用 docker 在伺服器上部署環境,如此一來,可以省去許多繁雜的設定。
這次我們會將網頁伺服器和資料庫分別建立一個容器,並使用 docker network 將兩者連結,並會使用 dockerfile 來撰寫網頁伺服器的容器映像檔。
之前我們部署的伺服器使用的是 CentOS 作業系統,現在,我們使用簡單的幾行指令,即可在 CentOS 作業系統中安裝 docker。
docker 官方文件: Install Docker Engine on CentOS
$ ssh -i <私密金鑰路徑> <使用者名稱>@<伺服器IP位址>
$ sudo systemctl stop httpd
$ sudo systemctl stop mariadb
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
$ sudo systemctl start docker
$ sudo systemctl enable docker
$ sudo docker run hello-world
$ sudo usermod -aG docker <使用者名稱>
$ docker run hello-world
接下來建立一個名稱為 web 的 docker 網路給網頁伺服器和資料庫使用。
並查看 docker 網路情況。
$ docker network create web
$ docker network ls
在此我們使用 docker hub 上的 MariaDB 官方映像檔來建立容器
Docker Hub: Mariadb
$ docker run -d --name <容器名稱> --network <docker網路名稱> -e MARIADB_ROOT_PASSWORD=<root密碼> mariadb:latest
ps
指令查看容器是否正確執行。
$ docker ps
:latest
)mysql -h <資料庫位址> -u <使用者名稱> -p
指令連接資料庫,-p
為指定需要輸入密碼。$ docker run -it --network <docker網路名稱> --rm mariadb mysql -h smb-db -u root -p
Enter password:
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;
$ git clone https://github.com/linwebs/simple_message_board.git
config.sample.php
複製一份,並命名為 config.php
。$ cd simple_message_board
$ cp config.sample.php config.php
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,D 記得為大寫,裡面撰寫 Dockerfile 的內容。
Docker Hub: PHP
在此我們使用 docker hub 上的 php 官方映像檔來建立容器,不過這次我們並不是使用 latest 版本的映像檔,而是使用標籤為 8.0-apache
版本的映像檔,因為單純的 php 容器僅包含 php, 而標籤為 8.0-apache
的映像檔有包含 apache 網頁伺服器,讓我們更方便的架設網站。
由於此次要架設的簡易留言板需使用到 apache 的 mod_rewrite
模組,所以將模組啟用的指令撰寫在 Dockerfile 內。
而且,映像檔中的 php 未包含連接 MySQL(MariaDB) 資料庫的外掛模組,需手動安裝,所以也將安裝的指令撰寫在 Dockerfile 內。
最後,因為此映像檔的預設編碼非 UTF-8,在容器內終端機顯示中文會呈現亂碼的狀態,故將指定使用 UTF-8 編碼的指令也撰寫在 Dockerfile 內。
將 dockerfile 目錄下的 simple_message_board
資料夾複製到容器內的網頁根目錄(/var/www/html
)。
宣告容器使用到 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
$ docker build -t <要建立的映像檔名稱> <Dockerfile路徑>
$ docker run -d -p <外部>:<內部> --name <容器名稱> --network <docker網路名稱> --rm smb:latest
ps
指令查看容器是否正確執行。
$ docker ps
/initialization
路徑後,點選【安裝】按鈕進行簡易留言板的安裝。
恭喜你,已經成功完成在伺服器上部署 PHP & MySQL(MariaDB) 程式的簡易留言板系統!
PS: 若發現簡易留言版的貼文時間與現實相差 8 小時,可在伺服器執行以下指令,設定伺服器的時區。
$ sudo timedatectl set-timezone Asia/Taipei