<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://md5.pw/index.php?action=history&amp;feed=atom&amp;title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_%2F_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_%2F_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89</id>
	<title>零基础入门：VPS Docker 部署与容器网络全指南（端口映射 / 反向代理 / 持久化） - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://md5.pw/index.php?action=history&amp;feed=atom&amp;title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_%2F_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_%2F_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89"/>
	<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_/_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_/_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89&amp;action=history"/>
	<updated>2026-04-28T15:28:34Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://md5.pw/index.php?title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_/_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_/_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89&amp;diff=1931&amp;oldid=prev</id>
		<title>2026年4月15日 (三) 01:23 Liam</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_/_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_/_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89&amp;diff=1931&amp;oldid=prev"/>
		<updated>2026-04-15T01:23:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年4月14日 (二) 18:23的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l231&quot;&gt;第231行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第231行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;记住，Docker 的核心理念就是&amp;#039;&amp;#039;&amp;#039;“环境隔离”和“数据分离”&amp;#039;&amp;#039;&amp;#039;。理解了端口映射让你明白数据怎么流转，理解了反向代理让你懂得如何优雅地对外提供服务，理解了持久化挂载让你不再畏惧重装与迁移。&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;记住，Docker 的核心理念就是&amp;#039;&amp;#039;&amp;#039;“环境隔离”和“数据分离”&amp;#039;&amp;#039;&amp;#039;。理解了端口映射让你明白数据怎么流转，理解了反向代理让你懂得如何优雅地对外提供服务，理解了持久化挂载让你不再畏惧重装与迁移。&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:500 常见应用指南 — Application Guides]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff:1.41:old-1551:rev-1931:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Liam</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_/_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_/_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89&amp;diff=1551&amp;oldid=prev</id>
		<title>Helen：​Docker部署及容器网络指南（端口映射、反向代理、持久化、注意事项）</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%EF%BC%9AVPS_Docker_%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%85%A8%E6%8C%87%E5%8D%97%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84_/_%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86_/_%E6%8C%81%E4%B9%85%E5%8C%96%EF%BC%89&amp;diff=1551&amp;oldid=prev"/>
		<updated>2026-03-13T04:35:07Z</updated>

		<summary type="html">&lt;p&gt;Docker部署及容器网络指南（端口映射、反向代理、持久化、注意事项）&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;对于刚接触 VPS（虚拟专用服务器）的新手来说，如何在服务器上部署各种好玩的应用（如博客、网盘、密码管理器等）是一个蛮大的挑战。传统的部署方式需要手动配置运行环境（如 PHP、Node.js、数据库），不仅繁琐，而且极易因为环境冲突导致系统崩溃。&lt;br /&gt;
&lt;br /&gt;
Docker 的出现彻底改变了这一现状。 你可以把 Docker 想象成港口里的“集装箱”。无论里面装的是什么货物（Web 应用、数据库、缓存），都用标准化的集装箱打包好。船只（你的 VPS）不需要关心里面装了什么，只需要提供放置集装箱的空间即可。这种“隔离”和“开箱即用”的特性，让部署服务变得像搭积木一样简单。&lt;br /&gt;
&lt;br /&gt;
接下来的内容会为你提供一份保姆级的 Docker 部署指南，深入浅出地讲解 Docker 安装、网络配置、端口映射、反向代理以及数据持久化等核心知识，带你玩转 VPS 部署。&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 一、 环境准备与 Docker 基础部署 ==&lt;br /&gt;
在开始之前，请确保你已经通过 SSH 连接到了你的 VPS，并且使用的是一台基于 Linux（推荐 Ubuntu 20.04/22.04 或 Debian 11/12）的操作系统。&lt;br /&gt;
&lt;br /&gt;
=== 1.1 更新系统环境 ===&lt;br /&gt;
在安装任何新软件之前，保持系统软件包的最新是一个良好的习惯。请依次执行以下命令：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 更新软件包列表并升级已有软件&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;br /&gt;
 &lt;br /&gt;
 # 安装一些必备的系统工具&lt;br /&gt;
 sudo apt install curl wget vim git iptables -y&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[File:Image1654.png|thumb|500x500px]]&lt;br /&gt;
