1、从服务器上下载tomcat(不加版本号默认:latest)

docker pull tomcat:9.0

2、第一次运行tomcat

docker run -d --name tomcat9 -p 8080:8080 tomcat:9.0

3、创建对应的文件夹对tomcat中的logs、war等进行挂载

mkdir -p /home/tomcat9

 4、从容器中拷贝配置文件到宿主机上

docker cp tomcat9:/usr/local/tomcat/conf/ /home/tomcat9/
docker cp tomcat9:/usr/local/tomcat/webapps/ /home/tomcat9/
docker cp tomcat9:/usr/local/tomcat/logs/ /home/tomcat9/

5、然后删除第一次运行的tomcat容器

docker stop tomcat9
docker remove tomcat9

6、启动(将打包好的war包放入/home/tomcat9/webapps下)

docker run --name tomcat9 -p 8180:8080  \
-v /home/tomcat9/conf:/usr/local/tomcat/conf \
-v /home/tomcat9/webapps:/usr/local/tomcat/webapps \
-v /home/tomcat9/logs:/usr/local/tomcat/logs \
-v /etc/localtime:/etc/localtime:ro \
-e TZ=Asia/Shanghai \
-d --restart=always tomcat:9.0

释: 

-v /etc/localtime:/etc/localtime:ro

这个命令的作用是将宿主机上的时区设置文件(/etc/localtime)挂载到Docker容器中相同的位置,使容器能够使用与宿主机相同的时区设置。

具体来说,这个命令的各部分意义如下:

  • -v:这是Docker命令用来指定挂载卷的标志(Volume)。
  • /etc/localtime:这是宿主机上时区文件的路径。该文件包含了当前时区的信息。
  • :/etc/localtime:这是容器内部的挂载点,即容器内与宿主机/etc/localtime文件对应的路径。
  • :ro:这表示以只读方式挂载(Read-Only)。容器可以读取该文件,但无法修改它,这样可以防止容器的操作影响宿主机的时区设置。

7、查看日志 

  • 通过看宿主机 /home/tomcat8/logs下的日志
  • 通过docker logs -f tomcat8查看日志

8、时区问题 

如果你的应用用的是Oracle数据,可能会遇到这样的错:

Caused by: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found

这个错误信息是由Oracle数据库返回的,表示有两个错误:

  1. ORA-00604: 这个错误表明在递归SQL级别(即Oracle内部操作)发生了错误。递归SQL是Oracle在处理用户SQL语句时内部自动执行的SQL语句,常见于触发器、登录逻辑等。
  2. ORA-01882: 这个错误表明找不到指定的时区地区。当数据库或JDBC驱动试图访问特定的时区信息,而该信息在数据库的时区文件中不存在或未被识别时,就会出现这个错误。

这两个错误一起出现可能意味着在执行初始化会话时,比如在用户登录时设置会话的时间区域,Oracle发现它不能识别或找到该时区。

这时候你会搜索到要同步时区,需先设置好宿主机的时区:

timedatectl set-timezone Asia/Shanghai

再在容器启动时添加

-v /etc/localtime:/etc/localtime:ro

或许,会发现宿主机的时间不对,可用

date -s "20240131 11:31:00"

更改一下宿主机的时间