Mark Ku's Blog

Powershell 一鍵遠端部署容器應用 - NET CORE 建置部署至Qnap Docker Container Station

解決問題

過去在 PC 端開發容器應用程式時,要將容器應用部署到遠端 Nas Docker 主機時,有太多手動繁瑣作業,因此我用 Powershell 寫了一個自動建置部署的腳本工具。

開發環境

Windows 10 X64 Home
Visual Studio 2019 Community Docker for Windows 17.06.2 QNAP Nas TS-253d 5.0.0.1891
Container Station 2.4.3.208
QNAP Docker Version 20.10.8

首先,我們先到 NAS 的後台,下載 Docker 安全憑證到 Windows 用戶端

到了 NAS 管理後台 > 打開 Container Station >點擊左選單中的屬性 > 點選 Doocker 憑證 > 下載

Container Station 屬性 Docker 憑證下載介面
Container Station 屬性 Docker 憑證下載介面

將下載後的解壓縮檔,將 Docker 憑證解壓縮到 "%USERPROFILE%/.docker" 目錄

Windows檔案總管顯示.docker目錄中的PEM憑證檔
Windows檔案總管顯示.docker目錄中的PEM憑證檔

P.S. "tcp://192.168.50.52:2376" 為 docker 主機位置,(此 IP 及 PORT 號己作廢)

開啟 Powershell 測試連線

docker --tls -H="tcp://192.168.50.52:2376" --version # 查詢遠端 nas docker 版本號

撰寫 Powersell 遠端部署腳本

建置映像檔

# 本地建置映像檔
docker build -t shopcart . -f ./Comma.Web/Dockerfile
# save 要搭配 load 指令; import 搭配 export 指令
docker save -o C:\Project\shopcart.tar shopcart 

$containerUrl = "tcp://192.168.50.52:2376" # 將Nas docker 主機位置宣告成變數

# 遠端建置映像檔 (nas 比本機電腦慢,這個就不建議了)
# docker  --tls -H="$containerUrl" build -t shopcart . -f ./Comma.Web/Dockerfile

停止遠端容器應用

$containerName = "shopcart-1" # 容應應用名稱
docker --tls -H="$containerUrl" ps -a -f ancestor=$containerName --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" stop $_ }
docker --tls -H="$containerUrl" ps -a -f name=$containerName --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" stop $_ }

遠端移除指定的容器應用

docker --tls -H="$containerUrl" ps -a -f ancestor=$containerName* --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" rm -f $_ }
docker --tls -H="$containerUrl" ps -a -f name=$containerName* --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" rm -f $_ }

刪除遠端映像檔

$imageName = "shopcart"
$existingImages = docker --tls -H="$containerUrl" images $imageName
If ($existingImages.count -gt 1) {
write-host "[Removing image]Removing the existing image.."
docker --tls -H="$containerUrl" rmi -f $imageName
} else {
write-host "[Removing image]The image does not exist"
}

將本地的映像檔匯入 Docker 主機

docker --tls -H="$containerUrl" load --input  "C:\Project\shopcart.tar"

建立及啟動容器應用

docker --tls -H="$containerUrl" run -d --name shopcart-1 -p 888:80 shopcart

實測

對剛撰寫好的 powershell 點擊兩下

PowerShell視窗顯示Docker建置與載入容器映像檔過程
PowerShell視窗顯示Docker建置與載入容器映像檔過程

當腳本跑完後,就可以去 Container Station 檢查看容器應用有沒有正常運行

Qnap Container Station 總覽顯示 shopcart 容器運行中
Qnap Container Station 總覽顯示 shopcart 容器運行中

網站服務正常顯示

letgo網站頁面與「即將到來」彈出視窗
letgo網站頁面與「即將到來」彈出視窗

完整程式碼

$hostname = "letgoshop"
$containerName = "shopcart-1"
$containerUrl = "tcp://192.168.50.52:2376"
$imageName = "shopcart"
$containerMacAddress = "00:0C:29:E8:24:F4"
$containerIpAddress = "192.168.0.142"
$logsVolumePath = "/share/Container/Logs"
$dockerfile = "./Comma.Web/Dockerfile"

# 本地建置映像檔
docker build -t shopcart . -f ./Comma.Web/Dockerfile

docker save -o C:\Project\shopcart.tar shopcart # save 指令要搭配 load 指令; import 指令搭配 export 指令

# 遠端建置映像檔 (nas 比本機電腦慢,這個就不建議了)
# docker  --tls -H="$containerUrl" build -t shopcart . -f ./Comma.Web/Dockerfile

# 停用容器
docker --tls -H="$containerUrl" ps -a -f ancestor=$containerName --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" stop $_ }
docker --tls -H="$containerUrl" ps -a -f name=$containerName --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" stop $_ }

# 移除容器
docker --tls -H="$containerUrl" ps -a -f ancestor=$containerName* --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" rm -f $_ }
docker --tls -H="$containerUrl" ps -a -f name=$containerName* --no-trunc -q | foreach-object { docker --tls -H="$containerUrl" rm -f $_ }

# 移除映像檔

$existingImages = docker --tls -H="$containerUrl" images $imageName
If ($existingImages.count -gt 1) {
write-host "[Removing image]Removing the existing image.."
docker --tls -H="$containerUrl" rmi -f $imageName
} else {
write-host "[Removing image]The image does not exist"
}

# 將本地的映像檔匯入 Docker 主機
docker --tls -H="$containerUrl" load --input  "C:\Project\shopcart.tar"
				
# 建立及啟動容器應用
docker --tls -H="$containerUrl" run -d --name shopcart-1 --restart=always -p 8888:80 shopcart			

pause

作者

Mark Ku

擁有 10+ 年經驗的資深軟體工程師,現為 AI 應用 Builder,專注於大型平台架構與簡化複雜系統設計,從電商系統到訂閱與收費平台,結合 AI Agent、AI 整合與自動化開發,打造高效率且可持續演進的產品技術基礎。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··604

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··471

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··329

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··240

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··235

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調
Mark Ku
··216

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取