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和桥接方法,暂时还未将应用投入到生产环境,之后再回来写
浙公网安备 33010602011771号