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

Python连接Docker部署的MySQL失败,报错2003 (HY000)求助

排查Python连接Docker部署MySQL的2003连接错误

报错信息

mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (99)

用户提供的相关文件

Python连接代码

mydb = mysql.connector.connect(
    host="localhost",
    user="USERNAME_DATABASE",
    password="root_pass",
    database="mydatabase"
)

MySQL的Dockerfile

FROM mysql:latest

WORKDIR /app

ADD . /app

COPY ./ex_db.sql /docker-entyypoint-initdb.d/

ENV MYSQL_HOST=localhost

ENV MYSQL_USER=USERNAME_DATABASE

ENV MYSQL_ROOT_PASSWORD=root_pass

ENV MYSQL_PASSWORD=pass

ENV MYSQL_DATABASE=mydatabase

EXPOSE 3306

排查与解决步骤

  • 补全Docker端口映射
    Docker容器内部的3306端口必须映射到宿主机端口,启动容器时执行:

    docker run -p 3306:3306 [你的镜像名称/容器ID]
    

    无端口映射时,宿主机localhost:3306无法指向容器内的MySQL服务,这是最常见的连接失败原因。

  • 修正Python连接的host参数

    • 若Python代码在宿主机运行:端口映射正常时可继续用localhost,或替换为容器IP(通过docker inspect [容器ID] | grep "IPAddress"获取);
    • 若Python代码也在Docker容器运行:需将host改为MySQL容器的名称(前提是两者在同一Docker网络),例如MySQL容器名为mysql-service,则host设为mysql-service。
  • 修复Dockerfile配置错误

    • 修正初始化脚本目录拼写:/docker-entyypoint-initdb.d/改为/docker-entrypoint-initdb.d/,否则初始化SQL脚本无法自动执行;
    • 删除无效环境变量:MYSQL_HOST对MySQL官方镜像无作用,直接移除;
    • 对齐用户密码:Python代码中用了root用户密码root_pass,若要使用普通用户USERNAME_DATABASE,需将password改为pass,或调整授权逻辑。
  • 配置MySQL用户远程访问权限
    进入MySQL容器:

    docker exec -it [容器ID] mysql -uroot -proot_pass
    

    执行授权命令(允许普通用户从任意地址连接):

    GRANT ALL PRIVILEGES ON mydatabase.* TO 'USERNAME_DATABASE'@'%' IDENTIFIED BY 'pass';
    FLUSH PRIVILEGES;
    

    若仅允许宿主机连接,可将%替换为Docker默认网关172.17.0.1。

  • 验证容器运行状态

    • 用docker ps确认MySQL容器处于Up状态;
    • 查看容器日志排查启动问题:docker logs [容器ID],检查是否有初始化失败、权限报错等信息。

内容的提问来源于stack exchange,提问作者quotientpara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:31:01