M1芯片Mac下Docker Compose启动MySQL容器端口未开放无法连接
解决M1 Mac上Docker Host模式下MySQL无法访问的问题
问题根源
Docker Desktop for Mac(包括M1芯片机型)基于HyperKit虚拟机运行容器,network_mode: "host" 并不会让容器直接接入Mac宿主机的网络栈,而是接入虚拟机自身的网络。这就导致:
docker ps不会显示端口映射(host模式下无需映射,但实际容器端口仅在虚拟机内可访问)- 直接用Mac的
localhost或127.0.0.1无法通过JDBC连接MySQL
另外,expose 只是声明容器内开放的端口,不会做任何端口转发或映射,对外部访问没有实际作用。
可行解决方案
方案1:改用端口映射(推荐)
放弃network_mode: "host",改用ports配置直接映射端口到Mac宿主机,修改docker-compose.yaml中MySQL服务的配置:
services: mysql: # 移除 network_mode: "host" ports: - "3306:3306" # 宿主机端口:容器端口 # 其他配置...
重新启动容器:
docker compose down && docker compose up -d --build
此时docker ps会显示端口映射,直接用localhost:3306即可通过JDBC连接MySQL。
方案2:继续使用Host模式(不推荐)
如果必须保留network_mode: "host",需要连接Docker虚拟机的IP而非Mac的localhost:
- 执行以下命令获取Docker虚拟机的IP地址:
docker run --rm alpine ip route | grep default | awk '{print $3}'
- 使用获取到的IP代替
localhost,比如虚拟机IP是192.168.65.3,则JDBC连接地址为jdbc:mysql://192.168.65.3:3306/xxx
关键提示
- M1 Mac上的Docker Host模式和Linux原生Docker差异极大,除非有特殊需求,优先使用端口映射方案更稳定。
expose仅用于容器间通信的端口声明,不影响外部访问,无需保留。
内容的提问来源于stack exchange,提问作者Cpeony
相关产品推荐
相关产品推荐