![[File:Image1655.png|thumb|500x500px]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 1.2 一键安装 Docker 与 Docker Compose ===&lt;br /&gt;
早年间安装 Docker 需要配置许多依赖和密钥，现在官方提供了一键安装脚本，极大地方便了新手。Docker Compose 则是 Docker 的一个编排工具，它允许我们使用一个 &amp;lt;code&amp;gt;YAML&amp;lt;/code&amp;gt; 文件来定义和运行多个容器，这是目前最推荐的部署方式。&lt;br /&gt;
&lt;br /&gt;
执行以下命令即可全自动安装 Docker 以及 Docker Compose 插件：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 下载官方一键安装脚本&lt;br /&gt;
 curl -fsSL &amp;lt;nowiki&amp;gt;https://get.docker.com&amp;lt;/nowiki&amp;gt; -o get-docker.sh&lt;br /&gt;
 &lt;br /&gt;
 # 执行脚本进行安装（如果是国内服务器，可能需要配置镜像源，海外 VPS 直接运行即可）&lt;br /&gt;
 sudo sh get-docker.sh&lt;br /&gt;
 &lt;br /&gt;
 # 启动 Docker 服务并设置开机自启&lt;br /&gt;
 sudo systemctl start docker&lt;br /&gt;
 sudo systemctl enable docker&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[File:Image1656.png|thumb|400x400px]]&lt;br /&gt;
![[File:Image1657.png|thumb|400x400px]]&lt;br /&gt;
![[File:Image1658.png|thumb|400x400px]]&lt;br /&gt;
|}&lt;br /&gt;
验证是否安装成功：&lt;br /&gt;
 &amp;lt;# 查看 Docker 版本&lt;br /&gt;
 docker --version&lt;br /&gt;
 # 输出示例：Docker version 29.2.1, build a5c7197&lt;br /&gt;
 &lt;br /&gt;
 # 查看 Docker Compose 版本&lt;br /&gt;
 docker compose version&lt;br /&gt;
 # 输出示例：Docker Compose version v5.0.2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:Image1659.png|center|thumb|991x991px]]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;提示： 如果你是以普通用户身份登录，每次运行 &amp;lt;code&amp;gt;docker&amp;lt;/code&amp;gt; 都需要加 &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;，你可以通过命令 &amp;lt;code&amp;gt;sudo usermod -aG docker $USER&amp;lt;/code&amp;gt; 将当前用户加入 docker 组，退出重新登录后即可免 sudo 执行 docker 命令。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 二、 核心概念：数据持久化 (Volumes) ==&lt;br /&gt;
新手最容易犯的一个致命错误是：把容器当成了虚拟机，把数据直接写在容器内部。&lt;br /&gt;
&lt;br /&gt;
容器被设计为“用完即焚”的短暂存在。当你更新容器或删除容器重新创建时，容器内部的一切数据（比如博客的文章、数据库的记录）都会灰飞烟灭。因此，我们需要使用**数据持久化（Data Persistence）**技术。&lt;br /&gt;
&lt;br /&gt;
这就好比你租了一个酒店房间（容器），你不能把自己的贵重物品（数据）砌进酒店的墙里，而是应该放在自己的行李箱（持久化目录）里。换房间时，行李箱提走即可。&lt;br /&gt;
&lt;br /&gt;
=== 2.1 常见的两种挂载方式 ===&lt;br /&gt;
&lt;br /&gt;
# Bind Mounts（绑定挂载）：将宿主机（你的 VPS）上的绝对路径目录，直接映射到容器内的某个目录。&lt;br /&gt;
#* &amp;#039;&amp;#039;优点&amp;#039;&amp;#039;：非常直观，你可以直接在 VPS 上用 &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; 命令进入目录修改文件。&lt;br /&gt;
#* &amp;#039;&amp;#039;适用场景&amp;#039;&amp;#039;：配置文件的修改、新手入门。&lt;br /&gt;
# Volumes（命名卷）：由 Docker 完全管理的存储空间，存放在宿主机的一个神秘位置（通常在 &amp;lt;code&amp;gt;/var/lib/docker/volumes/&amp;lt;/code&amp;gt;）。&lt;br /&gt;
#* &amp;#039;&amp;#039;优点&amp;#039;&amp;#039;：安全性高，跨平台兼容性好。&lt;br /&gt;
#* &amp;#039;&amp;#039;适用场景&amp;#039;&amp;#039;：数据库的数据文件存放。&lt;br /&gt;
&lt;br /&gt;
=== 2.2 实战举例：持久化部署一个 MySQL ===&lt;br /&gt;
我们通过 &amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt; 文件来演示如何进行目录挂载。创建一个目录并编写配置：&lt;br /&gt;
 &amp;lt;code&amp;gt;mkdir -p ~/mysql-test &amp;amp;&amp;amp; cd ~/mysql-test&lt;br /&gt;
 nano docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1660.png|center|thumb|974x974px]]&lt;br /&gt;
