docker之镜像分层

基于分层实现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目录进行拷贝,然后做相应的修改即可

分层镜像的缺点

如果是中间的某一层,或者是系统基础命令层,少了一个命令,则系统基础命令层后面的每一层都需要重新做,这样才能传递业务层镜像。
posted on 2020-07-14 21:15  An.amazing.rookie  阅读(358)  评论(0编辑  收藏  举报