这里我们说下当docker运行tomcat容器时,出现404异常时的解决方案,下面介绍了三种方法,可以彻底地解决此问题,也提供了详细的命令步骤,希望这篇文章对遇到问题的你有所帮助。
一、Docker中安装Tomcat
(一)两种安装方案
1、官方的使用
这样用的话用完就会自动删除容器。
我们之前的启动都是后台工停止了容器之后,容器还是可以查到;
docker run -it --rm, 一般用来测试,用完就删除。
docker run -it --rm tomcat:9.0
2、下载在启动 (我们一般用这种)
docker pull tomcat
启动运行
-d是设置后台运行;
-p是设置外网访问的端口号
docker run -d -p 8888: 8080 --name tomcat01 tomcat
在Docke内测试访问没有问题;
但到外网访问出现404异常。
(二)解决方案
进入容器
然后发现问题(详见解决方法1中)
1、linux命令少了;2。没有webapps。阿里 云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉。因为默认保证最小可运行的环境!
1、解决方法1
查看原因步骤
#首先进入容器内
[root@localhost cc]# docker exec -it 你运行中的容器名或id /bin/bash
#已经进入了tomcat,然后进入webapps目录
root@d5a348e0e0c8:/usr/local/tomcat# cd webapps
#查看webapps里的文件,发现没有
root@d5a348e0e0c8:/usr/local/tomcat/webapps# ls
#退回到上一级
root@d5a348e0e0c8:/usr/local/tomcat/webapps# cd ..
#查看tomcat里的目录
root@d5a348e0e0c8:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
#发现有个webapps.dist,查看后发现有需要的文件,然后将webapps.dist里的文件复制到webapps中就可以了
root@d5a348e0e0c8:/usr/local/tomcat# cp -r webapps.dist/* webapps
2、解决方法2
首先和上边一样先进入tomcat
docker exec -it 你的运行ID /bin/bash
然后更改webapps的文件名
mv webapps webapps2
最后把有配置文件的webapps.dist名字改为webapps
mv webapps.dist/ webapps
大功告成,这方法大差不差,都是更改文件内的内容,但这样我们每次运行一个tomcat都需要这样一次配置,相当麻烦,下面我们来看下终级解决方案。
如何提交一个自己的镜像???
二、commit镜像
docker commit 提交容器成カ一个新的副本
命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名: [TAG]
实战测试
1、启动一个默认的tomcat
2、发现这个默认的tomcat是没有webapps应用,镜像的原因,官方的镜像默认webapps 下面是役有文件的!
3、我自己拷贝进去了基本的文件,上面步骤一的拷贝方法。
4、将我们操作过的容器通过commit提交为一个镜像! 我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。
解决方法3
具体步骤
#退出tomcat
root@d5a348e0e0c8:/usr/local/tomcat# exit
exit
#查看正在运行的容器
[root@localhost cc]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5a348e0e0c8 tomcat "catalina.sh run" 8 minutes ago Up 8 minutes 0.0.0.0:8080->8080/tcp reverent_goldstine
#commit方法1修改过的webapps到默认的tomcat下
[root@localhost cc]# docker commit -a="cc" -m="add webapps app" d5a348e0e0c8 tomcat02:1.0
sha256:1efa8e10f1871ec940b7af31fab4279ae200183166b0aa1d411a0c30d1d4790b
#我们再来查看镜像,没错,多出了一个tomcat02镜像就是我们提交后的镜像,比默认的稍微大几兆。
[root@localhost cc]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 1efa8e10f187 18 seconds ago 652MB
tomcat latest 1b6b1fe7261e 39 hours ago 647MB
redis latest 33c654ea77ff 2 days ago 104MB
nginx latest 9beeba249f3e 2 days ago 127MB
elasticsearch 7.6.2 f29a1ee41030 7 weeks ago 791MB
portainer/portainer latest 2869fc110bf7 8 weeks ago 78.6MB
centos latest 470671670cac 4 months ago 237MB
mysql 5.5 d404d78aa797 12 months ago 205MB
验证一下是否成功
#运行我们修改过的tomcat容器
[root@localhost cc]# docker run -it -p 8082:8080 tomcat02:1.0
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
此处省略一万字.....(启动过程)
#然后查看我们启动后的容器
[root@localhost cc]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
912b43a634d5 tomcat02:1.0 "catalina.sh run" 11 seconds ago Up 10 seconds 0.0.0.0:8082->8080/tcp hungry_matsumoto
下面我们在外网验证以下
不用再麻烦的拷贝或者改名字就能成功的运行tomcat。
对了,还要查看一下linux里的防火墙是否关闭,没关的话记得关一下!
几个关于防火墙的命令:
#查看防火墙的状态:
systemctl status firewalld
#启动防火墙:
systemctl start firewalld
#关闭防火墙:
systemctl stop firewalld
#开机启动防火墙:
systemctl enable firewalld
#开机关闭防火墙:
systemctl disable firewalld
至此,我们这个问题算是告一段落了,如果还有什么问题可以在评论区交流,如果看完文章对你有帮助的话,点赞收藏关注三连走一波!!!