零、前言
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
Tomcat部署实战

本文介绍如何使用Docker、Dockerfile及docker-compose部署Tomcat应用,包括配置端口映射、容器内文件挂载等,并探讨如何将.war包部署为ROOT应用。
2463

被折叠的 条评论
为什么被折叠?



