为什么无法从宿主机连接Docker容器内的MySQL服务?
问题原因
- 未配置端口映射:你当前的
docker-compose.yml没有配置端口转发规则,容器内MySQL默认监听的3306端口没有暴露到宿主机网络,宿主机无法直接访问容器内部的服务端口。 - localhost连接走本地套接字:使用
-hlocalhost参数时,MySQL客户端默认会通过本地Unix套接字文件/tmp/mysql.sock建立连接,不会走TCP网络,而容器内的套接字文件不存在于宿主机文件系统中,必然触发报错。
解决步骤
- 修改
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
- 重启容器服务:
执行命令停止旧容器并重新启动:
docker-compose down && docker-compose up -d
- 执行正确的连接命令:
必须使用-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
相关产品推荐
相关产品推荐

