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