零基础入门: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 的核心理念就是“环境隔离”和“数据分离”。理解了端口映射让你明白数据怎么流转,理解了反向代理让你懂得如何优雅地对外提供服务,理解了持久化挂载让你不再畏惧重装与迁移。






