第 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
- 登录宝塔面板,打开“软件商店”;
- 搜索 MySQL,选择项目要求的稳定版本;
- 点击安装,等待任务完成;
- 确认软件状态显示运行中;
- 记录 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 和私钥。
想系统学习这门课程?
你已阅读完本文。需要更完整的知识体系,可以继续了解「Vibe Coding 实战课程」。
查看课程详情