这里我们说下当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。

docker 重启apache2 docker重启tomcat_docker 重启apache2


对了,还要查看一下linux里的防火墙是否关闭,没关的话记得关一下!

几个关于防火墙的命令:

#查看防火墙的状态:
	systemctl status firewalld
	#启动防火墙:
	systemctl start firewalld
	#关闭防火墙:
	systemctl stop firewalld
	#开机启动防火墙:
	systemctl enable firewalld
	#开机关闭防火墙:
	systemctl disable firewalld

至此,我们这个问题算是告一段落了,如果还有什么问题可以在评论区交流,如果看完文章对你有帮助的话,点赞收藏关注三连走一波!!!