切換選單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。

零基礎入門:VPS Docker 部署與容器網絡全指南(埠映射 / 反向代理 / 持久化)

出自md5.pw
這是此頁面最近一次修訂;沒有已批准修訂。

對於剛接觸 VPS(虛擬專用伺服器)的新手來說,如何在伺服器上部署各種好玩的應用(如博客、網盤、密碼管理器等)是一個蠻大的挑戰。傳統的部署方式需要手動配置運行環境(如 PHP、Node.js、資料庫),不僅繁瑣,而且極易因為環境衝突導致系統崩潰。

Docker 的出現徹底改變了這一現狀。 你可以把 Docker 想像成港口裡的「貨櫃」。無論裡面裝的是什麼貨物(Web 應用、資料庫、緩存),都用標準化的貨櫃打包好。船隻(你的 VPS)不需要關心裏面裝了什麼,只需要提供放置貨櫃的空間即可。這種「隔離」和「開箱即用」的特性,讓部署服務變得像搭積木一樣簡單。

接下來的內容會為你提供一份保姆級的 Docker 部署指南,深入淺出地講解 Docker 安裝、網絡配置、埠映射、反向代理以及數據持久化等核心知識,帶你玩轉 VPS 部署。


一、 環境準備與 Docker 基礎部署

在開始之前,請確保你已經通過 SSH 連接到了你的 VPS,並且使用的是一台基於 Linux(推薦 Ubuntu 20.04/22.04 或 Debian 11/12)的作業系統。

1.1 更新系統環境

在安裝任何新軟體之前,保持系統軟體包的最新是一個良好的習慣。請依次執行以下命令:

# 更新软件包列表并升级已有软件
sudo apt update && sudo apt upgrade -y

# 安装一些必备的系统工具
sudo apt install curl wget vim git iptables -y

1.2 一鍵安裝 Docker 與 Docker Compose

早年間安裝 Docker 需要配置許多依賴和密鑰,現在官方提供了一鍵安裝腳本,極大地方便了新手。Docker Compose 則是 Docker 的一個編排工具,它允許我們使用一個 YAML 文件來定義和運行多個容器,這是目前最推薦的部署方式。

執行以下命令即可全自動安裝 Docker 以及 Docker Compose 插件:

# 下载官方一键安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh

# 执行脚本进行安装(如果是国内服务器,可能需要配置镜像源,海外 VPS 直接运行即可)
sudo sh get-docker.sh

# 启动 Docker 服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

驗證是否安裝成功:

<# 查看 Docker 版本
docker --version
# 输出示例:Docker version 29.2.1, build a5c7197

# 查看 Docker Compose 版本
docker compose version
# 输出示例:Docker Compose version v5.0.2

提示: 如果你是以普通用戶身份登錄,每次運行 docker 都需要加 sudo,你可以通過命令 sudo usermod -aG docker $USER 將當前用戶加入 docker 組,退出重新登錄後即可免 sudo 執行 docker 命令。


二、 核心概念:數據持久化 (Volumes)

新手最容易犯的一個致命錯誤是:把容器當成了虛擬機,把數據直接寫在容器內部。

容器被設計為「用完即焚」的短暫存在。當你更新容器或刪除容器重新創建時,容器內部的一切數據(比如博客的文章、資料庫的記錄)都會灰飛煙滅。因此,我們需要使用**數據持久化(Data Persistence)**技術。

這就好比你租了一個酒店房間(容器),你不能把自己的貴重物品(數據)砌進酒店的牆裡,而是應該放在自己的行李箱(持久化目錄)里。換房間時,行李箱提走即可。

2.1 常見的兩種掛載方式

  1. Bind Mounts(綁定掛載):將宿主機(你的 VPS)上的絕對路徑目錄,直接映射到容器內的某個目錄。
    • 優點:非常直觀,你可以直接在 VPS 上用 cd 命令進入目錄修改文件。
    • 適用場景:配置文件的修改、新手入門。
  2. Volumes(命名卷):由 Docker 完全管理的存儲空間,存放在宿主機的一個神秘位置(通常在 /var/lib/docker/volumes/)。
    • 優點:安全性高,跨平台兼容性好。
    • 適用場景:資料庫的數據文件存放。

2.2 實戰舉例:持久化部署一個 MySQL

我們通過 docker-compose.yml 文件來演示如何進行目錄掛載。創建一個目錄並編寫配置:

mkdir -p ~/mysql-test && cd ~/mysql-test
nano docker-compose.yml

填入以下內容:

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: my_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: my_secure_password
      MYSQL_DATABASE: my_database
    volumes:
      # 【关键点:这里就是数据持久化】
      # 冒号左边是宿主机目录(./data代表当前目录下的data文件夹)
      # 冒号右边是容器内的默认数据路径
      - ./data:/var/lib/mysql
      - ./config/my.cnf:/etc/mysql/my.cnf

保存並運行:

docker compose up -d

此時,即使你執行 docker compose down 刪除了這個容器,只要 ~/mysql-test/data 文件夾還在,下次啟動時所有的資料庫內容依然完好無損!


三、 容器網絡與埠映射 (Port Mapping)

理解埠映射,是掌控 Docker 部署的靈魂。

3.1 為什麼需要埠映射?

默認情況下,Docker 里的容器運行在一個獨立的虛擬網絡中。你可以把它想像成 VPS 內部的一棟「大樓」。VPS 宿主機有一個公網 IP(外界能訪問的門牌號),但大樓里的容器只有內部 IP(比如 172.17.0.2),外界是進不去的。

如果容器里運行了一個網頁伺服器(監聽容器的 80 埠),我們要讓外界通過 VPS 的公網 IP 訪問到它,就需要在大堂設立一個「前台轉發」,把對宿主機某個埠的訪問,直接引流到容器的對應埠。

3.2 埠映射的語法與陷阱

docker run 命令中,使用 -p 參數;在 Compose 文件中,使用 ports 欄位。 基本語法為:宿主机端口:容器内端口

示例解析:

    ports:
      - "8080:80" 

這表示:將 VPS 宿主機的 8080 埠,映射到該容器的 80 埠。當你在瀏覽器輸入 http://你的公网IP:8080 時,你實際訪問的是容器內的 80 埠。

新手常見安全陷阱:UFW 防火牆失效

在 Ubuntu 等系統上,大家習慣用 ufw 來配置防火牆。但 Docker 的埠映射會直接修改 iptables 規則,優先級高於 UFW! 這意味著,如果你映射了 -p 3306:3306(公開資料庫埠),即使你在 UFW 里設置了 ufw deny 3306,外界依然可以直接連上你的資料庫,非常危險!

正確做法(本地綁定): 如果這個埠你打算稍後用反向代理來處理,不需要直接暴露給全世界,應該這樣寫:

    ports:
      - "127.0.0.1:8080:80" 

加上 127.0.0.1: 前綴後,這個 8080 埠將只允許 VPS 本地訪問,徹底切斷了外界直接通過 IP 訪問的路徑,極大提升了安全性。


四、 進階必學:反向代理入門與實戰 (Nginx Proxy Manager)

新手往往會在埠上產生困擾:「我部署了博客用了 8080 埠,部署了相冊用了 8081 埠,部署了網盤用了 8082 埠……我怎麼可能記住這麼多埠號?而且瀏覽器上帶埠號顯得很不專業,也沒有 HTTPS 小綠鎖!」

這時候,反向代理(Reverse Proxy) 就登場了。

反向代理就像是一家大公司的「總機接線員」。它獨自霸占著 VPS 的 80 (HTTP) 和 443 (HTTPS) 埠。 當你訪問 blog.yourdomain.com 時,總機一看域名,直接內部轉接給 8080 埠的容器; 當你訪問 cloud.yourdomain.com 時,內部轉接給 8082 埠的容器。

業界最適合新手的一款可視化反向代理工具叫 Nginx Proxy Manager (簡稱 NPM)。

4.1 部署 Nginx Proxy Manager

創建一個目錄並編寫 Compose 文件:

mkdir -p ~/npm && cd ~/npm
nano docker-compose.yml

填入以下內容:

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm_app
    restart: unless-stopped
    ports:
      # NPM 本身需要监听外部的 80 和 443 端口
      - '80:80'
      - '443:443'
      # 这个是 NPM 的 Web 后台管理界面端口
      - '81:81'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

啟動 NPM:

docker compose up -d