填入以下内容：&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;version&amp;#039;&amp;#039;&amp;#039;: &amp;#039;3.8&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;services&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;db&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;image&amp;#039;&amp;#039;&amp;#039;: mysql:8.0&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;container_name&amp;#039;&amp;#039;&amp;#039;: my_mysql&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;restart&amp;#039;&amp;#039;&amp;#039;: always&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;environment&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;MYSQL_ROOT_PASSWORD&amp;#039;&amp;#039;&amp;#039;: my_secure_password&lt;br /&gt;
       &amp;#039;&amp;#039;&amp;#039;MYSQL_DATABASE&amp;#039;&amp;#039;&amp;#039;: my_database&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;volumes&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
       # 【关键点：这里就是数据持久化】&lt;br /&gt;
       # 冒号左边是宿主机目录（./data代表当前目录下的data文件夹）&lt;br /&gt;
       # 冒号右边是容器内的默认数据路径&lt;br /&gt;
       - ./data:/var/lib/mysql&lt;br /&gt;
       - ./config/my.cnf:/etc/mysql/my.cnf&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1662.png|center|thumb|969x969px]]&lt;br /&gt;
保存并运行：&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;docker compose up -d&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1663.png|center|thumb|978x978px]]&lt;br /&gt;
此时，即使你执行 &amp;lt;code&amp;gt;docker compose down&amp;lt;/code&amp;gt; 删除了这个容器，只要 &amp;lt;code&amp;gt;~/mysql-test/data&amp;lt;/code&amp;gt; 文件夹还在，下次启动时所有的数据库内容依然完好无损！&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 三、 容器网络与端口映射 (Port Mapping) ==&lt;br /&gt;
理解端口映射，是掌控 Docker 部署的灵魂。&lt;br /&gt;
&lt;br /&gt;
=== 3.1 为什么需要端口映射？ ===&lt;br /&gt;
默认情况下，Docker 里的容器运行在一个独立的虚拟网络中。你可以把它想象成 VPS 内部的一栋“大楼”。VPS 宿主机有一个公网 IP（外界能访问的门牌号），但大楼里的容器只有内部 IP（比如 &amp;lt;code&amp;gt;172.17.0.2&amp;lt;/code&amp;gt;），外界是进不去的。&lt;br /&gt;
&lt;br /&gt;
如果容器里运行了一个网页服务器（监听容器的 80 端口），我们要让外界通过 VPS 的公网 IP 访问到它，就需要在大堂设立一个“前台转发”，把对宿主机某个端口的访问，直接引流到容器的对应端口。&lt;br /&gt;
&lt;br /&gt;
=== 3.2 端口映射的语法与陷阱 ===&lt;br /&gt;
在 &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; 命令中，使用 &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt; 参数；在 Compose 文件中，使用 &amp;lt;code&amp;gt;ports&amp;lt;/code&amp;gt; 字段。 基本语法为：&amp;lt;code&amp;gt;宿主机端口:容器内端口&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==== 示例解析： ====&lt;br /&gt;
     &amp;lt;code&amp;gt;ports:&lt;br /&gt;
       - &amp;quot;8080:80&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
