You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 11:27:46