我最早接触 Superset 是给一个零售项目做内部数据看板,当时团队在 Tableau 的授权费用和自建报表平台之间反复拉扯。后来确认了 Apache Superset 这套开源方案,配合 Docker Compose 一整套部署下来,从环境准备到数据源接入,基本就是半个工作日的量。这个组合最舒服的地方在于:Docker Compose 把部署环境固化成代码,Superset 负责可视化,MySQL 的 Sakila 示例库提供了一个比 hello world 更有分析价值的业务数据集,三样东西拼在一起,正好构成一条从零开始搭建数据平台的完整链路。
这篇文章围绕“用 Docker Compose 部署 Superset 并连接 MySQL 的 Sakila 数据库”这条主线展开,适合三类人看:一类是想快速搭一套可视化平台做内部使用的开发或运维,一类是刚开始接触 Superset 但是被各种安装步骤劝退的数据分析师,还有一类是单纯想找个练手数据集把数分技能串起来的同学。文里所有步骤都是我自己实际跑过的版本,不是文档翻译,踩坑记录也会一并放出来。
1. 方案选型:为什么是 Docker Compose + Superset + Sakila 这个组合
1.1 三个组件各自解决什么问题
先花一分钟把方案里每个角色说清楚。Docker Compose 是本地和单机环境里编排多容器最顺手的工具,一条 docker compose up -d 就能把 MySQL、Superset 以及它们之间的网络依赖一起拉起来,省去了手工安装数据库、配置 Python 环境、处理依赖冲突的系列麻烦。对于部署 Superset 这种依赖一大堆的可视化平台,容器化几乎是当前最优解。
Superset 本身是 Airbnb 开源的数据可视化平台,后来捐给了 Apache 基金会。它支持直接连各种数据库,通过 SQL Lab 写查询,也能在图表设计界面拖拽维度和指标。比起 Grafana 偏监控、Metabase 偏轻量查询,Superset 在“数据分析师自助探索”这个位置上更对味,图表类型也够丰富,还支持自定义 SQL 和 Jinja 模板,这是它比很多商业 BI 工具都灵活的地方。
Sakila 则是 MySQL 官方提供的示例数据库,模拟的是一家 DVD 租赁商店。它比随便造几张测试表强在数据是有关联的:电影、演员、品类、门店、顾客、租赁记录、支付记录,一套完整的业务闭环。拿来做 Superset 的演示数据,能跑出真正有业务含义的看板,而不是那种一眼假的 demo。
1.2 版本选择与前置环境要求
版本这块我直接给结论:Superset 用 3.1.0,MySQL 用 8.0,Docker 引擎要求 20.10 以上,Docker Compose 要求 v2 版本。之所以不追最新,是因为 Superset 4.x 之后的某些功能还在磨合期,而 3.x 系列的文档和社区解决方案最全,遇到问题搜得到答案比版本新更重要。
确认环境时我建议先跑一遍版本检查:
bash复制docker --version
docker compose version
如果 compose 命令提示找不到,说明装的是旧版 docker-compose 独立命令,需要升级或用 docker-compose 替代。另外 Linux 环境下要注意普通用户是否在 docker 用户组里,否则每条命令都要加 sudo,后面排错会非常痛苦。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 编排文件编写:docker-compose.yml 逐段拆解
2.1 目录结构与初始化脚本准备
动手写编排文件之前,先把目录结构规划好。我用的是这个布局:
code复制superset-sakila/
├── docker-compose.yml
├── Dockerfile
├── superset_config.py
└── init/
├── 00-setup.sql
├── 01-sakila-schema.sql
└── 02-sakila-data.sql
init 目录里放 MySQL 首次初始化时要执行的脚本。这里有个关键机制:MySQL 官方镜像在数据目录为空时,会按文件名字典序依次执行 /docker-entrypoint-initdb.d/ 下的 .sql 和 .sh 文件。利用这个特性,我们只需要把 Sakila 的官方脚本放进去,容器第一次启动就会自动建库导数据。
Sakila 脚本可以从 MySQL 官方 GitHub 仓库获取,也可以从 dev.mysql.com/doc/index-other.html 下载。下载后一定要确认文件编码是 UTF-8,Windows 下用记事本另存可能导致 BOM 头问题,进而执行报错。
2.2 初始化脚本与 MySQL 服务配置
先看 init/00-setup.sql 的内容,这个脚本负责创建 Superset 连接数据库时要用的账号:
sql复制CREATE USER 'superset'@'%' IDENTIFIED WITH mysql_native_password BY 'superset_pass';
GRANT ALL PRIVILEGES ON sakila.* TO 'superset'@'%';
FLUSH PRIVILEGES;
这里特意用 mysql_native_password 而不是 MySQL 8 默认的 caching_sha2_password,原因后面排查章节会详细说,简单讲就是为了兼容一些老版本驱动在握手协议上的坑。实际上 mysqlclient 2.x 已经支持 caching_sha2_password,但既然要讲部署,我就按最稳的方式写,跑通为先。
接着是 docker-compose.yml 里 MySQL 服务段:
yaml复制 mysql:
image: mysql:8.0
container_name: sakila_mysql
environment:
- MYSQL_ROOT_PASSWORD=root_pass
- MYSQL_DATABASE=sakila
- TZ=Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d:ro
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot_pass"]
interval: 5s
timeout: 3s
retries: 20
`
