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

Docker容器中MySQL服务无法连接,需在Dockerfile启动服务吗?

解决MySQL Docker容器连接失败(2003错误)的问题

嘿,我来帮你理清楚这个问题——你遇到的mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)错误,其实是两个常见的Docker+MySQL配置误区导致的,咱们一步步解决:

首先明确:绝对不需要在Dockerfile里手动启动MySQL服务

官方的MySQL Docker镜像已经把启动逻辑封装得很完善了,它会通过自带的docker-entrypoint.sh脚本自动初始化并启动MySQL服务。如果你在Dockerfile里加了类似service mysql start或者直接运行mysqld的命令,反而会搞乱容器的主进程逻辑,导致服务启动异常或者网络无法正常工作。所以别画蛇添足,Dockerfile里只需要做镜像的基础定制(比如安装依赖、复制初始化脚本)就行,启动服务交给镜像自己处理。

核心问题:连接地址用错了

你用127.0.0.1连接,但容器里的MySQL是跑在自己的网络空间里的,这个地址在不同场景下不适用:

  • 如果你的脚本是在宿主机上运行:得把容器的3306端口映射到宿主机,这样才能通过宿主机的127.0.0.1访问到容器里的MySQL。
  • 如果你的脚本是在另一个Docker容器里运行:直接用docker-compose里定义的服务名db作为连接地址就行——Docker会自动在内部DNS把这个名称解析到容器的IP,不需要映射端口。

修正你的docker-compose.yml配置

你的当前配置有两个小问题,我帮你改好了:

version: '3.3'
services:
  db:
    build: .
    restart: always
    ports:
      - "3306:3306"  # 新增:把容器3306端口映射到宿主机,宿主机脚本可以用127.0.0.1:3306连接
    environment:
      MYSQL_ROOT_PASSWORD: test
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
    volumes:
      - ./db_data:/var/lib/mysql  # 修正:挂载到数据库数据目录,实现数据持久化
      # 如果有初始化SQL脚本,可加这行:- ./init.sql:/docker-entrypoint-initdb.d/init.sql

解释下改动:

  1. 加了ports映射:宿主机脚本就能通过127.0.0.1:3306连接了;
  2. 修正了volumes路径:原来的挂载路径是初始化脚本目录,如果你想持久化数据库数据,应该挂载到/var/lib/mysql——不然容器重启后数据就没了。

脚本连接的正确姿势

  • 宿主机运行脚本:连接参数填host='127.0.0.1',port=3306,用户名密码用你配置的test/test;
  • 容器内运行脚本:连接参数填host='db',port=3306,不用管宿主机端口。

最后检查下容器状态

运行docker-compose logs db看看日志,确认里面有ready for connections的字样,说明MySQL服务已经正常启动了。如果你的Dockerfile有自定义内容,千万别覆盖官方镜像的ENTRYPOINT或CMD,那会直接破坏MySQL的启动流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:27:55