Dockerfile
前言
上一章介绍了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的目录
确保在本机上路径与上面的宿主机Dockerfile的路径一致。
时区设置
构建docker镜像第一步要确认时区,不然时间不正确,会对业务,日志等造成极度的影响。首先运行ubuntu镜像,docker exec
发现没有,0区,格林威治时区,显然我不在这。使用
echo ‘Asia/Shanghai’ >/etc/timezone
即可设置好运行的时区,JDK就能识别正常的时区了
RUN指令
RUN指令执行时,注意:每执行RUN指令docker镜像就会加深一层,体积也会增大,所以尽量将多个指令通过 && 连接执行,或者 ; \ 同步执行。笔者这里使用了&&连接符。
其他指令
- 上面没有设置JVM参数,是因为JVM参数是变化的,生产测试不一样,不能直接在镜像生成,需要运行时外部传入
- 其中ADD其实有特殊含义,在压缩包的ADD时会自动解压,拷贝JDK与tomcat推荐使用,如果拷贝war或者jar推荐使用COPY替代,含义更明确。
- EXPOSE是必须的,意思是开放容器的8080端口
- 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
总结
dockerfile的文件编写,官方有详细的教程,命令都有详细的说明:官方文档
Dockerfile只是镜像的制作的基础,镜像发布为容器还有很多问题要处理,比如:
- 容器日志收集
- 容器网络管理
- 容器调度
- 容器服务架构