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

Docker部署的Java REST服务无法访问问题求助

问题分析与解决方案

嘿,我看你这是Docker新手常见的容器管理和镜像配置问题,咱们一步步把它捋顺解决:

核心问题点

  1. 重复创建新容器:你在步骤2启动了一个容器(ID:38ec56c99135),还把jar包复制进去了,但步骤5又用docker run启动了一个全新容器——docker run每次执行都会生成新的容器实例,不是进入已有的那个!这就导致你启动服务的容器和复制jar包的容器根本不是同一个,端口映射和服务环境全乱了。
  2. Dockerfile配置不完整:你的Dockerfile只拉了JDK镜像、建了目录,但没把应用jar包打包进镜像,也没定义容器启动时自动运行服务的命令,每次都要手动进容器操作,很容易出错。
  3. 接口路径错误:Spring官方教程里的REST服务默认接口是/greeting,不是根路径/,这也是你访问根路径出现重定向或404的原因之一。

正确操作步骤

第一步:修改Dockerfile

把你的Dockerfile更新成下面这样,让镜像自带应用,启动容器就自动跑服务:

# 推荐用具体版本的JDK镜像,避免latest版本的兼容性问题
FROM openjdk:8-jre-alpine
# 创建应用目录
RUN mkdir -p /opt/app
WORKDIR /opt/app
# 把本地jar包复制到镜像里(执行构建时,确保jar包和Dockerfile在同一目录)
COPY gs-rest-service-0.1.0.jar /opt/app/
# 暴露应用端口
EXPOSE 8080
# 定义容器启动命令:自动运行jar包
CMD ["java", "-jar", "gs-rest-service-0.1.0.jar"]

第二步:清理旧容器和镜像(避免混乱)

先把之前的容器和镜像清掉,防止端口占用或镜像冲突:

# 停止并删除旧容器
docker stop 38ec56c99135
docker rm 38ec56c99135
# 删除旧镜像
docker rmi java-rest

第三步:重新构建镜像

确保gs-rest-service-0.1.0.jar和Dockerfile在同一个目录下,执行构建命令:

docker build -t java-rest .

(注意命令最后的.,代表用当前目录的Dockerfile构建)

第四步:启动容器

用这条命令启动,容器会在后台自动运行服务:

docker run -d -p 18080:8080 --name java-rest-container java-rest
  • -d:让容器后台运行,不占用终端
  • --name:给容器起个好记的名字,方便后续管理
  • -p 18080:8080:把主机18080端口映射到容器8080端口

第五步:验证服务

  1. 检查容器状态:
docker ps

你会看到java-rest-container处于Up状态,端口映射正常。

  1. 在RHEL主机测试:
curl http://localhost:18080/greeting

(用教程里的/greeting接口,不是根路径)

  1. 在Windows浏览器访问:
    输入http://l5341t:18080/greeting(如果Windows解析不了l5341t,直接用RHEL主机的IP地址)

额外排查技巧

如果还是访问不了,试试这些:

  • 检查容器内服务是否监听8080端口:进入容器执行netstat -tulpn,如果没有netstat,alpine镜像可以先装apk add net-tools
  • 检查RHEL防火墙是否开放18080端口:执行firewall-cmd --list-ports,没开放的话添加:firewall-cmd --add-port=18080/tcp --permanent,再执行firewall-cmd --reload
  • 确认Windows和RHEL在同一局域网,没有网络隔离

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:15:52