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数据库返回的,表示有两个错误:
-
ORA-00604
: 这个错误表明在递归SQL级别(即Oracle内部操作)发生了错误。递归SQL是Oracle在处理用户SQL语句时内部自动执行的SQL语句,常见于触发器、登录逻辑等。 -
ORA-01882
: 这个错误表明找不到指定的时区地区。当数据库或JDBC驱动试图访问特定的时区信息,而该信息在数据库的时区文件中不存在或未被识别时,就会出现这个错误。
这两个错误一起出现可能意味着在执行初始化会话时,比如在用户登录时设置会话的时间区域,Oracle发现它不能识别或找到该时区。
这时候你会搜索到要同步时区,需先设置好宿主机的时区:
timedatectl set-timezone Asia/Shanghai
再在容器启动时添加
-v /etc/localtime:/etc/localtime:ro
或许,会发现宿主机的时间不对,可用
date -s "20240131 11:31:00"
更改一下宿主机的时间