通过 centos7 基础镜像,创建自定义镜像,包含 jdk + tomcat + 应用程序 war 包

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Dockerfile
from centos:7
MAINTAINER "AndyChen<552087293@qq.com>"

# 将 jdk 和 tomcat 解压到镜像 centos 的 /usr/local/ 目录下
ADD tomcat.tar.gz /usr/local/
ADD jdk-8u381-linux-x64.tar.gz /usr/local/

# 安装wget
RUN sed -i 's|mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache fast
RUN yum -y install wget

# 添加环境变量
ENV TZ "Asia/Shanghai"
ENV JAVA_HOME /usr/local/jdk1.8.0_381
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# 暴露8080端口
EXPOSE 8080

# 匿名卷
VOLUME ["/usr/local/tomcat/logs"]

# 启动时运行tomcat
CMD ["catalina.sh","run"]

打包应用与 tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 删除旧的应用版本
cd /root/soft/tomcat/webapps/ROOT
rm -rf *
# 将编译好的应用 war 包解压到 tomcat 的 ROOT 目录
jar -xvf /root/soft/taoban-jd-luck-client-1.0.war

# 删除上次打包的 tomcat 包
rm -rf /root/centos-tomcat/tomcat.tar.gz
cd /root/soft
# 将包含最新版应用的 tomcat 打包备用
tar -czvf tomcat.tar.gz tomcat
# 将本次打好的包移到包含 Dockerfile 的目录
mv tomcat.tar.gz /root/centos-tomcat/
# 删除本次上传的应用 war 包
rm -rf taoban-jd-luck-client-1.0.war

构建镜像

  • 需要把 Dockerfile 与用到的文件放到一个目录下,在该目录下运行 docker build 命令
  • 在执行创建命令之前,需要确保已经摘取过 centos7 镜像,拉取命令:docker pull centos:7
    1
    2
    cd /root/centos-tomcat
    docker build -t tomcat:wxjx .

运行 docker

  • 81 是 nginx 服务配置里负载指向的端口,就是 tomcat 放出的端口

交互方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker stop tomcat-tb-admin
docker rm tomcat-tb-admin

docker run -it \
-p 81:8080 \
--name tomcat-tb-admin \
--restart=always \
-v /root/app/tomcat-logs-tb-admin:/usr/local/tomcat/logs \
-v /root/app/config-tb.properties:/acs/conf/config.properties \
tomcat-tb-admin bash

# 启动、停止 tomcat
catalina.sh start
catalina.sh stop

后台方式

1
2
3
4
5
6
7
8
9
docker rm tomcat

docker run -d \
-p 81:8080 \
--name tomcat-tb-admin \
--restart=always \
-v /root/app/tomcat-logs-tb-admin:/usr/local/tomcat/logs \
-v /root/app/config-tb.properties:/acs/conf/config.properties \
tomcat-tb-admin

相关指令

  • 停止容器:stop tomcat-tb-admin
  • 删除已停止的容器:docker rm tomcat-tb-admin
    • 如果不删除,将无法以 --name tomcat-tb-admin 的方式启动容器,会报该名称已经存在的错误
  • 进入运行中的 docker:docker exec -it tomcat /bin/bash
  • 退出运行中的 docker,回到宿主机:exit,退出后,不会影响 docker 的运行

关于 --restart= 等号后面的参数

  • no:容器退出时,不重启容器;
  • on-failure:只有在非 0 状态退出时才从新启动容器;
  • always:无论容器因何原因退出(正常或异常),Docker 都会自动重新启动该容器;
  • unless-stopped:类似 always,但忽略 Docker 守护进程启动前已停止的容器

  • 可以直接修改已经运行的容器:docker update --restart=no tomcat

  • 运行时指定:--restart=always \

localhost 和 127.0.0.1

  • docker 连接 MySQL,记得一定要写运行 MySQL 的主机 ip,不要写 localhost,也不要写 127.0.0.1,因为 docker 运行起来之后,这两个地址代表的是 docker 实例本身的 ip 地址
  • 通过 docker 运行 nginx,网站配置文件,如果写 localhost 或 127.0.0.1,也是指向运行 nginx 的 docker 实例,并非运行 nginx docker 的宿主机
  • 刚开始接触 docker 的同学,可能会误以为 localhost 和 127.0.0.1 指向宿主机

tomcat 配置参考

apache-tomcat-8.5.92/conf/server.xml

  • 设置编码:在 <Connector port="8080" protocol="HTTP/1.1" 下面添加:URIEncoding="UTF-8"
  • 把 autoDeploy 属性改为 false:<Host name="localhost" appBase="webapps" 改为 <Host name="localhost" appBase="webapps" autoDeploy="false"
  • 配置虚拟目录:在 </Host> 上一行添加 <Context path="" docBase="/usr/local/apache-tomcat-8.5.92/webapps/app/" debug="0"/>
    • 虚拟目录挂载:app 目录也可以直接挂载到宿主机目录,这样部署的时候更方便,更新应用之后,重启 docker 即可完成部署,更直接的方式是重启 docker 中运行的 tomcat

设置编码:apache-tomcat-8.5.92/bin/catalina.sh

  • JAVA_OPTS 添加 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8
    修改之后是:JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"

相关文章

docker 相关