※ 首先需要安裝Docker:
網址:https://www.docker.com/

進入Get started:選擇下載版本

確認安裝版本:
docker -v

※ 編寫Dockerfile:打包Docker鏡像腳本
專案跟目錄新增文件:
1.第一行要以node的Docker image為基底:因為我的程式碼本身是依賴node去執行。
2.查詢node image官方網站 :
網址:https://hub.docker.com/_/node
3.以Node.js23 官方Image 作為基底 :
FROM node:23-Slim
程式碼解說:
slim
版本是 精簡版 的 Node.js Docker 映像,它比標準版本 更輕量,但可能缺少一些系統工具和依賴。這適合用於 容器化環境,尤其是當你希望減少映像大小並提高部署速度時。- 適合生產環境:如果你的應用不需要完整的工具鏈(如編譯 C++ 擴展),
slim
版本可以幫助減少攻擊面並提高安全性。 - 可能缺少某些工具:例如
curl
、git
或build-essential
可能不包含在slim
版本中,因此如果你的應用需要這些工具,可能需要手動安裝。
4.設定工作的資料夾,讓後續的命令都在這個指定的資料夾內執行 :
WORKDIR /app
5.複製寫好的程式碼到Docker Image裡面的資料夾 :
COPY . /app/
6.安裝需要的外部套件:
RUN npm install
7.打開端口:
EXPOSE 8080
8.依據package.json內容設定執行命令:
CMD ["npm", "run", "dev"]
9.不要把node_modules複製到資料夾:新增檔案.dockerignore,讓docker忽略某些文件或目錄,防止它們被複製到 Docker 映像 中。

10.建構 Docker 映像的指令:
docker build -t my-app .
程式碼解說:
docker build
- 用於建構 Docker 映像。-t my-app
:為映像指定名稱my-app
(應改成自己資料夾的名稱)。.
:代表使用當前目錄(應包含Dockerfile
)。
11.列出本機所有的 Docker 映像的指令:
docker images

12.確認是否安裝 nodemon:
npm list -g --depth=0 | grep nodemon
13.修改 Dockerfile新增nodemon:
RUN npm install -g nodemon
14.執行:
docker run websocket //改成自己的專案名稱

※ 解決Docker服務隔離造成端口連線失敗:

1.列出所有正在運行的容器:
docker ps

2.關閉容器:
docker stop 所屬ID
3.刪除容器:
docker rm 所屬ID
4.啟動 Docker 容器,透過容器內部端口映射去對應外面主機的端口:
docker run -p 8080:8080 websocket
程式碼解說:
docker run
:這是 Docker 用來啟動容器的指令-p 8080:8080
:這是 埠映射(port mapping)。它將主機(你的電腦)的8080
埠映射到容器內的8080
埠。這樣,當你在主機上訪問localhost:8080
,就會連接到容器內的應用程式的8080
埠。websocket
:這是要執行的 映像檔名稱(image name)。它代表要使用的 Docker 映像檔來建立並啟動容器。

5.連線結果:

※ 指令解說:
docker run -p 80:8080 -d my-express-service//容器的名稱
指令解說:
-p 80:8080
:將 主機的 80 號端口映射到容器的 8080 號端口,這樣外部使用者可以透過 80 號端口訪問容器內的應用程式。-d
:讓容器 以背景模式運行(不會佔據終端畫面)。
確認啟動結果:


docker images
指令解說:列出本地存儲的所有映像檔(images)

docker tag websocket carola1408/websocket:latest
docker push carola1408/websocket:latest
指令解說:
- docker tag : 重新命名 本地的 websocket 映像檔,並加上 Docker Hub 帳號和版本(latest)。
- docker push:將你的映像檔上傳到 Docker Hub,讓其他人可以下載。
docker run carola1408/websocket
指令解說:使用 docker run
來啟動Docker 映像檔。

docker image tag 75ec995cba94 olive/websocket
指令解說:使用docker image tag
指令可以用來為現有的 Docker 映像建立新的標籤(tag),但它並不會真正更改映像的名稱,而是讓相同的映像可以擁有多個標籤。好處是你可以使用新的標籤來識別映像,例如更改倉庫名稱或版本標記。

sudo -i //切換成管理員權限才能查看
docker ps
指令解說:
列出目前正在運行的容器,它會顯示正在執行的容器清單,包括容器 ID、名稱、映像名稱(image)、狀態、啟動時間等資訊。

※ 聊天室無法連線:

解決方式:重新啟動伺服器連線即可
npm run dev
伺服器啟動結果:

※ 將本地的 Docker 映像檔(image)上傳到遠端的鏡像倉庫(repository):
Docker hub:免費的線上倉庫
https://www.docker.com/products/docker-hub/

- 註冊帳號。
- 使用 Docker Web-based Login 方式來登入:https://login.docker.com/activate
- 輸入驗證碼:輸入你的 一次性裝置驗證碼。

- 完成驗證:

- 回到終端機:
docker login
- 登入成功:

將映像檔推送到 Docker Hub:
docker tag websocket carola1408/websocket:latest
docker push carola1408/websocket:latest
docker run carola1408/websocket
- 推送成功:

- 運行結果:

※ 優化Dockerfile:
#以Node.js23 官方Image 作為基底
FROM node:23-slim
# 設定工作的資料夾,讓後續的命令都在這個指定的資料夾內執行。
WORKDIR /app
COPY package.json package-lock.json ./
# 安裝需要的外部套件
RUN npm install
# 複製寫好的程式碼到Docker Image裡面的資料夾
COPY . .
# 打開端口
EXPOSE 8080
#安裝nodemon
RUN npm install -g nodemon
# 執行命令
CMD ["npm", "run", "dev"]
※ 連線伺服器:

ssh 34.81.84.66
- 連線成功:

- 切換管理員權限:
sudo -i

※ 在ubuntu主機上安裝docker:


- 從網路上下載腳本:
curl -fsSL https://get.docker.com -o get-docker.sh
- 確認腳本:
get-docker.sh
:這是一個 Shell 腳本 ,.sh
用來安裝docker。
ls

- 運行腳本:
sudo sh get-docker.sh

- 確認docker版本:
docker -v

- 登入docker:
docker login
- pull鏡像:
docker pull carola1408/websocket:latest
- 啟動連線:
docker run -p 8080:8080 -d carola1408/websocket

※ 解決防火牆設定問題:更改端口設定進入虛擬私有雲網路
- 原因:新建立的虛擬主機,因為有防火牆的設定導致只有80和43端口才可以使用,8080端口並不在允許端口裡面,所以不能使用。
- 解決方式:進入虛擬私有雲網路。

- 進入防火牆:設定防火牆規則

- 建立防火牆規則:

- 允許所有人:

- 允許端口:設定8080

- 連線成功:
