Docker部署的Flask应用无法连接同环境下的MySQL容器
解决Docker中Flask无法连接MySQL容器的问题
针对你遇到的Error 2003: Can't connect to MySQL server on 'db:3306' (111 Connection refused)错误,结合你的配置和环境,可按以下步骤排查解决:
1. 确保MySQL容器完全就绪后再启动Flask
Docker的depends_on默认只等待容器启动,不等待服务就绪。如果Flask在MySQL初始化完成前就尝试连接,会出现连接拒绝。
修改docker-compose.yml,给db服务添加健康检查,让backend等待MySQL就绪后启动:
version: '3.8' services: db: image: mysql:latest container_name: db_container restart: always ports: - "6970:3306" networks: - network-backend environment: MYSQL_DATABASE: dbname MYSQL_ROOT_PASSWORD: secretpwd volumes: - db-data:/Users/local/path/in/my/system/ expose: - 3306 - 33060 # 添加健康检查,确认MySQL服务就绪 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 backend: image: image_backend container_name: backend_container restart: always ports: - "6969:6543" networks: - network-backend # 等待db服务健康就绪后启动 depends_on: db: condition: service_healthy
2. 检查MySQL是否允许外部容器连接
MySQL默认可能绑定127.0.0.1,导致仅容器内部本地可访问,其他容器无法连接。
在db服务的environment中添加MYSQL_INITDB_ARGS参数,强制MySQL绑定所有网卡:
environment: MYSQL_DATABASE: dbname MYSQL_ROOT_PASSWORD: secretpwd MYSQL_INITDB_ARGS: "--bind-address=0.0.0.0"
3. 验证Flask的数据库连接字符串
确认Flask配置中的数据库URL是否正确,格式应为:
# 示例:使用pymysql驱动 SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:secretpwd@db:3306/dbname"
注意:
- 用户名是
root(对应你设置的MYSQL_ROOT_PASSWORD用户) - 密码是
secretpwd(和docker-compose中的配置一致) - 主机名是
db(docker-compose中db服务的名称,不是localhost) - 数据库名是
dbname(和docker-compose中的MYSQL_DATABASE一致)
4. 排查数据卷挂载问题
你的db服务挂载了本地路径/Users/local/path/in/my/system/,可能存在权限问题或旧数据干扰:
- 检查本地路径权限:确保MySQL容器内的
mysql用户(UID 999)有读写权限,可执行chmod 777 /Users/local/path/in/my/system/临时测试(生产环境建议设置更严格的权限) - 临时注释volumes配置,重新启动容器:如果此时能连接,说明本地路径的旧数据或权限导致MySQL服务异常
5. 手动在Flask容器内测试连接
进入backend容器,使用mysql客户端测试连接,确认网络和MySQL配置:
# 进入backend容器 docker exec -it backend_container bash # 安装mysql客户端(如果容器内没有) apt update && apt install -y mysql-client # 测试连接db容器 mysql -h db -u root -psecretpwd dbname
如果连接失败,可进一步排查MySQL容器的日志:
docker logs db_container
查看是否有初始化错误或服务启动异常的日志信息。
内容的提问来源于stack exchange,提问作者chiru player
相关产品推荐
相关产品推荐

