目錄使用Docker部署Tomcat1. 獲取鏡像2. 第一次啟動tomcat3.帶參數啟動4.查看tomcat日誌5.時區問題 使用Docker部署Tomcat 1. 獲取鏡像 docker pull tomcat:8.5.38 docker images 2. 第一次啟動tomcat 該步驟作用 ...
目錄
使用Docker部署Tomcat
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"
更改一下宿主機的時間