零基礎入門:VPS Docker 部署與容器網絡全指南(端口映射 / 反向代理 / 持久化)
更多語言
更多操作
對於剛接觸 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 常見的兩種掛載方式
- Bind Mounts(綁定掛載):將宿主機(你的 VPS)上的絕對路徑目錄,直接映射到容器內的某個目錄。
- 優點:非常直觀,你可以直接在 VPS 上用
cd命令進入目錄修改文件。 - 適用場景:配置文件的修改、新手入門。
- 優點:非常直觀,你可以直接在 VPS 上用
- 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 證書
- 瀏覽器訪問
http://你的VPS_IP:81進入後台管理界面。 - 默認賬號:
admin@example.com(填你自己cloudflare賬號郵箱),密碼:changeme(改成你自己记得住的密码)
- 去你的域名服務商(如 Cloudflare, 阿里雲, 騰訊雲)處,將你的子域名(例如
npm.yourdomain.com)解析(A記錄)到你的 VPS 公網 IP 上。
- 在 NPM 後台點擊
Hosts->Proxy Hosts->Add Proxy Host。 - 點擊頂部的
SSL選項卡:- SSL Certificate 下拉選擇
Request a new SSL Certificate。 - 勾選
Force SSL(強制 HTTPS)。 - 輸入郵箱,同意條款,點擊
Save。
- SSL Certificate 下拉選擇

等待十幾秒鐘,申請成功後,你就可以直接通過 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
通常日誌里的 ERROR 或 FATAL 級別的信息,能直接告訴你是因為權限不對、端口衝突還是數據庫連不上等原因。複製報錯信息去 Google,能解決 99% 的問題。
5.3 備份策略:
雖然我們把數據掛載到了宿主機(比如前文演示的 ./data 目錄),但這不代表數據絕對安全。如果你的 VPS 欠費被刪機器、或者硬盤發生了物理損壞,數據依然會丟失。
極簡備份思路: 只需要打包備份你掛載的持久化目錄即可。例如:
# 将 NPM 的数据目录打包成压缩文件
tar -czvf npm_backup_20231024.tar.gz /root/npm/data /root/npm/letsencrypt
隨後,利用 scp、rsync 或配置自動化腳本(如 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 的核心理念就是「環境隔離」和「數據分離」。理解了端口映射讓你明白數據怎麼流轉,理解了反向代理讓你懂得如何優雅地對外提供服務,理解了持久化掛載讓你不再畏懼重裝與遷移。






