跳到主要内容

第 8 课:通过宝塔安装并配置 MySQL

第三阶段 · 阿里云 ECS 与宝塔面板 · 面向 macOS 和 Windows 的 Docker 初学者

本课完成标准​

你能够:

  • 通过宝塔安装或确认 MySQL;
  • 创建 student_db 数据库;
  • 创建只服务于应用的 student_app 用户;
  • 保存连接配置;
  • 解释为什么不使用 root、为什么不开放 3306。

1. 先理解数据库放在哪里​

FastAPI 容器
│ 内部网络连接
▼
ECS 上的 MySQL(由宝塔安装和管理)

MySQL 不在本地电脑,也不在 FastAPI 镜像里。它运行在 ECS 主机上,由宝塔软件商店安装、启动和管理。后续容器通过主机网络地址访问它。

**重要:**容器里的 127.0.0.1 指向容器自己,不是 ECS 主机。容器连接主机 MySQL 的具体地址会在第 13 课专门处理。

2. 在宝塔确认或安装 MySQL​

  1. 登录宝塔面板,打开“软件商店”;
  2. 搜索 MySQL,选择项目要求的稳定版本;
  3. 点击安装,等待任务完成;
  4. 确认软件状态显示运行中;
  5. 记录 MySQL 版本,后续排错时需要。

如果服务器已经有 MySQL,不要重复安装。先查看现有服务和版本,再决定是否使用它。

# 在 ECS 终端查看版本(如果命令可用)
mysql --version

**不要把数据库安装到 Docker 中。**本课程的数据库由宝塔管理,FastAPI 才运行在 Docker 容器里,避免重复维护两套 MySQL。

3. 创建 student_db 数据库​

在宝塔的“数据库”入口点击“添加数据库”,填写:

字段建议值说明
数据库名student_db与项目配置保持一致
字符集utf8mb4支持中文和更多 Unicode 字符
排序规则面板推荐的 utf8mb4 规则先保持默认稳定配置
备注student management production帮助你识别用途

数据库名是逻辑名称,不等于 Linux 文件夹,也不需要在 GitHub 中创建同名目录。

4. 创建专用数据库用户​

不要让 FastAPI 使用 MySQL root 账号。为应用创建独立账号:

字段示例原则
用户名student_app不要使用 root
密码密码管理器生成的长随机密码不要与其他密码相同
数据库权限只授权 student_db最小权限原则
访问来源按第 13 课的容器网络确定不要无理由扩大为全网

在宝塔添加数据库时,如果页面提供“创建同名数据库用户并授权”,可以直接使用;否则先创建数据库,再创建用户并授权给 student_db。

**不要把密码写进代码。**密码只保存到生产环境的 .env 或服务器密码管理方案中,不提交 GitHub,不放在 Dockerfile 里。

5. 保存连接配置,但先不要急着填 HOST​

先准备配置清单:

DB_NAME=student_db
DB_USER=student_app
DB_PASSWORD=请使用你的随机密码
DB_PORT=3306
DB_HOST=第13课确定

DB_HOST 暂时不填写死。因为 Docker 容器访问 ECS 主机的地址,取决于当前网络配置、Compose 写法和 MySQL 监听地址。第 13 课会从容器内部测试并确定正确值。

6. 为什么不开放公网 3306?​

3306 是 MySQL 的默认端口。生产环境中,FastAPI 和 MySQL 都在同一台 ECS 内部通信,不需要让互联网直接连接数据库。

错误做法风险正确方向
安全组开放 3306 到 0.0.0.0/0数据库暴露在互联网扫描和攻击下删除公网入方向规则
FastAPI 使用 root应用漏洞可能获得全部数据库权限使用 student_app
密码写进 GitHub提交历史中长期暴露凭据使用 .env 和密码管理器
从本地电脑直接连生产库扩大攻击面并绕过应用权限优先通过 SSH 隧道或宝塔管理

7. 在宝塔检查数据库状态​

完成后请在宝塔记录:

[ ] MySQL 软件状态为运行中
[ ] 版本号已记录
[ ] 数据库名为 student_db
[ ] 应用用户为 student_app
[ ] 用户已授权 student_db
[ ] 密码已保存到密码管理器
[ ] 安全组没有公网 3306
[ ] 没有把密码提交到 GitHub

不要在聊天中发送真实密码或完整数据库连接串。提问时可以把密码替换成 ******。

8. 一分钟自测​

问题 1:FastAPI 为什么不应该使用 MySQL root?

  • A. 应用只需要 student_db 的最小权限
  • B. root 不能创建表
  • C. Docker 不支持 root

问题 2:为什么 3306 不开放公网?

  • A. FastAPI 与 MySQL 可以在 ECS 内部通信
  • B. MySQL 只能使用 80 端口
  • C. 宝塔不支持数据库

答案:1A,2A。

本课通关证据​

数据库:student_db
用户:student_app
端口:3306(无公网入方向规则)
状态:MySQL 运行中

完成标准:宝塔能看到 student_db,专用用户已经授权,3306 没有公网入方向规则,数据库密码没有进入 GitHub。

如果遇到错误,请贴宝塔软件状态、完整命令和完整输出,并隐藏密码、Token 和私钥。


← 第 7 课:通过宝塔安装 Docker · 第 9 课:GitHub 版本控制 →

课程推荐

想系统学习这门课程?

你已阅读完本文。需要更完整的知识体系,可以继续了解「Vibe Coding 实战课程」。

查看课程详情