Docker容器中运行的Spring应用在Zorin OS上无法访问
问题:Spring Boot Docker容器在Linux上无法通过localhost:8080访问(Windows环境正常)
我构建了一个Spring Boot应用,通过以下Dockerfile创建镜像:
Dockerfile
FROM openjdk:17 as builder WORKDIR /app COPY . . RUN microdnf install findutils RUN ./gradlew build COPY build/libs/*.jar app.jar FROM openjdk:17 COPY --from=builder /app/app.jar . ENTRYPOINT ["java", "-jar", "/app.jar"] EXPOSE 8080
搭配Postgres数据库使用,对应的docker-compose.yaml配置如下:
docker-compose.yaml
version: "3.8" services: db: image: postgres container_name: postgres restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: example expose: - "1999" ports: - "1999:1999" command: -p 1999 api: image: api depends_on: - db ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVE=docker networks: default:
该配置在Windows上运行完全正常,但迁移到Zorin OS(Linux)后,尽管容器内应用已正常启动,却无法通过localhost:8080访问应用。
容器关键日志
[main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2381 ms # 中间日志省略 [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' [main] com.voidhub.api.ApiApplication : Started ApiApplication in 7.341 seconds (process running for 7.904)
docker ps输出
d1e2d34d8dbd api "java -jar /app.jar" 6 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp voidhub-backend-1 251065ab7afa postgres "docker-entrypoint.s…" 2 hours ago Up 5 seconds 0.0.0.0:1999->1999/tcp, :::1999->1999/tcp, 5432/tcp postgres
本地测试结果
- 执行
curl localhost:8080返回:curl: (56) Recv failure: Connection reset by peer - 执行
netstat -aon | grep 8080显示端口已监听:tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN off (0.00/0/0) tcp6 0 0 :::8080 :::* LISTEN off (0.00/0/0)
解决方案
从现象判断,端口映射正常且容器内服务已启动,Linux下出现连接重置通常是以下原因,按优先级排查:
1. 检查Spring Boot绑定地址
如果application-docker.properties/yaml中手动设置了server.address=127.0.0.1,服务只会监听容器内部的localhost,外部无法访问。确保配置为:
server.address=0.0.0.0
2. 排查Linux防火墙(UFW)规则
Zorin OS默认启用UFW防火墙,可能拦截了8080端口的入站请求:
- 临时关闭防火墙测试:
sudo ufw disable - 若关闭后可访问,添加允许规则并重启防火墙:
sudo ufw allow 8080/tcp sudo ufw enable
3. 验证容器内部服务可用性
进入容器内部测试服务是否正常响应:
docker exec -it voidhub-backend-1 curl localhost:8080
若容器内访问正常,说明问题出在宿主机到容器的网络路径上,可尝试重启Docker服务:
sudo systemctl restart docker
4. 检查端口占用情况
用lsof确认8080端口的实际占用进程:
sudo lsof -i :8080
如果显示的不是docker-proxy,说明端口被其他进程占用,需停止该进程或更换映射端口。
内容的提问来源于stack exchange,提问作者Daan Schar
相关产品推荐
相关产品推荐

