Docker容器化Flask后端连接MySQL Workbench数据库实现API接口的配置求助
嘿,看你已经把React和Flask都打包成Docker容器了,现在就差把Flask和MySQL Workbench里的数据库连上对吧?我给你整理了一套靠谱的步骤,分两种场景(用本地MySQL或者把MySQL也容器化),你按需选:
一、如果你的MySQL是本地Workbench里的(非容器化)
1. 先让MySQL允许外部访问
本地MySQL默认只认localhost访问,但Flask在Docker容器里属于另一个网络,所以得改配置:
- 找到MySQL的配置文件:Windows是
my.ini,Linux/macOS是/etc/mysql/my.cnf,把bind-address改成0.0.0.0(允许所有IP连接) - 重启MySQL服务(Windows在服务管理器操作,Linux用
sudo systemctl restart mysql) - 打开Workbench,给Flask创建一个能跨IP访问的用户:
CREATE USER 'flask_user'@'%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'flask_user'@'%'; FLUSH PRIVILEGES;
这里%表示允许任何IP,生产环境可以换成Docker子网的IP段(比如172.17.0.0/16),更安全。
2. 配置Flask的数据库连接
别用localhost当数据库地址!容器里的localhost指的是容器自己,得用你宿主机的真实IP(比如Windows查ipconfig,Linux/macOS查ifconfig)。在Flask的配置文件里这么写:
# config.py import os # 硬编码方式(不推荐生产环境用) SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://flask_user:你的密码@宿主机IP/你的数据库名' # 更灵活的环境变量方式(推荐) # SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{os.getenv("DB_USER")}:{os.getenv("DB_PASSWORD")}@{os.getenv("DB_HOST")}/{os.getenv("DB_NAME")}'
3. 调整docker-compose.yml
方式1:用宿主机网络(简单粗暴)
给Flask服务加network_mode: host,这样容器直接用宿主机的网络,就能直接连本地MySQL了:
version: '3.8' services: flask-backend: build: ./backend network_mode: host environment: - FLASK_ENV=development # 如果用环境变量,添加以下配置 # - DB_HOST=宿主机IP # - DB_USER=flask_user # - DB_PASSWORD=你的密码 # - DB_NAME=你的数据库名 react-frontend: build: ./frontend ports: - "3000:3000"
方式2:用Docker默认网络(更推荐,保持隔离)
不用host网络,直接在环境变量里传宿主机IP,docker-compose.yml这么写:
version: '3.8' services: flask-backend: build: ./backend ports: - "5000:5000" environment: - DB_HOST=宿主机IP # 替换成你自己的IP - DB_USER=flask_user - DB_PASSWORD=你的密码 - DB_NAME=你的数据库名 react-frontend: build: ./frontend ports: - "3000:3000" depends_on: - flask-backend
4. 测试连接
启动容器:
docker-compose up --build
然后在Flask里写个测试接口验证:
@app.route('/test-db') def test_db_connection(): try: # 执行一个简单查询 result = db.session.execute('SELECT 1').fetchone() return f"数据库连接成功!测试结果:{result}" except Exception as e: return f"数据库连接失败:{str(e)}"
访问http://localhost:5000/test-db,如果返回成功信息就搞定了!
二、更推荐:把MySQL也容器化(适配Docker生态)
如果不想改本地MySQL的配置,直接把MySQL也放进docker-compose里,这样整个环境更统一,Workbench照样能连:
version: '3.8' services: mysql-db: image: mysql:8.0 ports: - "3306:3306" # 映射到本地,Workbench直接连localhost:3306 environment: - MYSQL_ROOT_PASSWORD=你的root密码 - MYSQL_DATABASE=你的数据库名 - MYSQL_USER=flask_user - MYSQL_PASSWORD=你的密码 volumes: - mysql_data:/var/lib/mysql # 持久化数据,重启容器不会丢数据 flask-backend: build: ./backend ports: - "5000:5000" environment: - DB_HOST=mysql-db # 直接用服务名当主机,Docker内部DNS会自动解析 - DB_USER=flask_user - DB_PASSWORD=你的密码 - DB_NAME=你的数据库名 depends_on: - mysql-db react-frontend: build: ./frontend ports: - "3000:3000" depends_on: - flask-backend volumes: mysql_data: # 声明持久化卷
这样配置后,你用Workbench连接localhost:3306,用户名密码用上面设的,就能管理容器里的数据库了,和之前的使用习惯完全一样,还不用改本地MySQL的任何配置!
注意事项
- 确保宿主机防火墙没挡住3306端口(MySQL默认端口)
- 生产环境别用
%作为MySQL用户的主机限制,指定具体IP段更安全 - Flask里记得装
pymysql:pip install pymysql
内容的提问来源于stack exchange,提问作者Deepak

