配置Docker Compose使Flask应用连接本地MySQL数据库
解决方案
要让Docker中的Flask应用连接本地主机的MySQL,需从Docker配置、Flask数据库连接和本地MySQL设置三方面调整:
1. 修改docker-compose.yml配置
移除原有的db和phpmyadmin服务,同时调整app服务的网络配置,让容器能访问本地主机:
version: "3" services: app: build: . container_name: app ports: - "5000:5000" # **关键配置**:让容器解析到宿主机的特殊域名 extra_hosts: - "host.docker.internal:host-gateway" # 若为Linux系统,也可直接使用host网络模式(可选) # network_mode: "host" # 使用host网络时需注释ports映射,容器将直接复用主机端口 networks: default: external: false
说明:
host.docker.internal是Docker官方提供的宿主机映射域名,host-gateway会自动匹配宿主机网关IP(Docker 20.10+版本支持)。
2. 调整Flask的数据库连接字符串
在Flask应用的配置文件(如app.py)中,将原容器MySQL地址替换为host.docker.internal,并使用本地MySQL的账号、密码和数据库名:
示例1:使用SQLAlchemy
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 替换为你的本地MySQL信息 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://本地用户名:本地密码@host.docker.internal:3306/目标数据库名' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)
示例2:直接使用mysql-connector
import mysql.connector db_conn = mysql.connector.connect( host="host.docker.internal", user="本地用户名", password="本地密码", database="目标数据库名" )
3. 本地MySQL的必要设置
确保本地MySQL允许容器的访问请求:
- 登录本地MySQL,给目标用户授予远程访问权限:
GRANT ALL PRIVILEGES ON 目标数据库名.* TO '本地用户名'@'%' IDENTIFIED BY '本地密码'; FLUSH PRIVILEGES; - 修改MySQL配置文件(如
my.cnf/my.ini),将bind-address设置为0.0.0.0(允许所有IP访问),随后重启MySQL服务。
4. Dockerfile无需修改
你的原Dockerfile保持不变即可,镜像构建逻辑无需调整。
内容的提问来源于stack exchange,提问作者KALAGA Serge Eric
相关产品推荐
相关产品推荐

