Docker 執行個體管理指南
Docker 執行個體是 GIIP 的管理員功能,可將 GIIP 代理以容器方式部署到遠端 PC/伺服器,並在 GIIP Web 上進行建立、檢視和銷毀。將執行個體權杖傳遞給目標機器並啟動容器後,該機器將開始作為 GIIP 代理(每分鐘輪詢)和 slack-bot(可選)運行。
📋 概述
Docker 執行個體管理頁面用於在遠端 PC/伺服器上部署 giip-fde-agent Docker 容器。建立執行個體時,GIIP 伺服器使用 AES-256-GCM 加密存儲憑證,並僅一次顯示 bootstrap 權杖。
⚠️ 此頁面僅限管理員存取。 需要
uLevel >= 70才能存取。低於此級別的用戶將被重新導向到首頁。
🔍 頁面佈局
1. 頂部標題
- 頁面標題: "Docker 執行個體管理"
- + Create Docker instance 按鈕:打開建立模態框。
2. 執行個體列表
| 欄位 | 說明 |
|---|---|
| Label | 執行個體名稱(未設定時為 #<diSn>) |
| LSSN | 預登記的lsvr序列號。在建立後立即在權杖顯示區域和此清單中顯示。點擊跳轉到lsvrdetail |
| Created | 建立時間 |
| Last fetched | 容器使用權杖最後一次從 GIIP 獲取 env 的時間。這不是即時存活狀態,而是接近「最後啟動時間」。 |
| Status | Active(綠色)或 Revoked(紅色)徽章。對於可能因擁有權不一致導致 CQE 引導程式無法執行的行,徽章旁會顯示警告圖示(⚠️)——滑鼠停留查看說明,點擊可前往該 lssn 的執行清單(cqelsvrRunList)(giip 3062) |
| Actions | Revoke 按鈕 — 使權杖失效(不停止執行中的容器) |
⚠️ 當 Last fetched 為
-時:容器尚未啟動。尚未執行步驟 ①(手動)或 ②(Provision now)。
🛠️ 建立執行個體
- 點擊 + Create Docker instance。
- 填寫 3 個必填欄位:
- GIIP_LOGIN_ID: GIIP 登入帳戶(例如
user@example.com) - GIIP_SK: GIIP 密鑰(與密碼不同)
- GIIP_CSN: CSN 編號(例如
47)
- GIIP_LOGIN_ID: GIIP 登入帳戶(例如
- 填寫可選欄位:
- Label: 執行個體名稱(例如
lowy-dp01-docker) - GIIP_PROJECT_NAME: 預設為
docker - GIIP_WORKDIR: 工作目錄(可選)
- GIIP_REST_BRANCH: Git 分支(可選)
- SLACK_BOT_TOKEN / SLACK_APP_TOKEN / SLACK_CHANNEL_ID: Slack 機器人(可選 — 需要兩個權杖)
- Enable hourly-issue-scheduler: 核取方塊(預設開啟) — 每小時
:07執行一次問題排程器
- Label: 執行個體名稱(例如
- 點擊 Create。
請立即複製權杖
建立後,僅顯示一次權杖。
GIIP_INSTANCE_TOKEN=<權杖>
關閉模態框後將無法再次檢視。 啟動容器需要此權杖,請在繼續操作前務必複製。
🛠️ 建立後啟動容器 — 方法 ①(手動,所有環境)
複製權杖後,在目標 PC/伺服器上執行以下操作:
# 1. 克隆 giip-fde-agent 儲存庫
git clone https://github.com/LowyShin/giip-fde-agent.git
cd giip-fde-agent/docker
# 2. 只在 .env 中寫入權杖
echo 'GIIP_INSTANCE_TOKEN=<複製的權杖>' > .env
# 3. 使用 Docker Compose 啟動
docker compose up -d --build
.env中只需權杖一行。 其餘環境變數由fetch-instance-env.sh透過dockerInstanceFetchAPI(權杖本身作為憑證)從伺服器自動獲取。- 如果直接在
.env中新增其他鍵,這些值優先(支援部分覆寫)。
🛠️ 建立後啟動容器 — 方法 ②(遠端 "Provision now")
僅在目標 PC 已執行 GIIP 代理且擁有 lssn 時可用。(giip 3043)下拉選單只會列出 已安裝 Docker Desktop 且至少回報過一次使用狀況的 lssn —— 剛建立的執行個體自身的(代理從未 連線過的)lssn 一開始就不會出現在候選清單中。
- 在權杖顯示區域的下拉選單中選擇資源有餘裕的目標(會一併顯示 CPU/Mem/Disk 使用率與執行中的 容器數)。若沒有任何候選項目,會改為顯示提示文字取代下拉選單 —— 此時請改用方法①(手動)。
- 點擊 [Provision now] 按鈕。
- 引導指令稿(mssn=6122)將被加入 CQE 佇列並立即強制執行(
CQERunForce)。
⚠️ 此按鈕僅在已安裝 GIIP 代理的 PC 上有效。 如果目標 PC 上沒有代理,請使用步驟 ①。
ℹ️ 權限: [Provision now] 由伺服器(
DockerInstanceProvision)驗證。只要是執行個體所屬 csn 與目標伺服器所屬 csn 的成員即可執行,不需要是指令稿的所有者。失敗時頁面會顯示原因(見下方疑難排解表),執行個體已建立且權杖仍然有效,可繼續使用手動步驟 ①。⚠️ 最多需要 1 分鐘: 目標 PC 上的 GIIP 代理約每 60 秒輪詢一次,最長等待 1 分鐘。
🔍 建立後「連線」確認 — 3 種方法
GIIP Web 中沒有連接到容器的終端。 確認方式如下:
1. 容器 Shell 連線(目標 PC 上)
docker exec -it giip-fde-agent bash
容器名稱固定為 giip-fde-agent。
2. 日誌檢視(目標 PC 上)
docker compose logs -f # 在 docker/ 目錄中執行
docker logs -f giip-fde-agent # 任意位置
啟動正常時會看到:
[entrypoint] cloned ...[fetch-instance-env] env applied from GIIP_INSTANCE_TOKEN[entrypoint] registered giipAgentLinux cron (every 1 min)[entrypoint] ready. tailing logs.
3. GIIP Web 確認 — lsvrlist(伺服器列表)
這是「透過 GIIP Web 確認連線」的正確方式。
執行個體建立時會預登記lsvr — 建立執行個體時lssn會立即發放並顯示在UI上,因此lsvr會在容器啟動前就顯示在lsvrlist中(giip 2856)。
容器啟動時:
- 克隆
giipAgentLinux。 - 建立
giipAgent.cnf(sk=註冊的 GIIP_SK,lssn=GIIP_LSSN 環境變數值)。 - 每分鐘執行
giipAgent3.sh(但由於 lssn 不為 0,它維持現有 lsvr 而不是調用 CQEQueueGet 的自登記路徑)。 - 此後該容器將在 lsvrlist 中與其他伺服器一起顯示。
確認路徑: /zh-TW/lsvrlist → 找到對應的 lssn → lsvrdetail → 透過 tLSvr.lsChkdt 心跳確認存活
⚠️ 如果沒有
GIIP_SK或GIIP_ENABLE_AGENT=false,則不會發生此註冊,無法在 GIIP Web 上檢視容器狀態。啟動日誌末尾的[entrypoint] summary:區塊透過giip agent: on|off (原因)可一眼判定此狀態(giip #2855)。
4. Slack 確認(配置 Slack 機器人時)
僅當 SLACK_BOT_TOKEN 和 SLACK_APP_TOKEN 均提供時,slack-bot 才會透過 pm2 啟動。如果機器人在指定頻道中回應,則執行正常。
⚠️ 如果缺少任一權杖則跳過 — 僅配置一個權杖而沒有任何反應是正常行為。
🧩 如何新增目標伺服器(安裝 Docker → 顯示為候選)
Provision now 下拉清單依**伺服器(lssn)**顯示候選,而不是依 csn 選擇;候選只來自建立執行個體時所用 csn 下的伺服器。要新增目標,請依以下順序準備 PC/伺服器。
| 步驟 | 操作 | 確認方法 |
|---|---|---|
| ① | 在目標 PC/伺服器上安裝 Docker | docker version 同時輸出 Client 與 Server 版本 |
| ② | 安裝並註冊 GIIP 代理程式(隸屬於執行個體的 csn) | 在 lsvrdetail 中確認該 lssn 的 csn 與最近一次簽到 |
| ③ | 確認已回報 docker_usage | kvslist 中 kKey=<lssn>、kFactor=docker_usage 的最新列含 "dockerInstalled":true |
| ④ | 確認已顯示為候選 | Create 執行個體後,下拉清單中出現該伺服器 |
| ⑤ | 執行 [Provision now] | 參見方法 ②(遠端 Provision now) |
依作業系統安裝 Docker
| 作業系統 | 安裝對象 | 方法 |
|---|---|---|
| Windows | Docker Desktop | 從官方頁面 https://docs.docker.com/desktop/setup/install/windows-install/ 安裝,或使用 winget install -e --id Docker.DockerDesktop。需要 WSL 2 或 Hyper-V(啟用虛擬化)。 |
| macOS | Docker Desktop | 官方頁面 https://docs.docker.com/desktop/setup/install/mac-install/ |
| Linux | Docker Engine | 依官方文件 https://docs.docker.com/engine/install/ 中對應發行版的步驟安裝。安裝後將使用者加入 docker 群組(官方 "Linux post-installation steps"),重新登入後確認 docker version 能輸出伺服器版本。 |
安裝後 Docker 常駐程式必須處於執行狀態(Docker Desktop 需保持應用程式開啟)。
⚠️ 目前 Linux(Docker Engine)不會出現在候選清單中。 經確認,giipAgentLinux(origin/main)中沒有蒐集並回報
docker_usage的程式碼,只有 Windows 代理程式(giipAgentWin 的CollectDockerMetrics.ps1)會回報。因此在 Linux 伺服器上安裝 Docker 也不會成為下拉候選,此情況請使用**方法 ①(手動)**啟動。
候選判定條件(Windows 代理程式)
Windows 代理程式每次執行都會檢查 docker CLI 是否在 PATH 中,當 docker version --format '{{.Server.Version}}' 回傳伺服器版本時回報 dockerInstalled=true。CLI 不存在或常駐程式未執行時為 false。
安裝 GIIP 代理程式
代理程式安裝請參照以下指南,而非本文件。代理程式必須隸屬於建立執行個體時所用的 csn。
🤖 AI 代理程式連線手冊(Provision now 目標伺服器未顯示時)
AI 代理程式代替人員「將此 PC 連線為 Docker 執行個體目標」時遵循的步驟。所有步驟皆為唯讀,請直接查詢數值,不要猜測。
提示訊息的意義
「此 csn 中尚未偵測到 Docker Desktop 的伺服器」不是錯誤,而是候選清單為空。要成為候選,必須同時滿足以下三點:
- 伺服器(lssn)屬於建立該執行個體的 csn。
- 該伺服器的 GIIP 代理程式已回報
docker_usage,且最新值包含"dockerInstalled":true。 - 候選清單 API(
DockerCapableLsvrList)已在伺服器上部署。
1. 找出目標 PC 的 lssn 與 csn
- 從代理程式設定檔
giipAgent.cfg讀取lssn(不要輸出sk的值)。Windows 代理程式請從工作排程器GIIP Agent Task (v3)的執行路徑找到資料夾,並查看其上層資料夾中的giipAgent.cfg。 - 在 GIIP 網頁 lsvrdetail 中確認該 lssn 的 csn,必須與建立執行個體的 csn 相同。
2. 檢查代理程式與 Docker 運作
- Windows:
Get-ScheduledTask 'GIIP Agent Task (v3)' | Get-ScheduledTaskInfo中LastTaskResult應為 0(成功)或 267009(執行中)。 - 代理程式記錄中每次執行都應有
[CollectDockerMetrics] ... Successfully collected and uploaded Docker resource usage。 - Docker Desktop 必須處於執行狀態。確認
docker version能輸出到伺服器版本。
3. 檢查已回報的 Docker 使用量
在 GIIP 網頁 kvslist 中以 kKey=<lssn>、kFactor=docker_usage 查詢。最新一列包含 "dockerInstalled":true 才會成為候選。若沒有或為 false,請回到第 2 步。
4. 一切正常但清單仍為空(管理員)
表示候選清單 API 未部署。以前這種情況也會顯示相同的提示,因而掩蓋原因;現在頁面會顯示「候選清單 API 回應異常」錯誤。管理員需確認預存程序 pApiDockerCapableLsvrListbyAK 是否存在,若不存在,請以 mgmt/execSQLFile.ps1 部署 giipdb 的 SP/pApiDockerCapableLsvrListbyAK.sql。
5. 沒有可連線的伺服器時
- 目標 PC 上沒有 GIIP 代理程式時無法使用 [Provision now]。請先安裝並註冊代理程式,或使用手動流程 ①。
- 代理程式從未連線過的 lssn(最後簽入為空)不是候選。建立執行個體時預先註冊的 lssn 就屬於這種情況,請不要選作目標。
AI 必須遵守
- 不輸出或記錄
sk、執行個體權杖以及佇列腳本內容中的權杖。 - 不使用其他 csn 的 SK 進行查詢或寫入(先確認 csn)。
- 不猜測數值,僅依據上述查詢結果回報。
🤖 僅向 AI 代理程式傳遞本文件 URL 的情況
即使使用者只把本文件的 URL(https://giip.littleworld.net/zh-TW/guides/docker-instances,原文為 https://giip.littleworld.net/help/docker-instances.zh-TW.md)交給 AI 代理程式,AI 也可以依以下順序新增目標伺服器。
使用者需要提供:① 工作 csn(建立執行個體所用的 csn)② 存取目標 PC/伺服器的方式(AI 是否直接在該 PC 上執行,或是遠端連線)。
- 先做唯讀檢查。 確認目標 PC 的作業系統、Docker 安裝與常駐程式狀態(
docker version)、GIIP 代理程式的安裝與執行狀態,以及giipAgent.cfg中的 lssn(不要輸出sk)。 - 只安裝/設定缺少的步驟。 對「如何新增目標伺服器」中①~③裡已滿足的步驟不做變更。安裝會變更使用者的 PC,因此執行前先向使用者說明將安裝什麼。
- 不要猜測 csn。 在 lsvrdetail 中確認該 lssn 的 csn,並確認與建立執行個體所用的 csn 一致。
- 確認已顯示為候選後再回報。 在 kvslist 的
docker_usage中確認"dockerInstalled":true,並確認建立執行個體後下拉清單中出現該候選。對於 Linux 伺服器這類結構上無法成為候選的情況,回報這一事實以及方法 ①(手動)。
AI 必須遵守的事項與上文「AI 必須遵守」相同(不輸出 sk 與執行個體權杖,不使用其他 csn 的 SK,不猜測)。
💡 注意事項
- Last fetched ≠ 即時存活狀態: Last fetched 是「最後獲取 env 的時間」。容器停止後該值保持不變。即時狀態請查看 lsvrlist 心跳。
- Revoke 不會刪除列: Revoke 僅使權杖失效,不會刪除列表列。作為稽核記錄,
Revoked徽章會保留在列表中。 - Revoke 不會停止執行中的容器。 如需停止,必須在目標 PC 上執行
docker compose down。 - 容器名稱: 手動流程 ① 與既有執行個體使用
giip-fde-agent。[Provision now] 會為每個執行個體以giip-fde-agent-<diSn>(compose 專案giip-fde-<diSn>)啟動,因此一台 PC 可以執行多個執行個體。diSn 可在清單的 diSn 欄中查看。
問題解決
| 症狀 | 原因 | 解決方法 |
|---|---|---|
| 出現「此 csn 中尚未偵測到 Docker Desktop 的伺服器」 | (a) 目標 PC 的代理程式未執行或 Docker Desktop 已關閉,沒有 docker_usage (b) 伺服器的 csn 與執行個體的 csn 不同 (c) 候選清單 API 未部署到伺服器 | 請依下方「AI 代理程式連線手冊」第 1~4 步檢查。要立即繼續,請使用手動流程 ①。 |
| 未複製權杖 | 無法重新取得 | Revoke 現有執行個體並重新建立。 |
docker compose up 成功但 lsvrlist 中無顯示 | (a) GIIP_ENABLE_AGENT=false (b) GIIP_SK 為空 (c) 首次輪詢尚未發生 (d) 認證錯誤(401) | 檢查 docker logs 中 /work/giipAgentLinux/log/cron.log 的 401 錯誤 |
/work/giipAgentLinux 下只有 log/,看起來像「空殼 clone」 | 跳過代理區塊(GIIP_SK 未解析或 GIIP_ENABLE_AGENT=false)啟動後的痕跡。正常 clone 時根目錄有 .git+7 個目錄,ls -la 的連結數為 10;觀測值 3(.+..+單個 log/)表示只建立了日誌目錄而非 clone | 在 docker logs 中透過 skipping giip agent 與 [entrypoint] summary: 區塊的 giip agent: off (原因) 判定原因(通常為 GIIP_SK 未解析/權杖 fetch 失敗)。修復原因並重啟後,最新 entrypoint 會將殘留移至 .bak-<時間戳> 後自動重新 clone(giip #2855)。舊映像(此修復之前)需人工刪除磁碟區內該目錄才能解除 not an empty directory 拒絕 |
| 每次重啟都註冊新的 lssn | /work 磁碟區已遺失 | 確認 docker-compose.yml 的磁碟區是否對應到 giip-fde-agent-data:/work(整個 /work 持續化) |
| [Provision now] 失敗 | 頁面顯示的原因:Forbidden: not a member of the instance csn / ...target server csn(不是該 csn 的成員)、Target server has not reported Docker Desktop(目標從未回報 Docker — 請檢查代理程式與 Docker Desktop)、still pending(上一個請求仍在等待 — 約 5 分鐘後重試)、Docker instance is revoked / not found(執行個體已撤銷或不存在) | 請依顯示的原因處理。要立即繼續,請使用手動步驟 ①(docker compose up)。權杖仍然有效。 |
| [Provision now] 顯示成功訊息,但幾分鐘後 lsvrlist 和容器都沒有任何變化 | (a) 目標 lssn 的代理已停止,從一開始就沒有輪詢 (b) 僅此排程被隔離為無法配發(BLOCKED)(giip #2557 類問題) | (a) 在 lsvrdetail 中確認該 lssn 的最後簽到時間 — 若已過期,先排查目標 PC 的代理/網路 (b) 請管理員依該 lssn/csn 確認是否有無法配發的排程。等待數分鐘仍無反應則改用步驟①(手動) |
| Slack 機器人未啟動 | 需要 SLACK_BOT_TOKEN 和 SLACK_APP_TOKEN 同時提供 | 缺少任一權杖則兩者均跳過。 |
| 存取時立即跳轉首頁 | uLevel 低於 70 | 使用管理員帳戶(70+)登入。 |
版本: 1.3
最後更新: 2026-10-15(新增「如何新增目標伺服器」與「僅向 AI 代理程式傳遞本文件 URL 的情況」)
源檔案: giipv3/public/help/docker-instances.zh-TW.md