这表示：将 VPS 宿主机的 &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt; 端口，映射到该容器的 &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt; 端口。当你在浏览器输入 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://你的公网IP:8080&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 时，你实际访问的是容器内的 &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt; 端口。&lt;br /&gt;
&lt;br /&gt;
==== 新手常见安全陷阱：UFW 防火墙失效 ====&lt;br /&gt;
在 Ubuntu 等系统上，大家习惯用 &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; 来配置防火墙。但 Docker 的端口映射会直接修改 iptables 规则，优先级高于 UFW！ 这意味着，如果你映射了 &amp;lt;code&amp;gt;-p 3306:3306&amp;lt;/code&amp;gt;（公开数据库端口），即使你在 UFW 里设置了 &amp;lt;code&amp;gt;ufw deny 3306&amp;lt;/code&amp;gt;，外界依然可以直接连上你的数据库，非常危险！&lt;br /&gt;
&lt;br /&gt;
正确做法（本地绑定）： 如果这个端口你打算稍后用反向代理来处理，不需要直接暴露给全世界，应该这样写：&lt;br /&gt;
     &amp;lt;code&amp;gt;ports:&lt;br /&gt;
       - &amp;quot;127.0.0.1:8080:80&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
加上 &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;/code&amp;gt; 前缀后，这个 8080 端口将只允许 VPS 本地访问，彻底切断了外界直接通过 IP 访问的路径，极大提升了安全性。&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 四、 进阶必学：反向代理入门与实战 (Nginx Proxy Manager) ==&lt;br /&gt;
新手往往会在端口上产生困扰：“我部署了博客用了 8080 端口，部署了相册用了 8081 端口，部署了网盘用了 8082 端口……我怎么可能记住这么多端口号？而且浏览器上带端口号显得很不专业，也没有 HTTPS 小绿锁！”&lt;br /&gt;
&lt;br /&gt;
这时候，反向代理（Reverse Proxy） 就登场了。&lt;br /&gt;
&lt;br /&gt;
反向代理就像是一家大公司的“总机接线员”。它独自霸占着 VPS 的 &amp;lt;code&amp;gt;80&amp;lt;/code&amp;gt; (HTTP) 和 &amp;lt;code&amp;gt;443&amp;lt;/code&amp;gt; (HTTPS) 端口。 当你访问 &amp;lt;code&amp;gt;blog.yourdomain.com&amp;lt;/code&amp;gt; 时，总机一看域名，直接内部转接给 &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt; 端口的容器； 当你访问 &amp;lt;code&amp;gt;cloud.yourdomain.com&amp;lt;/code&amp;gt; 时，内部转接给 &amp;lt;code&amp;gt;8082&amp;lt;/code&amp;gt; 端口的容器。&lt;br /&gt;
&lt;br /&gt;
业界最适合新手的一款可视化反向代理工具叫 Nginx Proxy Manager (简称 NPM)。&lt;br /&gt;
&lt;br /&gt;
=== 4.1 部署 Nginx Proxy Manager ===&lt;br /&gt;
创建一个目录并编写 Compose 文件：&lt;br /&gt;
 &amp;lt;code&amp;gt;mkdir -p ~/npm &amp;amp;&amp;amp; cd ~/npm&lt;br /&gt;
 nano docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1664.png|center|thumb|978x978px]]&lt;br /&gt;
填入以下内容：&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;version&amp;#039;&amp;#039;&amp;#039;: &amp;#039;3.8&amp;#039;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;services&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;app&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;image&amp;#039;&amp;#039;&amp;#039;: &amp;#039;jc21/nginx-proxy-manager:latest&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;container_name&amp;#039;&amp;#039;&amp;#039;: npm_app&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;restart&amp;#039;&amp;#039;&amp;#039;: unless-stopped&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;ports&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
       # NPM 本身需要监听外部的 80 和 443 端口&lt;br /&gt;
       - &amp;#039;80:80&amp;#039;&lt;br /&gt;
       - &amp;#039;443:443&amp;#039;&lt;br /&gt;
       # 这个是 NPM 的 Web 后台管理界面端口&lt;br /&gt;
       - &amp;#039;81:81&amp;#039;&lt;br /&gt;
     &amp;#039;&amp;#039;&amp;#039;volumes&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
       - ./data:/data&lt;br /&gt;
       - ./letsencrypt:/etc/letsencrypt&amp;lt;/code&amp;gt;&lt;br /&gt;
