[Docker] 使用 Nginx 部屬 Static HTML 至 Docker

Static HTML 本身並不是一個服務,無法直接部屬成 Container,所以需要使用 Nginx 包成 Docker image 才行,以下會示範 Static HTML 如何包成 Docker image,以及如何設置 Nginx 的步驟。

 

 

前言

我們公司 frontend 團隊的 Static HTML 原有部屬方式是固定放在某台 Server 上的某路徑來提供存取,在單台的服務部屬方式下這種做法沒有問題,但由於接下來公司的服務正逐漸 Docker 化,並且會期望將前後端的服務全都統一交由容器調度工具( Docker Swarm 或 K8s)管理,未來不會再固定部屬到哪一台 Server,所以 frontend 的 HTML 也不應該再固定放置在 Server 上,故決定一同 Docker 化。

Nginx 是一個網頁伺服器,除了可以做反向代理用途以外,還可以被拿來做為提供靜態檔案的服務,所以這裡我會將 Static HTML 丟進 Nginx image 內的目錄中,並將外部的請求代理至此目錄的 Static HTML 中。

 

 

示範 Static HTML

 這裡簡單創建個陽春的 Static HTML 來示範

 

示範 Folder

這一層放置 Dockerfile 與 nginx.conf 的設定檔

 

client 資料夾內是放置各種靜態檔案

以上只是我的示範資料夾結構,可以不用跟我一樣,後面我會再說明關於路徑的設置細節

 

 

撰寫 Dockerfile

在你專案想放置的路徑下新增一個 Dockerfile 檔案,不需要副檔名

名字預設取 Dockerfile,大小寫都必須完全相同(如果自定義檔名,後面指令會需要特別設置,沒特別需求的話就不要改名)

 

Dockerfile 內容

FROM nginx
COPY /client /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf

 

解釋一下這裡面的指令在做什麼:

FROM 這裡代表以 nginx 這一個 docker image 為基底來建置,這個 image 裡面會有一些預設的環境配置,我們能直接拿這個 image 來微調就可以了,就不用整個環境建置細節都要自己純手工刻

 

第一行 COPY 的指令是用來將你要部屬的檔案們(也就是那些 Static HTML)複製進這個 Docker image 裡面的,指令結構如下 ⬇ 

COPY /專案內html放置的路徑 /包進docker image裡會放置的路徑

這裡 copy 的專案路徑,會隨著你下 docker 指令的位置而有所不同,像是我上述範例中,如果我是打算在 MyNginxWeb 資料夾下包 docker image 的指令,我就指定 MyNginxWeb 資料夾下的 client 資料夾就好

 

他 copy 的方式,會將 client 資料夾內的東西,複製進 docker image 裡的 usr/share/nginx/html 資料夾內的東西(他複製的時候不會包含資料夾本身喔~)

之後等包好發布後,可以進入 Container 內的上述路徑,就可以看到他是只有 client 資料夾內的東西 ⬇  不會保留 client 資料夾

第二行 COPY 的指令是將 nginx.conf 設定檔,複製進這個 docker image 設定檔放置的路徑,他會覆蓋掉預設的設定檔,路徑、檔名都不用動,照 copy 這個內容就好

 

 

撰寫 nginx.conf 設定檔

新增一個名為 nginx ,副檔名為 conf 的設定檔

 

nginx.conf 內容

server {
  listen 9911;
  server_name localhost;
  
  location /web {
    alias /usr/share/nginx/html;
    #index index.html;
}

解釋一下這裡面的指令在做什麼:

 

listen 9911 是指你這個服務部屬上 Container 後,要開什麼 Port

location /web 是指當從外部訪問這個服務的時候,他需要帶什麼路徑(像這樣 ⬇)

index index.html 這是指你要導向哪一個 html 檔案,如果你的 html 檔名就叫 index.html,你可以不用寫這行,他預設就會取 index.html(前面加 # 就可以註解掉該行)

 

 

包 Docker image

下 docker 指令的位置,會預設設置在 Dockerfile 的所在路徑 (像我上面的範例就是 MyNginxWeb 資料夾)

 

將 Static HTML 包成 docker image 的指令

docker build -t kittytestnginx .

-t 是添加 tag 的意思,也會是 image 的名字

這裡示範指令的 kittytestnginx 就是 docker image 的名字,image 名稱必須全小寫喔~

 

如果 image 是要上傳到公司 Private 的 Docker Registry,tag 的內容格式就會變成 dockerRegistry/imageName,需要將 Docker Registry 加在 docker image 的名字上,push 的時候他才知道要推到哪裏去

docker build -t docker.private.net/kittytestnginx .

 

這裡如果是直接在 Dockerfile 放置的路徑下指令,就不用特別指定 Dockerfile

如果你們下指令的地方不是 Dockerfile 的根路徑的話,指令可以添加 -f 指定 Dockerfile 路徑,變成像這樣:

docker build -t kittytestnginx -f MyProject/Dockerfile .

 

如果你的 Dockerfile 名稱是自定義的,這段指令就改成你的自定義名稱

docker build -t kittytestnginx -f MyProject/CustomDockerfile .

 

 

建置 Docker Container

包好的 image 可以在 local 起 Container 來測試

 

運行 Container 的指令

docker run -d -p 9911:9911 --name kittynginxweb kittytestnginx

--name kittynginxweb 是我為此 Container 取的命名

-p 9911:9911 因為我 Nginx 設置的 ports 是 9911,所以這裡也需要 mapping Container 內 9911 的 ports,我對外也開 9911

 

可以打開 Docker Desktop 看到剛剛生成的 kittynginxweb Container

 

接著用瀏覽器訪問,看的到 HTML 就完成了  👍