打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的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 的核心理念就是“环境隔离”和“数据分离”。理解了端口映射让你明白数据怎么流转,理解了反向代理让你懂得如何优雅地对外提供服务,理解了持久化挂载让你不再畏惧重装与迁移。