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

附、参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值