幾分鐘內啟用自架的 Docker VPS
容器跑在您自己掌控的伺服器上。訂購 Docker VPS,貼上 Docker 官方儲存庫的一段安裝指令,幾分鐘後就能執行第一次 docker compose up。
自架 Docker VPS 能做什麼
一台伺服器,能放多少容器就放多少。應用程式、資料庫、佇列與反向代理並肩執行,各自待在自己的容器裡,帶著各自的相依套件。
用一個檔案啟動整個應用堆疊
直接取用現成映像檔,不必從零架設
更新版本而不遺失資料
在一台伺服器上執行微服務架構
重新開機後自動恢復,無須人工介入
不用 root 權限執行 Docker
選擇 Docker VPS 主機代管方案
Docker Engine 本身占用很小,方案請依容器裡執行的內容來挑。我們建議從配備 2 個 CPU 核心和 2 GB RAM 的 Start VPS 開始。若要運行包含資料庫和反向代理的典型 Compose 技術棧,請選擇配備 4 GB RAM 的 Medium VPS。
提升您的 VPS 伺服器資源
看看如何變更您的 VPS 設定。您可以購買額外的磁碟空間、提升 CPU 效能、增加記憶體,以及利用額外的服務,而無需轉換新方案。
如何在 VPS 上部署 Docker
五個步驟,從乾淨的 Ubuntu VPS 到一套跑在 HTTPS 之後的 Docker 堆疊。
Step 01 — 訂購 VPS 並連線
選擇一台 Ubuntu VPS,據點盡量靠近您的使用者或容器要呼叫的外部 API,然後以 SSH 連線。以下指令都在 root shell 中執行。
ssh root@your-server-ip若已停用 root 直接登入,請以一般帳號連線後執行 sudo -i。
Step 02 — 安裝 Docker Engine 與 Compose
從 Docker 官方 apt 儲存庫安裝 Docker Engine 與 Compose 外掛:
apt updateapt install ca-certificates curlinstall -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg \ -o /etc/apt/keyrings/docker.ascchmod a+r /etc/apt/keyrings/docker.asc tee /etc/apt/sources.list.d/docker.sources <<EOFTypes: debURIs: https://download.docker.com/linux/ubuntuSuites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")Components: stableArchitectures: $(dpkg --print-architecture)Signed-By: /etc/apt/keyrings/docker.ascEOF apt updateapt install docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-pluginsystemctl enable --now dockerdocker run --rm hello-worldStep 03 — 將網域指向 VPS
建立 A 記錄,把應用程式網域指向這台 Docker VPS。Caddy 必須先能正確解析該網域,才能取得 HTTPS 憑證。
Type: AName: appValue: your-server-ip在伺服器防火牆與供應商控制台中,放行連接埠 80 與 443 的入站 TCP 流量。
Step 04 — 定義 Docker 堆疊
建立專案目錄:
mkdir -p /opt/docker-appcd /opt/docker-app建立 .env,並把範例值換成一組夠長、可安全放進 URL 的密碼:
POSTGRES_PASSWORD=replace-with-a-long-random-string建立 Caddyfile:
app.yourdomain.com { reverse_proxy app:8080}建立 compose.yaml。把 your-org/your-app:1.4.2 換成您的應用程式所使用的映像檔與版本。舊的 docker-compose.yml 檔名仍然可用。
services: app: image: your-org/your-app:1.4.2 restart: unless-stopped environment: DATABASE_URL: postgres://app:${POSTGRES_PASSWORD}@db:5432/app depends_on: db: condition: service_healthy db: image: postgres:16 restart: unless-stopped environment: POSTGRES_DB: app POSTGRES_USER: app POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - db-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U app -d app"] interval: 5s timeout: 5s retries: 10 caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config volumes: db-data: caddy-data: caddy-config:只有 Caddy 會在主機上公開連接埠。應用程式與資料庫僅在 Compose 的私有網路內可用。
Step 05 — 啟動堆疊
保護環境檔、啟動容器,並確認狀態:
chmod 600 .envdocker compose up -ddocker compose psCaddy 會自動取得並續發 HTTPS 憑證,同時把 HTTP 請求導向 HTTPS。容器重建時,具名 volume 會保留資料庫資料與 Caddy 憑證。
常見問題排除
- 應用程式在資料庫就緒前就啟動:單純的 depends_on 只保證啟動順序,不保證就緒。請替資料庫加上 health check,並以 condition: service_healthy 建立相依,如上所示。
- 已公開的連接埠會略過 ufw:Docker 在 nat 表中處理容器流量,早於 ufw 使用的鏈,因此即使 ufw 顯示為關閉,已公開的連接埠仍會回應。只公開代理;綁定到 127.0.0.1 同樣算是公開連接埠,只是限制在 loopback 介面。
- 部署途中開始拉取失敗:未驗證時,Docker Hub 每 6 小時允許每個 IPv4 位址或 IPv6 /64 子網 100 次拉取,免費 Personal 帳號則是每 6 小時 200 次。若某次部署會拉取大量映像檔,請先在伺服器上執行 docker login。
- 容器重建後資料不見了:存放在容器可寫入層的資料,會隨著容器被移除而消失。請把需要保留的資料放在具名 volume 或 bind mount。