阿里雲企業帳號註冊 使用Docker在阿裡雲伺服器上一鍵部署你的首個容器應用
第一章:把「一鍵部署」想清楚
很多人第一次接觸容器,最大的挫折不是 Docker 本身,而是「部署」這件事:你把程式打包好之後,還要在伺服器上安裝依賴、設定環境、開通網路、啟動服務、檢查是否成功。只要其中任一環節漏掉,整個流程就會變得像拼圖缺角。
所謂「一鍵部署」,本質上是把部署流程標準化。你需要先決定:
- 你的應用要以什麼方式被啟動(命令是什麼、端口是什麼、需要哪些環境變數)。
- 你的應用要怎麼被打包(Dockerfile 怎麼寫、映像名稱規則是什麼)。
- 你的部署要依賴哪些外部條件(伺服器已開哪些端口、是否需要登入私有映像倉庫)。
- 成功的判斷標準是什麼(容器是否在跑、健康狀態如何、頁面是否可回應)。
本文會以「一個簡單的 Web 應用容器」為例。你可以把它理解為你未來所有服務的模板:把你自己的程式替換進去,流程不變。
第二章:準備阿里雲伺服器與網路環境
2.1 建立 ECS(或你選擇的計算實例)
在阿里雲建立一台計算實例時,建議你至少滿足:能夠遠端連線(SSH)、有足夠的磁碟空間、網路帶寬能支撐你後續的映像拉取。具體規格看你應用複雜度,但如果只是第一個容器,入門型配置即可。
2.2 開放安全組:端口一定要想清楚
容器跑起來不等於你在外網看得到。你要確認兩層事情:
- 安全組(Security Group)是否允許入站到你的服務端口。
- 容器映射到主機的端口是否正確。
例如你在容器內用 80 端口提供 Web 服務,那你通常會在部署時做 -p 80:80 或 -p 8080:80 之類的映射。若你選擇暴露到 8080,就要確保安全組允許 8080 入站。
初學者常見錯誤是:容器端口映射做了,但安全組沒放行;或安全組放行了 80,結果部署映射的是 8080,兩邊永遠對不上。這也是為什麼「一鍵部署」更需要把端口配置寫死在腳本裡,避免人工手滑。
第三章:在伺服器上安裝 Docker
你可以用阿里雲提供的基礎映像或自行安裝。這裡重點是讓 Docker 可用,並讓你使用非 root 的方式操作(更安全)。
3.1 安裝 Docker 引擎
阿里雲企業帳號註冊 在主機中依你的作業系統選擇合適的安裝方式。無論你使用哪種方式,目標是達到:
docker --version能正常輸出版本。- 阿里雲企業帳號註冊
docker ps能列出容器列表。 - Docker 服務能在重啟後維持運行(可選,但建議)。
3.2 設定普通帳號使用 Docker(避免一直 sudo)
建議你把帳號加入 Docker 群組,這樣在部署腳本執行時不用反覆切 root。操作完成後重新登入或重新載入環境,再測試一次 docker ps 是否能正常使用。
第四章:撰寫你的第一個容器應用
你可以把應用想像成一個「輸入幾個參數,輸出一個 HTTP 回應」。部署時,只要能穩定回應,就算成功。
4.1 一個簡單的 Web 應用範例
阿里雲企業帳號註冊 假設你準備了一個簡單的 Node.js(或任何語言)服務。實務上,你的程式可能已經存在,這裡只是用來說明 Dockerfile 的目的。
核心需求是:
- 容器啟動時執行固定命令。
- 容器監聽固定端口(例如 80 或 3000)。
- 必要的環境變數可由部署腳本注入。
4.2 Dockerfile:把構建做成可重現的步驟
Dockerfile 的好處是你不必記憶每個步驟。你要做的是把「從程式碼到映像」寫清楚,讓任何地方執行 docker build 都得到一致結果。
下面用一個示意 Dockerfile(你可依你的程式語言替換)來說明結構:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
ENV PORT=80
EXPOSE 80
CMD ["node", "server.js"]
你需要確保:
EXPOSE的端口與你的服務實際監聽一致。CMD的啟動指令是你預期的。
4.3 映像命名規則:讓一鍵腳本更簡單
建議你統一使用類似 registry/user/app:tag 的命名方式。即使你先不推送到映像倉庫,腳本也能預留位置。例如:
- 映像名:
myapp - tag:
latest或v1
當你後續要升級版本,腳本只要改 tag,不需要重寫流程。
第五章:建立「一鍵部署」腳本的思路
真正的一鍵部署,不是把所有事情都塞進一段巨型指令,而是把流程拆成:建置、上傳(可選)、停舊容器、拉/建新映像、啟動容器、檢查狀態。你的使用者只需要一個指令。
阿里雲企業帳號註冊 5.1 一鍵部署腳本應該包含哪些步驟
- 確認 Docker 正常。
- 取得映像(本地 build 或從倉庫拉取)。
- 若舊容器存在,停止並移除(避免端口衝突)。
- 啟動新容器,設定端口映射、環境變數、掛載資料目錄。
- 檢查容器是否在跑,並給出訪問方式或提示。
5.2 避免踩坑:端口、名稱、重啟策略
這幾點如果做不好,你會覺得「一鍵部署不穩」。例如:
- 容器名稱固定:
--name myapp。否則你後續停止舊容器會抓錯。 - 端口固定:
-p 8080:80之類。你的安全組要與之匹配。 - 重啟策略:
--restart unless-stopped讓服務在重啟後自動恢復。
第六章:示範一鍵部署(Build + Run)
下面給出一份你可以直接放到伺服器上執行的腳本範例。它的前提是:你的程式碼或 Dockerfile 已在伺服器目錄下,或你已把目錄拷貝過來。
6.1 目錄結構建議
project/
Dockerfile
server.js
package.json
...
腳本放在 project 目錄同層或 project 內都可以,只要你使用一致路徑。
6.2 deploy.sh 範例腳本
把以下內容存成 deploy.sh,並賦予執行權限:
chmod +x deploy.sh
#!/usr/bin/env bash
set -e
APP_NAME='myapp'
IMAGE_NAME='myapp'
TAG='latest'
FULL_IMAGE_NAME="${IMAGE_NAME}:${TAG}"
HOST_PORT=8080
CONTAINER_PORT=80
# 設定你需要的環境變數(示例)
ENV_MODE='production'
echo '--- Checking docker ---'
docker --version > /dev/null
echo '--- Build image ---'
docker build -t "${FULL_IMAGE_NAME}" .
echo '--- Stop & remove old container if exists ---'
if docker ps -a --format '{{.Names}}' | grep -Eq "^${APP_NAME}$"; then
docker stop "${APP_NAME}" || true
docker rm "${APP_NAME}" || true
fi
echo '--- Run new container ---'
docker run -d \
--name "${APP_NAME}" \
--restart unless-stopped \
-p "${HOST_PORT}:${CONTAINER_PORT}" \
-e "NODE_ENV=${ENV_MODE}" \
"${FULL_IMAGE_NAME}"
echo '--- Done ---'
echo "Container: ${APP_NAME}"
echo "Visit: http://<YOUR_SERVER_IP>:${HOST_PORT}"
echo '--- Current logs (last 20 lines) ---'
docker logs --tail 20 "${APP_NAME}" || true
你只要進入伺服器,確保程式碼在目錄中,接著執行:
./deploy.sh
如果一切正確,你就會得到容器啟動狀態與最近的日誌。
6.3 第一版就先做「本地 build」,之後再升級
你可能會想:映像不是應該從雲端倉庫拉取嗎?可以。但第一階段為了省複雜度,我們先把「可跑起來」放第一位。
等你完成流程,第二階段再做:
- 把映像推送到映像倉庫(例如阿里雲的容器鏡像服務)。
- 部署腳本改成
docker pull,避免每次在伺服器 build。 - 阿里雲企業帳號註冊 加上映像加速與登入步驟,讓部署更快、更穩。
第七章:用資料持久化讓服務不會「一重啟就丟」
很多人第一次部署只做容器啟動就結束,但現實應用通常需要保存資料:上傳檔、資料庫檔案、快取、或某些應用需要的本地檔案。
容器的檔案系統是短暫的:容器被移除或重新建立後,容器內的資料就可能消失。所以你要把需要保留的目錄掛載到主機或使用資料卷(volume)。
7.1 用掛載資料卷(主機路徑示例)
例如你的應用需要把上傳檔寫到容器內 /data,你在主機建立一個目錄:
mkdir -p /data/myapp
然後在 docker run 增加:
-v /data/myapp:/data
這樣容器重建後,資料仍留在主機的 /data/myapp 中。
7.2 權限問題是常見地雷
如果你的應用在容器內以非 root 使用者運行,可能會遇到寫入權限不足。解法通常有兩種:
- 調整容器內使用者或啟動時權限。
- 調整主機掛載目錄的擁有者與權限。
你可以先用簡單方式驗證:進入容器檢查使用者(whoami 或看程式預設),再決定掛載目錄要給誰寫。
第八章:日誌、健康狀態與故障排查
阿里雲企業帳號註冊 一鍵部署的價值之一,是你能快速知道它到底成功了還是失敗了。失敗也不怕,怕的是你完全不知道錯在哪。
8.1 快速查看容器是否在跑
docker ps
你要確認容器狀態是 Up,而不是 Exited。
8.2 用日志定位錯誤
docker logs -n 100 myapp
如果你的服務啟動後立刻退出,通常日志會告訴你原因,例如:
- 程式缺少環境變數。
- 端口被占用或未正確監聽。
- 依賴套件或檔案不存在。
8.3 加上健康檢查(可選但建議)
你也可以在 Dockerfile 或 docker run 補上健康檢查。當健康狀態設置好,你未來做自動化運維會更省事。
健康檢查不是必須,但如果你已經把腳本整理好,補上這一層會讓系統更像「產品」而不是「實驗」。
第九章:從「能跑」到「更像工程」的下一步
部署能跑起來只是第一步。接下來你會遇到更現實的要求:版本管理、環境差異、快速回滾、安全性。
9.1 版本化:用 tag 對應程式版本
把 tag 從 latest 改成帶版本資訊,例如 v1.0.3。你可以在部署腳本中用參數控制:
- 部署 v1.0.3 就用對應 tag。
- 要回滾就部署前一版 tag。
阿里雲企業帳號註冊 9.2 環境變數:把配置從程式中抽離
例如資料庫連線字串、第三方 API Key,不要寫在程式碼裡。你可以在部署時透過 -e 注入,或使用環境文件。
初學階段用 -e 足夠,到了中後期再考慮:
- 環境文件(.env)
- 祕密管理(避免把敏感資訊寫進映像或版本庫)
9.3 映像加速:避免每次 build 都很慢
如果你使用的是預先 build 好的映像,就只需要拉取;如果你在伺服器上每次 build,速度取決於你能否順利拉到 base image 與依賴。
你可以考慮在 Docker daemon 或 build 配置中使用加速器(例如鏡像加速)。這在跨地域的情況下特別有感。
第十章:把你的流程固化成可重複的一鍵部署
當你完成前面步驟,你已經有了一鍵部署的雛形。但要真正讓它「可用在下一個專案」,你需要把變數也抽象出來。
10.1 把常量改成參數或配置
- 映像名稱與 tag
- 阿里雲企業帳號註冊 主機端口與容器端口
- 容器名稱
- 是否掛載資料卷
- 環境變數列表
做法可以是:腳本支援命令列參數,或讀取一個簡單配置檔。原則是:你不需要每次改程式碼,直接改配置即可。
10.2 在部署完成後給出明確輸出
你的腳本最後輸出最好包含:
- 容器是否存在、狀態是什麼
- 服務端口映射
- 最近日志
使用者看完輸出就知道下一步要做什麼,而不是猜。
結語:你已經跨過部署的門檻
用 Docker 在阿里雲伺服器上一鍵部署首個容器應用,真正學到的不是某條指令,而是把「部署」拆成穩定、可重現的流程。你已經完成了:
- 雲端主機環境的準備(網路與端口)。
- Docker 的基礎安裝與可用性驗證。
- 用 Dockerfile 將應用打包成可運行的映像。
- 用腳本將「建置、替換、啟動、檢查」串成一鍵操作。
- 理解資料持久化與常見故障排查方式。
下一個你要做的,就是把你的實際專案帶入同樣的模板:把程式碼換掉、調整端口與環境變數、必要時加入資料卷與健康檢查。當你能做到這一步,你就不再害怕部署,而是把部署當成日常工具。


