基于分层实现tomcat业务镜像
centos系统基础命令层
系统基础命令层通常放所需要的基础命令,以及可以添加业务服务所需要的启动用户
1、mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk},system/{ubuntu,centos,alpine}} -pv
2、cd /opt/dockerfile/system/centos/
3、root@test:/opt/dockerfile/system/centos# vim Dockerfile
#centos-7.7 base image
FROM centos:7.7.1908 #指定父镜像,基于哪个镜像进行自定义操作
LABEL maintainer="dongge 903660123@qq.com" #指定镜像构建者的姓名及邮箱
RUN yum install -y epel-release && yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
RUN groupadd www -g 2020 && useradd www -u 2020 -g www
4、root@test:/opt/dockerfile/system/centos# vim build_command.sh #创建镜像构建脚本
#!/bin/bash
docker build -t centos-base:7.7.1908 .
5、root@test:/opt/dockerfile/system/centos# bash build_command.sh #创建镜像
构建JDK基础层
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html #jdk-8u241下载地址
JDK基础层,只放JDK环境,不放代码等
1、cd /opt/dockerfile/web/jdk
2、mkdir jdk-8u241 #jdk基础层镜像也分各种不同版本的jdk
3、cd jdk-8u241/
4、cp /etc/profile .
5、vim profile #设置全局环境变量文件,针对所有用户生效
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=$JAVA_HOME/lib:JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PAT
6、root@test:/opt/dockerfile/web/jdk/jdk-8u241# vim Dockerfile
FROM centos-base:7.7.1908 #指定父镜像为系统基础命令层
LABEL maintainer="dongge 9036605123@qq.com"
ADD jdk-8u241-linux-x64.tar.gz /usr/local/src #ADD会自动解压tar包;二进制包需要在当前目录下
RUN ln -sv /usr/local/src/jdk1.8.0_241 /usr/local/jdk
ADD profile /etc/
ENV JAVA_HOME /usr/local/jdk #设置JAVA环境变量
ENV JRE_HOME /usr/local/jdk/jre
ENV CLASSPATH $JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH $JAVA_HOME/bin:$PATH
RUN ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #容器中的时区默认是UTC,需要进行修改,否则服务记录日志中的时间都是错误的;-f参数是强制覆盖原有软连接
7、vim build_command.sh
#!/bin/bash
docker build -t centos-jdk:8u241 .
8、bash build_command.sh
注意事项:
/etc/profile中的环境变量,只有通过ssh连接之后(或者在当前终端执行source /etc/profile)才会加载profile中定义的环境变量,容器进入时并未使用ssh(也没有使用source /etc/profile,加载文件中的变量),所以文件中的环境变量将无效,只能通过ENV设置环境变量;ENV设置的环境变量只对root生效,如果想对容器中的普通用户生效,则还需要把环境变量加入到/etc/profile中,当切换至普通用户时,会自动加载/etc/profile中的变量。
构建tomcat基础层
https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.51/bin/ #tomcat-8.5.51下载地址
此层只安装tomcat服务,不存放配置文件与代码
1、cd /opt/dockerfile/web/tomcat
2、mkdir tomcat-8.5.51-base #tomcat也会有多个版本
3、cd tomcat-8.5.51-base
4、vim Dockerfile
FROM centos-jdk:8u241
LABEL maintainer="dongge 9036605123@qq.com"
ADD apache-tomcat-8.5.51.tar.gz /apps #/apps目录不存在,会自动创建
RUN ln -sv /apps/apache-tomcat-8.5.51 /apps/tomcat #把tomcat二进制包做软连接,以后升级tomcat版本只需要删除软连接,再对新版本tomcat重新创建一个软连接
5、vim build_command.sh
#!/bin/bash
docker build -t centos-tomcat:8.5.51 .
6、bash build_command.sh
构建业务层
针对不同的业务层,需要构建不同的镜像;镜像层是存放业务代码以及tomcat配置文件
1、cd /opt/dockerfile/web/tomcat
2、mkdir tomcat-app1 #不同的业务,需要有不同的镜像
3、cd tomcat-app1
4、scp 192.168.3.200:/root/server.xml . #把tomcat的配置文件从别的服务器上拷贝过来
5、vim server.xml
<Host name="localhost" appBase="/data/tomcat/webapps" unpackWARs="false" autoDeploy="false"> #关闭自动解压war包,关闭自动部署,否则别人上传的war会被自动解压并运行
6、mkdir linux #创建一个存放代码的文件夹
7、echo "test docker tomcat app1" > linux/index.html
8、tar zcvf linux.tar.gz linux/*
9、vim Dockerfile
FROM centos-tomcat:8.5.51
LABEL maintainer="dongge 9036605123@qq.com"
ADD server.xml /apps/tomcat/conf
ADD linux.tar.gz /data/tomcat/webapps
ADD run_tomcat.sh /apps/tomcat/bin/
RUN chown www.www /apps/tomcat/ -R #修改tomcat目录的权限,否则普通用户没有权限启动catalina.sh以及记录日志
EXPOSE 8080 8005 8009 #暴露容器端口
CMD ["/apps/tomcat/bin/run_tomcat.sh"] #镜像启动为容器后,执行此脚本
10、vim run_tomcat.sh
#!/bin/bash
echo "nameserver 223.5.5.5" > /etc/resolv.conf #指定DNS服务器
su - www -c "/apps/tomcat/bin/catalina.sh start" #以www的身份启动tomcat
tail -f /etc/hosts #指定一个一直运行在前台的进程作为容器的守护进程
11、chmod a+x run_tomcat.sh
12、vim build_command.sh
#!/bin/bash
docker build -t tomcat-linux:app1 .
13、bash build_command.sh
注意事项:
后期如果还有业务,则只需要把tomcat-app1目录进行拷贝,然后做相应的修改即可
分层镜像的缺点
如果是中间的某一层,或者是系统基础命令层,少了一个命令,则系统基础命令层后面的每一层都需要重新做,这样才能传递业务层镜像。