docker(2) Dockerfile编写运行tomcat9

Dockerfile

  • 前言
  • dockerfile
    • Dockerfile
    • 时区设置
    • RUN指令
    • 其他指令
  • 编译
  • 运行
  • 总结

前言

上一章介绍了docker的背景,并执行了一个docker镜像,运行了容器,但是容器的镜像是如何实现的呢,简单介绍一下dockerfile。基于tomcat的war发布为例,其他jar部署同理,只是启动的方式差别。为了多使用dockerfile命令,使用ubuntu标准镜像为基镜像。

dockerfile

系统镜像以及容器运行的微系统基本上都是root,所以一般不存在权限问题。

Dockerfile

FROM ubuntu:latest     

#切换镜像目录,进入/opt目录
WORKDIR /opt

#设置时区,创建jdk8目录与tomcat9目录,这是镜像上增加
RUN echo 'Asia/Shanghai' >/etc/timezone && mkdir jdk8 && mkdir tomcat9

#将宿主机的jdk8拷贝到镜像去,也可以使用COPY
ADD jdk1.8.0_251 /opt/jdk8/
#将宿主机的tomcat9拷贝
ADD apache-tomcat-9.0.30 /opt/tomcat9/
#拷贝war
COPY ROOT.war /opt/tomcat9/webapps

#设置环境变量
ENV JAVA_HOME=/opt/jdk8
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH=/sbin:$JAVA_HOME/bin:$PATH

ENV CATALINA_HOME /opt/tomcat9
ENV PATH $CATALINA_HOME/bin:$PATH

#公开端口
EXPOSE 8080
#设置启动命令
ENTRYPOINT ["/opt/tomcat9/bin/catalina.sh","run","> /opt/tomcat9/logs/catalina.out"]

保存上面的文本命名为Dockerfile,记得首字母大写,拷贝到JDK8 tomcat9的目录
docker(2) Dockerfile编写运行tomcat9_第1张图片
确保在本机上路径与上面的宿主机Dockerfile的路径一致。

时区设置

构建docker镜像第一步要确认时区,不然时间不正确,会对业务,日志等造成极度的影响。首先运行ubuntu镜像,docker exec

发现没有,0区,格林威治时区,显然我不在这。使用

echo ‘Asia/Shanghai’ >/etc/timezone

即可设置好运行的时区,JDK就能识别正常的时区了

RUN指令

RUN指令执行时,注意:每执行RUN指令docker镜像就会加深一层,体积也会增大,所以尽量将多个指令通过 && 连接执行,或者 ; \ 同步执行。笔者这里使用了&&连接符。

其他指令

  1. 上面没有设置JVM参数,是因为JVM参数是变化的,生产测试不一样,不能直接在镜像生成,需要运行时外部传入
  2. 其中ADD其实有特殊含义,在压缩包的ADD时会自动解压,拷贝JDK与tomcat推荐使用,如果拷贝war或者jar推荐使用COPY替代,含义更明确。
  3. EXPOSE是必须的,意思是开放容器的8080端口
  4. ENTRYPOINT是执行指令,可以使用CMD,两者用法略有区别

编译

在cli命令界面执行

docker build . -t tomcat9:v1.0

编译即可生成镜像
在这里插入图片描述
当然docker的镜像这里手工执行的,一般会集成CI CD工具配合K8S管理自动发布管理。

运行

docker run -d --name tomcat9-demo -p 8080:8080 -v ~/logs:/opt/tomcat9/logs tomcat9:v1.0

在这里插入图片描述
访问http://localhost:8080/index.html
docker(2) Dockerfile编写运行tomcat9_第2张图片

总结

dockerfile的文件编写,官方有详细的教程,命令都有详细的说明:官方文档
Dockerfile只是镜像的制作的基础,镜像发布为容器还有很多问题要处理,比如:

  1. 容器日志收集
  2. 容器网络管理
  3. 容器调度
  4. 容器服务架构

你可能感兴趣的:(docker)