1. 程式人生 > >Tomcat Docker容器自動重啟問題排查

Tomcat Docker容器自動重啟問題排查

1. 問題

前兩天發現 APP 重新整理資料偶爾出現等半天沒有響應的情況,感覺不像 APP 的問題,就查了下服務端的日誌。 服務端用的是 Java,部署採用的 Docker 官方的 tomcat 映象,並進行了基本的裁剪,Dockerfile 檔案內容如下:

FROM tomcat:8.0.36-jre8 MAINTAINER blog.smoker.[email protected].com RUN rm -rf /usr/local/tomcat/webapps && mkdir /usr/local/tomcat/webapps RUN echo "Asia/shanghai" > /etc/timezone; ADD build/libs/project-name.war /usr/local/tomcat/webapps/ROOT.war

2. 排查

通過 docker logs 命令檢視容器日誌,發現一直出現INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 13216 ms 相關日誌,說明 Tomcat 經常不斷的重啟。

然後 docker ps 發現應用容器的 CREATED 和 STATUS 時間對不上。說明是容器一直會出現重啟現象,導致上面檢視到日誌誤以為 Tomcat 不斷重啟。

之前因為 Java 應用佔用太多的記憶體?,在其 docker-compose

 加了 mem_limit: 1G 1G 記憶體限制的配置,所以有可能是記憶體不夠的原因才導致的容器不斷重啟。

執行 docker inspect --format='' container-name 命令,返回 true,說明容器因為 OOM 的問題被 killed 掉過。而我們的 docker-compose 配置的 restart: always 又導致容器自動重啟。所以,容器會不斷的被 kill,然後又 restart。

3. 解決

既然清楚了容器不斷重啟是因為記憶體不夠的原因,所以還是要限制記憶體。而在docker-compose

 檔案中的記憶體限制,只是對容器的記憶體的限制,JVM 還是會一直吃記憶體,導致容器記憶體不夠被 kill,所以還要加上對 JVM 記憶體的限制。

在 Dockerfile 中新增 ENV JAVA_OPTS="-Xmx512m" JVM 記憶體限制即可。完整的 Dockerfile 如下:

FROM tomcat:8.0.36-jre8 MAINTAINER blog.smoker.[email protected].com ENV JAVA_OPTS="-Xmx512m RUN rm -rf /usr/local/tomcat/webapps && mkdir /usr/local/tomcat/webapps RUN echo "Asia/shanghai" > /etc/timezone; ADD build/libs/project-name.war /usr/local/tomcat/webapps/ROOT.war

重新構建映象,啟動容器,檢視日誌:

INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx512m

出現上述內容,說明新增 JVM 記憶體限制配置生效,Tomcat 容器自動重啟問題解決。?