1. 获取镜像
docker pull tomcat:8.5.38
docker images
2. 第一次启动tomcat
该步骤作用:是为了拷贝容器中Tomcat中的conf下配置文件和webapps下的管理页面,用于后面自定义Tomcat服务器配置或者部署应用。
第一次启动:
docker run -d --name tomcat8 -p 8081:8080 tomcat:8.5.38
在宿主机创建文件夹:
mkdir -p /home/tomcat8
从容器中拷贝配置文件和应用到宿主机中:
docker cp tomcat8:/usr/local/tomcat/conf/ /home/tomcat8/
docker cp tomcat8:/usr/local/tomcat/webapps/ /home/tomcat8/
3.带参数启动
此时,如果直接带参数启动时,会报有重名的tomcat8容器冲突,报以下类似错误:
Error response from daemon: Conflict. The container name "/tomcat8" is already in use by container "f087d304d5bffa1becc20b9c3668d634caf7bc001fc7ce89bdf5c5b43e3e869e". You have to remove (or rename) that container to be able to reuse that name.
这时候,需要先将容器tomcat8先停止,再删除:
docker stop tomcat8
docker remove tomcat8
最后再使用带参数的命令启动:
docker run --name tomcat8 -p 1808:8080 \
-v /home/tomcat8/conf:/usr/local/tomcat/conf \
-v /home/tomcat8/webapps:/usr/local/tomcat/webapps \
-v /home/tomcat8/logs:/usr/local/tomcat/logs \
-v /etc/localtime:/etc/localtime:ro \
-v /serverdata/conf/tsmsg/:/serverdata/conf/tsmsg \
-e TZ=Asia/Shanghai \
-d tomcat:8.5.38
-v /serverdata/conf/tsmsg/:/serverdata/conf/tsmsg
这个为应用本身的配置文件映射,根据实际需求来设置配置文件地址。
-v /etc/localtime:/etc/localtime:ro
这个命令的作用是将宿主机上的时区设置文件(/etc/localtime
)挂载到Docker容器中相同的位置,使容器能够使用与宿主机相同的时区设置。
具体来说,这个命令的各部分意义如下:
-v
:这是Docker命令用来指定挂载卷的标志(Volume)。/etc/localtime
:这是宿主机上时区文件的路径。该文件包含了当前时区的信息。:/etc/localtime
:这是容器内部的挂载点,即容器内与宿主机/etc/localtime
文件对应的路径。:ro
:这表示以只读方式挂载(Read-Only)。容器可以读取该文件,但无法修改它,这样可以防止容器的操作影响宿主机的时区设置。
这样做的好处是保证容器内的应用程序可以正确处理与时区相关的操作,例如记录日志的时间戳、执行定时任务等。这对于需要时区一致性的应用程序来说非常重要。例如,如果你在上海运行宿主机,而你的容器也应当使用东京的时区,通过这种方式挂载/etc/localtime
,你的容器将会自动采用上海的时区,而无需在容器内单独配置时区。
4.查看tomcat日志
-
通过看宿主机
/home/tomcat8/logs
下的日志 -
通过
docker logs -f tomcat8
查看日志
5.时区问题
如果你的应用用的是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"
更改一下宿主机的时间