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"]
操作步骤
- 启动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,容器正常启动; - 构建SpringBoot镜像:执行
docker build . -t users-mysql,镜像创建成功; - 启动应用容器:执行
docker run -p 8086:8086 --name users-mysql --link mysql-standalone:mysql -d users-mysql,容器显示运行; - 访问
http://localhost:8086/all/时,提示“无法访问此网站,localhost拒绝连接”; - 查看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
相关产品推荐
相关产品推荐

