Docker 跑 Tomcat 访问就 404?原来是 webapps 被搬空了
用 Docker 拉个 Tomcat 镜像跑起来,浏览器一访问 8080 端口,结果蹦出来个 404。
容器日志干干净净,端口也映射了,进程也活着。
到底哪儿出了问题?
先说结论:默认页面被挪走了
从 Tomcat 8.5 开始,官方把欢迎页和管理应用从 webapps 目录挪进了 webapps.dist。
容器启动时,webapps 是个空目录,自然就没有 ROOT 应用可以响应根路径。
所以访问 http://localhost:8080 拿不到东西,返回 404。
这不是 bug,是官方有意为之,目的是让生产环境默认不暴露示例应用,更安全。
复现这个 404
先按常规方式起一个容器。
## 后台运行,命名为 tomcat,映射 8080 端口
docker run -it -d --name tomcat -p 8080:8080 tomcat注意端口参数是 -p 8080:8080,-p 和端口之间有个空格,写成 -p:8080:8080 是错的。
启动后浏览器打开 http://localhost:8080,这时候大概率就是那个 404 页面。
进容器看一眼目录
想确认是不是 webapps 空了,进容器看看就知道。
先拿容器 ID 或者直接用名字。
docker ps然后用 exec 进去。
## 用容器名 tomcat 进入交互式终端
docker exec -it tomcat /bin/bash这里别再用 docker attach 了。
attach 接的是主进程的标准输入输出,一不小心 Ctrl+C 就把 Tomcat 干停了,exec 才是进容器调试的正确姿势。
进去之后 ls webapps 基本是空的,ls webapps.dist 里才躺着 ROOT、docs、examples、manager 这些目录。
修复:把 webapps.dist 的内容搬回来
最快的办法就是直接替换目录。
## 容器内执行
rm -rf webapps
mv webapps.dist webapps这两条命令的工作目录是 Tomcat 的 CATALINA_HOME(一般是 /usr/local/tomcat),exec 进来默认就在这个目录,所以可以直接写相对路径。
执行完不用重启 Tomcat,刷新浏览器就能看到熟悉的小猫页面了。
更推荐的做法:别动容器,挂自己的应用
进容器手动改目录这招能救急,但容器一删就白干,重建又得来一遍。
真要部署自己的项目,正经做法是把 war 包或者解压后的目录挂载进去。
## 把本地 ROOT 目录挂到容器的 webapps 下
docker run -d --name tomcat -p 8080:8080 \
-v /your/app/ROOT:/usr/local/tomcat/webapps/ROOT \
tomcat这样根路径直接指向你的应用,压根不需要 webapps.dist 那套示例页面。
容器重建也不影响数据,应用始终在宿主机上。
常见问题
Q1. 为什么 Tomcat 要把页面放进 webapps.dist?
安全考虑。
examples 和 manager 这类示例应用在生产环境是风险点,默认空 webapps 能避免无意中把它们暴露出去。
Q2. 改完之后还是 404 怎么办?
检查三处:端口映射有没有写对(-p 8080:8080)、容器是不是真的在跑(docker ps)、webapps/ROOT 目录到底存不存在。
如果是自己的应用,war 包没解压或者路径放错也会 404。
Q3. docker attach 和 docker exec 有什么区别?
attach 连的是容器主进程的输入输出流,退出时容易误杀主进程。
exec -it ... /bin/bash 是新开一个进程进去,退出不影响 Tomcat 运行,调试就用它。
Q4. 这个问题在哪些 Tomcat 版本上出现?
Tomcat 8.5 及之后的版本都是这个机制,包括 9、10、11。
老的 8.0 及更早版本默认页面还在 webapps 里,不会遇到这个 404。
写在最后
这个 404 看着唬人,本质就是默认目录搬了家。
临时调试用 mv webapps.dist webapps 顶一下,正式部署还是老老实实挂载自己的应用更靠谱。
如果你按上面步骤还是访问不了,或者遇到别的 Tomcat 坑,欢迎在评论区聊聊~~~
版权声明
未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!
本文原文链接: https://fiveyoboy.com/articles/docker-tomcat-404-webapps-dist/
备用原文链接: https://blog.fiveyoboy.com/articles/docker-tomcat-404-webapps-dist/