4.2 配置反向代理與申請 SSL 證書

  1. 瀏覽器訪問 http://你的VPS_IP:81 進入後台管理界面。
  2. 默認帳號:admin@example.com (填你自己cloudflare帳號郵箱),密碼:changeme(改成你自己记得住的密码)
  3. 去你的域名服務商(如 Cloudflare, 阿里雲, 騰訊雲)處,將你的子域名(例如 npm.yourdomain.com)解析(A記錄)到你的 VPS 公網 IP 上。
  4. 在 NPM 後台點擊 Hosts -> Proxy Hosts -> Add Proxy Host
    • Domain Names: 填入你的域名 npm.yourdomain.com
    • Forward Hostname / IP: 填入你伺服器內部的應用 IP。如果你的docker和 NPM 在同一台 VPS 上,這裡通常填入宿主機內網 IP(例如 172.17.0.1 或者你的網卡內網IP、也可以直接填這台伺服器的公網IP)。
    • Forward Port: 填入你npm容器暴露的埠(例如 8080)。
    • 勾選 Block Common Exploits
  5. 點擊頂部的 SSL 選項卡:
    • SSL Certificate 下拉選擇 Request a new SSL Certificate
    • 勾選 Force SSL(強制 HTTPS)。
    • 輸入郵箱,同意條款,點擊 Save


等待十幾秒鐘,申請成功後,你就可以直接通過 https://npm.yourdomain.com 極其優雅地訪問你的服務了!不僅沒有難看的埠號,還附帶了安全的 HTTPS 加密連接。



五、 新手避坑與日常運維注意事項

成功部署只是第一步,良好的運維習慣才能保證服務的長期穩定運行。以下總結了 VPS 新手在使用 Docker 時最容易踩坑的幾個注意事項:

5.1 資源管理與清理(防止硬碟爆滿)

容器頻繁更新會產生大量的「懸空鏡像」(dangling images),這些無用的文件會靜悄悄地吃掉你 VPS 可憐的硬碟空間,最終導致資料庫損壞或系統死機。

定期執行清理命令(安全操作):

# 清理所有停止的容器、未被使用的网络和悬空镜像
docker system prune -f

# 如果你的硬盘空间极其紧张,还可以清理所有未被使用的镜像(慎用,会删掉你暂时没运行的镜像,下次需要重新下载)
docker system prune -a -f

建議將此命令加入 Linux 的 crontab 計劃任務中,每周自動執行一次。

5.2 查看日誌排錯

如果你啟動容器後,發現網頁打不開,或者容器一直處於 Restarting 狀態,不要慌張。日誌是解決一切問題的根源。

# 查看某个容器的实时日志(把容器名替换为你自己的)
docker logs -f 容器名称或ID

# 如果日志太多,只看最后100行
docker logs --tail 100 -f 容器名称或ID

通常日誌里的 ERRORFATAL 級別的信息,能直接告訴你是因為權限不對、埠衝突還是資料庫連不上等原因。複製報錯信息去 Google,能解決 99% 的問題。

5.3 備份策略:

雖然我們把數據掛載到了宿主機(比如前文演示的 ./data 目錄),但這不代表數據絕對安全。如果你的 VPS 欠費被刪機器、或者硬碟發生了物理損壞,數據依然會丟失。

極簡備份思路: 只需要打包備份你掛載的持久化目錄即可。例如:

# 将 NPM 的数据目录打包成压缩文件
tar -czvf npm_backup_20231024.tar.gz /root/npm/data /root/npm/letsencrypt

隨後,利用 scprsync 或配置自動化腳本(如 Rclone)將這個壓縮包定期上傳到你的 Google Drive、OneDrive 或另一台伺服器上。只要這份配置和數據文件在,無論換哪台機器,拉取鏡像 -> 解壓目錄 -> 執行 docker compose up -d,你的服務能在兩分鐘內滿血復活。

5.4 容器更新升級

很多新手部署完之後,幾年的時間都不去更新應用版本。在 Docker 中更新容器其實非常簡單,無需破壞任何數據:

# 1. 进入你的 docker-compose.yml 所在目录
cd ~/你的应用目录

# 2. 拉取最新的镜像文件
docker compose pull

# 3. 重新创建并启动容器(自动替换旧容器,数据因为挂载在外部不受影响)
docker compose up -d

# 4. 清理残留的旧版本镜像
docker image prune -f

結語

從剛接觸黑乎乎的命令行終端,到熟練運用 Docker 部署各類服務,這是一個充滿成就感的過程。

記住,Docker 的核心理念就是「環境隔離」和「數據分離」。理解了埠映射讓你明白數據怎麼流轉,理解了反向代理讓你懂得如何優雅地對外提供服務,理解了持久化掛載讓你不再畏懼重裝與遷移。