零、前言
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