Docker部署的Java REST服务无法访问问题求助
问题分析与解决方案
嘿,我看你这是Docker新手常见的容器管理和镜像配置问题,咱们一步步把它捋顺解决:
核心问题点
- 重复创建新容器:你在步骤2启动了一个容器(ID:38ec56c99135),还把jar包复制进去了,但步骤5又用
docker run启动了一个全新容器——docker run每次执行都会生成新的容器实例,不是进入已有的那个!这就导致你启动服务的容器和复制jar包的容器根本不是同一个,端口映射和服务环境全乱了。 - Dockerfile配置不完整:你的Dockerfile只拉了JDK镜像、建了目录,但没把应用jar包打包进镜像,也没定义容器启动时自动运行服务的命令,每次都要手动进容器操作,很容易出错。
- 接口路径错误: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端口
第五步:验证服务
- 检查容器状态:
docker ps
你会看到java-rest-container处于Up状态,端口映射正常。
- 在RHEL主机测试:
curl http://localhost:18080/greeting
(用教程里的/greeting接口,不是根路径)
- 在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
相关产品推荐
相关产品推荐

