1. 程式人生 > >Docker Tomcat 部署

Docker Tomcat 部署

零、前言

Docker + 一個 Tomcat 映象都能給我整出很多花樣來,乾脆寫篇水文記錄一下。

Tomcat 一般都是用來部署 .war 包的,假設我們的 .war 包的名字是 shop.war

一、docker run

簡單暴力,一行命令搞定:

docker run -it \ 
    -p 8080:8080 \
    -v ./target/shop.war:/usr/local/tomcat/webapps/shop.war \
    tomcat:8

訪問(host-ip 請換上你實際的ip):http://host-ip:8080/shop

命令中的 \ 僅表示換行,寫在一行會出現滾動條不好看。

二、Dockerfile

Dockerfile:

FROM tomcat:8
ADD ./target/shop.war /usr/local/tomcat/webapps/shop.war
CMD ["catalina.sh", "run"]
EXPOSE 8080

buildrun

docker build -t shop-tomcat .
docker run -it -p 9999:8080 shop-tomcat

需要注意的是:Dockerfile 中 EXPOSE 指令宣告暴露的埠,並不會實際在容器執行時暴露出來,只是起到一個文件宣告作用,實際執行時,還需在 docker run

命令中加上 -p 引數指定埠對映到宿主機。

三、docker-compose

docker-compose.yml:

version: "2"
services:
mysql:
  ...
tomcat:
  image: tomcat:8
  depends_on:
    - mysql
  volumes:
    - "./target/shop.war:/usr/local/tomcat/webapps/shop.war"
  ports:
    - "8080:8080"
  entrypoint:
    - "catalina.sh"
    - "run"

四、Tomcat ROOT ?

眾所周知,使用 Tomcat 部署 .war 包的時候,Tomcat 啟動時,預設會自行解壓 .war 包,並且程式的上下文也就是 .war 包的名稱,例如 http://localhost:8080/shop/xxx。假設我們程式上下文改成 / 呢?

直覺就是很簡單,把程式 .war 包改名成 ROOT.war(Tomcat的特性,ROOT專案的上下文就是\),然後部署到 tomcat/webapps/ 下就可以啦,寫成 Dockerfile:

FROM tomcat:8
ADD ./target/shop.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
EXPOSE 8080

以上 ADD 指令,把 shop.war 複製到了 /usr/local/tomcat/webapps/ 並重命名成了 ROOT.war,經測,並沒有像我們預期的那樣,原因是 tomcat/webapps/ 目錄下預設有一個 ROOT 目錄了,所以 Tomcat 不會自動解壓我們的 ROOT.war

怎麼辦呢?簡單暴力,直接刪掉原有的 tomcat/webapps/ROOT 吧!Dockerfile:

FROM tomcat:8
RUN ["rm", "-fr", "/usr/local/tomcat/webapps/ROOT"]
ADD ./target/shop.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
EXPOSE 8080

附、參考資料