這一系列文章,是我自己完成 Docker Server 建立的經歷以及過程,包含以下章節內容:
- 新手自建 Docker 伺服器 - (0) 簡介與架構說明
- 新手自建 Docker 伺服器 - (1) Ubuntu 主機建立 docker 服務
- 新手自建 Docker 伺服器 - (2) 建立 Nginx 代理伺服器
- 新手自建 Docker 伺服器 - (3) 建立應用,以靜態網頁為例
- 新手自建 Docker 伺服器 - (4) 建立 Joplin 筆記軟體
- 新手自建 Docker 伺服器 - (5) 建立自己的音樂串流服務 Navidrome
自建 Docker 伺服器 - (3) 建立應用,以靜態網頁為例
接下來的幾個文章會專注在 Docker 的應用,在閱讀完之後,能夠對於使用 Docker compose 建立起服務有基本的概念,未來要把各種服務建立起來時,也能參考這些範例依樣畫葫蘆。
一開始,我們先來說說什麼是 靜態網頁
靜態網頁
靜態網頁 指的是每個頁面都是單獨的 html,不會根據不同使用者的 login 以及操作狀況,做大量的變化與調整,例如目前這個由 Hugo 建立 Swingyoyo.com,以及我直接用 HTML 寫的 爵士和弦密碼生成器,都是直接用靜態網頁的方式製作出來,不會有任何動態的效果。
相比之下,動態網頁 就比較接近大家平常使用包含會員功能的 app,例如 Facebook、X、蝦皮等就比較屬於動態網頁,而這本身就是另外一個領域了,我也需要花時間學習與了解。
那這次我們操作的目標就是建立一個靜態網頁,這樣的話之後我有各種 奇怪的想法
就不一定要依賴 Cloudflare page 來建立 Serverless 服務,也可以考慮用自己的 Docker 服務來實現,而這次的目標以下:
- 用 Docker 建立一個 Nginx 服務顯示靜態網頁
- 在外部可以透過指定 domain 連線到該網頁
步驟一:建立 docker 資料夾
非常簡單,就建立而已
mkdir myweb && cd myweb #建立 docker 專案資料夾
步驟二:寫靜態網頁內容
接著我們要建立 Nginx 渲染使用的檔案,為了未來方便檔案管理,我們就建立一個資料夾 web
,把我們要渲染的檔案丟進去,之後在 docker compose 檔案中去引用這個資料夾,這麼做的好處是當你要修改 Web 的內容時,直接改就可以生效了
,而不用再重新build docker。
mkdir web #建立的 web 資料夾,裡面放入網頁檔案
nano index.html
如果你手邊沒有 html ,也可以直接用這個測試
<!DOCTYPE html>
<head>
<title>Docker test</title>
</head>
<body>
<h1>This is docker test</h1>
<p>Tutorial by <a href="https://swingyoyo.com/docker-server-3/">Swingyoyo.com</a></p>
</body>
</html>
步驟三:撰寫 docker compose
在回到上一層 myweb 資料夾,透過指令建立 docker compose 檔案
nano docker-compose.yml
貼上以下 docker compose 內容,這裡的幾個部分可以稍微理解下
- 除了 nginx-proxy,還另外安裝了一個 letsencrypt 服務來自動申請 SSL 憑證,這樣假如要做多個不同 domain 服務時也可以使用
- 掛載的資料夾要對應上一部生成的資料夾位置
- network 要對應第一步驟建立的 docker 網路名稱
- Email 填入自己的
version: '3.7'
services:
nginx:
image: nginx:alpine #輕量的 nginx 镜像
container_name: my-web-container
ports:
- ":80" #因為後面會由nginx去指定,想指定 port 再設定即可
volumes:
- ./web/:/usr/share/nginx/html #這個意思是會把目前 docker compose 的下的 web 資料夾內所有內容掛載到容器內的 html 位置
restart: unless-stopped
environment:
VIRTUAL_HOST: yourdomain.com #之後要到 DNS 上綁定的 domain
LETSENCRYPT_HOST: yourdomain.com #如果要申請 SSL 憑證的話,這一行可以填入,但如果跟我一樣想要 domain 走 cloudflare,可以不填入
networks:
- net #建立的docker connect 名稱,一定要填入才會讓我們安裝的 NGING 去抓到
networks:
net:
external: true
步驟四:部署
完成 docker compose 後,接著透過指令部署。
docker compose up -d
結束之後也可以再 docker ps 看一下,確認 Run 起來。
步驟五:Cloudflare 設定
接著,到你的 DNS 內,把你的 yourdomain.com
去指向 Server 的 IP。
步驟六:測試
此時,你可以試著在 http://yourdomain.com 來測試看看是否有出現 Web 內容
Note: 如果有 SSL,則可以測試 https
完成了!好感動我生出網頁了
恭喜你完成在 docker 上建立靜態網頁服務,在這裏我們有幾個有趣的地方可以討論,先看一下我用 Plantuml 畫出來的架構圖,可以看到幾個重點:
- 當我們想要實現 User 透過 Domain 連進 docker 服務時,我們需要在 Cloudflare 設定一個 A Record 指向 Server 的 IP
- 我們的 Nginx 代理伺服器可以在收到 request 後,根據 VIRTUAL_HOST 這個參數
@startuml left to right direction skinparam actorStyle awesome rectangle "Ubuntu" as ub { package Docker { usecase "Nginx" as ng note top of ng listen XXX Reverse to XXX.domain docker end note usecase "DockerA" as dka usecase "DockerB" as dkb } } note left of ub Create on Linode IP: 1.1.1.1 end note "User" as u u --> (Cloudflare) : XXX.domain note top of (Cloudflare) A Record: XXX.domain -> 1.1.1.1 end note (Cloudflare) --> ng ng --> dka : AAA.domain ng --> dkb : BBB.domain @enduml
而未來,只要你有相關的靜態網頁需求,也可以試試看把 Hugo 整個專案放進來後,docker compose 直接掛載 public 資料夾來使用,也可以有同樣的效果喔!
如果你有碰到什麼困難,歡迎寫 email 給我來討論喔