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。
- 若Python代码在宿主机运行:端口映射正常时可继续用
修复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
相关产品推荐
相关产品推荐

