Docker容器中后端应用连接本地数据库

一、前言

最近在使用 Flask + Vue + Docker 框架写一个小应用,上传一个PDF文件进行OCR识别,将上传文件数据以及识别结果数据存储到本地(容器宿主)Mysql 数据库中。 执行过程中遇到了问题,文件上传成功但无法将数据存入本地数据库中。经查问题核心是 Docker 容器网络隔离,当在 Docker 容器中使用 localhost 时,容器会尝试连接自身的本地网络,而非宿主机的 MySQL 服务。Docker 容器与宿主机属于不同的网络命名空间。

二、解决方法

 Docker 提供了一个特殊的 DNS 名称: host.docker.internal  用于在容器内部访问宿主机的服务。

完整使用流程:

1.  修改数据库连接配置

# app.py
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://admin:admin@host.docker.internal/ocr_db'

2. 配置 Mysql 权限

DROP USER IF EXISTS 'admin'@'localhost';
CREATE USER 'admin'@'%' IDENTIFIED BY 'admin';
GRANT ALL ON ocr_db.* TO 'admin'@'%';
FLUSH PRIVILEGES;

3. 开放 Mysql 网络访问

修改 Mysql my.ini 配置文件,路径:C:\ProgramData\MySQL\MySQL Server X.X\my.ini

# 添加或修改 bind-address
[mysqld]
bind-address = 0.0.0.0

4. 重启 Docker 服务

docker-compose down && docker-compose up -d

 

说明

解决问题过程中一直在修改配置,修改了app.py 中的数据库连接配置后也将 docker-compose.yml 中后端的 environment 数据库连接也改成了

host.docker.internal  。db 服务也需要修改 ports 的端口映射,否则会有端口占用报错,我是将 Docker 3306 映射到本地 3307 。

三、其他方法

host.docker.internal 仅适用于开发环境和测试环境,查阅发现还有直接配置IP和桥接方法,暂时还未将应用投入到生产环境,之后再回来写

posted @ 2025-04-09 12:07  图麻骨  阅读(372)  评论(0)    收藏  举报