Docker Tomcat 部署
阿新 • • 發佈:2018-12-31
零、前言
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
先 build
後 run
:
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