跳到主要内容

主机资讯与使用指南

Docker 容器连接不上宿主机 MySQL:地址、监听与权限排查

区分容器 localhost、宿主机地址和 Compose 服务名,定位 MySQL 连接拒绝、超时与访问被拒绝。

先确定数据库到底在哪

程序与 MySQL 都在同一个 Compose 项目时,数据库主机通常填服务名,例如 db,端口用容器内部的 3306。程序容器中的 localhost 指向程序容器自己。

MySQL 运行在宿主机时,需要可到达的宿主机地址。另一个容器的宿主机映射端口,只在通过宿主机地址访问时使用,不替代同网络服务端口。

Linux 为宿主机建立访问名称

Docker Engine 在 Linux 中可以给应用容器增加 host-gateway 映射。将下面片段合并进现有 Compose 的应用服务,不覆盖其他环境变量和数据卷。

services:
  app:
    image: your-application-image:your-tag
    extra_hosts:
      - "host.docker.internal:host-gateway"

示例 image 是占位符,换成原应用镜像。应用数据库配置填写 host.docker.internal:3306;保存后通过 docker compose up -d 重建应用容器。

Connection refused 与超时

sudo ss -lntp | grep 3306

MySQL 只监听 127.0.0.1 时,容器通过网桥地址不能连接。按 MySQL 配置将其监听到允许的宿主机接口,并重启对应服务。

不要为了容器访问把 3306 对整个公网开放。宿主机防火墙只允许需要的 Docker 网络来源;访问超时则继续检查路由和规则。

Access denied 是认证问题

能够到达数据库但返回 Access denied,检查用户名、密码以及 MySQL 账号的 Host 限制。账号允许的来源应匹配数据库实际看到的容器网络来源。

建立应用专用用户并只授予应用数据库权限。不要默认使用 root,也不要为了绕过错误给所有来源和所有数据库授权。

恢复之后再启动应用

确认目标数据库已经初始化、应用数据库存在,再启动依赖它的程序。需要客户端验证时,在应用容器内用可用工具访问相同地址,而不是只在宿主机测试。

查看应用的新日志,确认连接错误已经消失。密码、主机和端口修改后,重建容器让环境变量生效。

相关阅读