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

为什么无法从宿主机连接Docker容器内的MySQL服务?

问题原因
  • 未配置端口映射:你当前的docker-compose.yml没有配置端口转发规则,容器内MySQL默认监听的3306端口没有暴露到宿主机网络,宿主机无法直接访问容器内部的服务端口。
  • localhost连接走本地套接字:使用-hlocalhost参数时,MySQL客户端默认会通过本地Unix套接字文件/tmp/mysql.sock建立连接,不会走TCP网络,而容器内的套接字文件不存在于宿主机文件系统中,必然触发报错。
解决步骤
  1. 修改docker-compose.yml配置,添加ports端口映射字段:
version: '3.4'

services:
  mysqltest:
    image: percona:5.7
    ports:
      # 宿主机3306端口映射到容器3306端口,若宿主机3306被占用可改为其他端口如3307:3306
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-nopassword}
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  1. 重启容器服务:
    执行命令停止旧容器并重新启动:
docker-compose down && docker-compose up -d
  1. 执行正确的连接命令:
    必须使用-h127.0.0.1走TCP协议连接,不要使用localhost,若映射了非3306端口还要加-P<端口号>参数:
  • 使用test用户连接:
mysql -h127.0.0.1 -utest -ptest
  • 如果需要用root用户连接,默认root只允许容器本地登录,可先进入容器修改root权限:
    先进入容器:
docker-compose exec mysqltest mysql -uroot

进入MySQL命令行后执行授权语句:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的root密码' WITH GRANT OPTION;
FLUSH PRIVILEGES;

之后就可以用root从宿主机连接了:

mysql -h127.0.0.1 -uroot -p<你的root密码>
可选排查步骤

如果修改后仍然连接失败,可执行以下命令检查端口状态:

ss -tunlp | grep 3306

如果能看到docker-proxy监听3306端口,说明端口映射正常,否则检查是否有其他服务占用该端口,修改映射端口即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:54:03