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

Windows7下Docker部署SpringBoot+MySQL服务无法访问求助

问题背景

环境信息

  • 操作系统:Windows7
  • Docker版本:Docker version 18.03.0-ce, build 0520e24302
  • SpringBoot版本:1.5.3.RELEASE
  • 代码取自公开GitHub仓库,在MacOS环境可正常运行

application.properties配置

# DataSource settings: set here your own configurations for the database 
# connection. In this example we have "netgloo_blog" as database name and 
# "root" as username and password. 
spring.datasource.url = jdbc:mysql://mysql-standalone:3306/test 
spring.datasource.username = testuser 
spring.datasource.password = testuserpass 

# Keep the connection alive if idle for a long time (needed in production) 
spring.datasource.testWhileIdle = true 
spring.datasource.validationQuery = SELECT 1 

# Show or not log for each sql query 
spring.jpa.show-sql = true 

# Hibernate ddl auto (create, create-drop, update) 
spring.jpa.hibernate.ddl-auto = create 

# Naming strategy 
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy 

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is 
# stripped before adding them to the entity manager) 
# The SQL dialect makes Hibernate generate better SQL for the chosen database 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 

server.port=8086 

Dockerfile内容

FROM openjdk:8 
ADD target/users-mysql.jar users-mysql.jar 
EXPOSE 8086 
ENTRYPOINT ["java", "-jar", "users-mysql.jar"] 

操作步骤

  1. 启动MySQL容器:执行命令docker run --name mysql-standalone -e MYSQL_ROOT_PASSWORD=rootpass -e MYSQL_DATABASE=test -e MYSQL_USER=testuser -e MYSQL_PASSWORD=testuserpass -d mysql:5.6,容器正常启动;
  2. 构建SpringBoot镜像:执行docker build . -t users-mysql,镜像创建成功;
  3. 启动应用容器:执行docker run -p 8086:8086 --name users-mysql --link mysql-standalone:mysql -d users-mysql,容器显示运行;
  4. 访问http://localhost:8086/all/时,提示“无法访问此网站,localhost拒绝连接”;
  5. 查看users-mysql和mysql-standalone容器日志,未发现任何错误或异常。

应用启动日志片段

2018-05-17 20:52:29.921 INFO 1 --- [ main] SpringDataJpaHibernateExampleApplication : Starting SpringDataJpaHibernateExampleApplication v0.0.1-SNAPSHOT o n b4f3a2acd0a9 with PID 1 (/users-mysql.jar started by root in /) 
2018-05-17 20:52:29.937 INFO 1 --- [ main] SpringDataJpaHibernateExampleApplication : No active profile set, falling back to default profiles: default 
2018-05-17 20:52:30.124 INFO 1 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConf igEmbeddedWebApplicationContext@5b37e0d2: startup date [Thu May 17 20:52:30 UTC 2018]; root of context hierarchy 
2018-05-17 20:52:34.632 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8086 (http) 
2018-05-17 20:52:34.661 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat 
2018-05-17 20:52:34.665 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.14 
2018-05-17 20:52:34.873 INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 
2018-05-17 20:52:34.873 INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 4752 ms 
2018-05-17 20:52:35.206 INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 
2018-05-17 20:52:35.220 INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 
2018-05-17 20:52:35.221 INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 
2018-05-17 20:52:35.222 INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 
2018-05-17 20:52:35.222 INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterR

解决方案与排查步骤

既然这套配置在MacOS能正常运行,到Windows7就出问题,大概率是Windows7上Docker的网络特性导致的——Windows7不支持原生Docker,是通过Docker Toolbox在VirtualBox虚拟机里运行容器的,和Mac的网络模型不一样。咱们一步步来排查:

1. 用Docker虚拟机IP替代localhost访问

Windows7的localhost指向的是你的物理主机,而容器都跑在VirtualBox虚拟机里。你需要用虚拟机的IP来访问应用:

  • 打开Docker Quickstart Terminal,启动时会显示虚拟机的IP(通常是192.168.99.100)
  • 尝试访问http://<虚拟机IP>:8086/all/,而不是http://localhost:8086/all/

2. 确保Spring Boot监听所有网络接口

部分旧版本Spring Boot默认只绑定容器内部的127.0.0.1,导致外部无法访问。在application.properties里添加一行:

server.address=0.0.0.0

然后重新构建镜像docker build . -t users-mysql,再重启容器。

3. 验证端口映射是否正确

执行docker ps查看users-mysql容器的PORTS列,正常应该显示0.0.0.0:8086->8086/tcp,表示端口对虚拟机所有接口开放。如果显示127.0.0.1:8086->8086/tcp,说明端口只绑定了虚拟机内部的localhost,需要重新运行容器(不用改命令,默认就是开放所有接口)。

4. 检查Windows防火墙设置

Windows7的防火墙可能会阻止虚拟机的端口访问。可以先临时关闭防火墙测试,如果能正常访问,就给防火墙加一条规则:允许来自虚拟机IP段(通常是192.168.99.0/24)的8086端口入站请求。

5. 确认容器间连通性(可选)

虽然日志没报错,还是可以验证下应用容器能不能访问MySQL:

  • 进入应用容器:docker exec -it users-mysql bash
  • ping MySQL容器:ping mysql-standalone,能正常解析并响应就没问题
  • 测试MySQL连接:mysql -h mysql-standalone -u testuser -ptestuserpass test,能成功登录数据库就说明容器间通信正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:25:13