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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:55:22