[[File:Image1665.png|center|thumb|978x978px]]&lt;br /&gt;
启动 NPM：&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;docker compose up -d&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.2 配置反向代理与申请 SSL 证书 ===&lt;br /&gt;
&lt;br /&gt;
# 浏览器访问 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://你的VPS_IP:81&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 进入后台管理界面。&lt;br /&gt;
# 默认账号：&amp;lt;code&amp;gt;admin@example.com&amp;lt;/code&amp;gt; （填你自己cloudflare账号邮箱），密码：&amp;lt;code&amp;gt;changeme(改成你自己记得住的密码)&amp;lt;/code&amp;gt;[[File:Image1666.png|center|thumb|1037x1037px]]&lt;br /&gt;
# 去你的域名服务商（如 Cloudflare, 阿里云, 腾讯云）处，将你的子域名（例如 &amp;lt;code&amp;gt;npm.yourdomain.com&amp;lt;/code&amp;gt;）解析（A记录）到你的 VPS 公网 IP 上。[[File:Image1667.png|center|thumb|978x978px]]&lt;br /&gt;
# 在 NPM 后台点击 &amp;lt;code&amp;gt;Hosts&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Proxy Hosts&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Add Proxy Host&amp;lt;/code&amp;gt;。&lt;br /&gt;
#* Domain Names: 填入你的域名 &amp;lt;code&amp;gt;npm.yourdomain.com&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Forward Hostname / IP: 填入你服务器内部的应用 IP。如果你的docker和 NPM 在同一台 VPS 上，这里通常填入宿主机内网 IP（例如 &amp;lt;code&amp;gt;172.17.0.1&amp;lt;/code&amp;gt; 或者你的网卡内网IP、也可以直接填这台服务器的公网IP）。&lt;br /&gt;
#* Forward Port: 填入你npm容器暴露的端口（例如 &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;）。&lt;br /&gt;
#* 勾选 &amp;lt;code&amp;gt;Block Common Exploits&amp;lt;/code&amp;gt;。[[File:Image1668.png|center|thumb|1032x1032px]]&lt;br /&gt;
# 点击顶部的 &amp;lt;code&amp;gt;SSL&amp;lt;/code&amp;gt; 选项卡：&lt;br /&gt;
#* SSL Certificate 下拉选择 &amp;lt;code&amp;gt;Request a new SSL Certificate&amp;lt;/code&amp;gt;。&lt;br /&gt;
#* 勾选 &amp;lt;code&amp;gt;Force SSL&amp;lt;/code&amp;gt;（强制 HTTPS）。&lt;br /&gt;
#* 输入邮箱，同意条款，点击 &amp;lt;code&amp;gt;Save&amp;lt;/code&amp;gt;。&lt;br /&gt;
[[File:Image1669.png|center|thumb|1027x1027px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
等待十几秒钟，申请成功后，你就可以直接通过 &amp;lt;code&amp;gt;https://npm&amp;lt;nowiki/&amp;gt;.yourdomain.com&amp;lt;/code&amp;gt; 极其优雅地访问你的服务了！不仅没有难看的端口号，还附带了安全的 HTTPS 加密连接。&lt;br /&gt;
[[File:Image1670.png|center|thumb|1030x1030px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 五、 新手避坑与日常运维注意事项 ==&lt;br /&gt;
成功部署只是第一步，良好的运维习惯才能保证服务的长期稳定运行。以下总结了 VPS 新手在使用 Docker 时最容易踩坑的几个注意事项：&lt;br /&gt;
&lt;br /&gt;
=== 5.1 资源管理与清理（防止硬盘爆满） ===&lt;br /&gt;
容器频繁更新会产生大量的“悬空镜像”（dangling images），这些无用的文件会静悄悄地吃掉你 VPS 可怜的硬盘空间，最终导致数据库损坏或系统死机。&lt;br /&gt;
&lt;br /&gt;
定期执行清理命令（安全操作）：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 清理所有停止的容器、未被使用的网络和悬空镜像&lt;br /&gt;
 docker &amp;#039;&amp;#039;&amp;#039;system&amp;#039;&amp;#039;&amp;#039; prune -f&lt;br /&gt;
 &lt;br /&gt;
 # 如果你的硬盘空间极其紧张，还可以清理所有未被使用的镜像（慎用，会删掉你暂时没运行的镜像，下次需要重新下载）&lt;br /&gt;
 docker &amp;#039;&amp;#039;&amp;#039;system&amp;#039;&amp;#039;&amp;#039; prune -&amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039; -f&amp;lt;/code&amp;gt;&lt;br /&gt;
建议将此命令加入 Linux 的 &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt; 计划任务中，每周自动执行一次。&lt;br /&gt;
&lt;br /&gt;
=== 5.2 查看日志排错 ===&lt;br /&gt;
如果你启动容器后，发现网页打不开，或者容器一直处于 Restarting 状态，不要慌张。日志是解决一切问题的根源。&lt;br /&gt;
 &amp;lt;code&amp;gt;# 查看某个容器的实时日志（把容器名替换为你自己的）&lt;br /&gt;
 docker logs -f 容器名称或ID&lt;br /&gt;
 &lt;br /&gt;
 # 如果日志太多，只看最后100行&lt;br /&gt;
 docker logs --tail 100 -f 容器名称或ID&amp;lt;/code&amp;gt;&lt;br /&gt;
通常日志里的 &amp;lt;code&amp;gt;ERROR&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;FATAL&amp;lt;/code&amp;gt; 级别的信息，能直接告诉你是因为权限不对、端口冲突还是数据库连不上等原因。复制报错信息去 Google，能解决 99% 的问题。&lt;br /&gt;
&lt;br /&gt;
=== 5.3 备份策略： ===&lt;br /&gt;
虽然我们把数据挂载到了宿主机（比如前文演示的 &amp;lt;code&amp;gt;./data&amp;lt;/code&amp;gt; 目录），但这不代表数据绝对安全。如果你的 VPS 欠费被删机器、或者硬盘发生了物理损坏，数据依然会丢失。&lt;br /&gt;
&lt;br /&gt;
极简备份思路： 只需要打包备份你挂载的持久化目录即可。例如：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 将 NPM 的数据目录打包成压缩文件&lt;br /&gt;
 tar -czvf npm_backup_20231024.tar.gz /root/npm/data /root/npm/letsencrypt&amp;lt;/code&amp;gt;&lt;br /&gt;
随后，利用 &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;rsync&amp;lt;/code&amp;gt; 或配置自动化脚本（如 Rclone）将这个压缩包定期上传到你的 Google Drive、OneDrive 或另一台服务器上。只要这份配置和数据文件在，无论换哪台机器，拉取镜像 -&amp;gt; 解压目录 -&amp;gt; 执行 &amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt;，你的服务能在两分钟内满血复活。&lt;br /&gt;
&lt;br /&gt;
=== 5.4 容器更新升级 ===&lt;br /&gt;
很多新手部署完之后，几年的时间都不去更新应用版本。在 Docker 中更新容器其实非常简单，无需破坏任何数据：&lt;br /&gt;
 &amp;lt;code&amp;gt;# 1. 进入你的 docker-compose.yml 所在目录&lt;br /&gt;
 cd ~/你的应用目录&lt;br /&gt;
 &lt;br /&gt;
 # 2. 拉取最新的镜像文件&lt;br /&gt;
 docker compose pull&lt;br /&gt;
 &lt;br /&gt;
 # 3. 重新创建并启动容器（自动替换旧容器，数据因为挂载在外部不受影响）&lt;br /&gt;
 docker compose up -d&lt;br /&gt;
 &lt;br /&gt;
 # 4. 清理残留的旧版本镜像&lt;br /&gt;
 docker image prune -f&amp;lt;/code&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 结语 ==&lt;br /&gt;
从刚接触黑乎乎的命令行终端，到熟练运用 Docker 部署各类服务，这是一个充满成就感的过程。&lt;br /&gt;
&lt;br /&gt;
记住，Docker 的核心理念就是&amp;#039;&amp;#039;&amp;#039;“环境隔离”和“数据分离”&amp;#039;&amp;#039;&amp;#039;。理解了端口映射让你明白数据怎么流转，理解了反向代理让你懂得如何优雅地对外提供服务，理解了持久化挂载让你不再畏惧重装与迁移。&lt;/div&gt;</summary>
		<author><name>Helen</name></author>
	</entry>
</feed>