OpenShift构建自动化-Tomcat8

应用容器化方式

  • 应用容器化,常见的方法有以下三种:
名称 举例 类别 适用场景 特点
本地构建 工程师编写Dockerfile,并手工在一台或多台主机上手工执行Docker Build命令构建应用镜像 人工 开发测试 简单
CI构建 Jenkins集群在CI流程中调用Maven执行构建,Maven 通过插件按指定的Dockerfile生成应用的镜像。 自动化 传统持续集成 常规CI方案
Source 2 Image OpenShift在隔离的容器环境中进行应用的构建编译并生成应用的容器镜像 自动化 容器及微服务场景下的持续集成 基于容器集群的CI方案
  • 每个开发团队均需要编写Dockerfile

  • 重复多次执行时间和人力成本陡增

  • 每个开发团队均需要编写Dockerfile

  • 微服务多语言多版本混合构建时无隔离

  • 构建资源池不可动态扩展

  • 资源利用率较低

  • 开发团队通过容器镜像精确定义构建环境

  • 基于容器的构建环境,提供更好的隔离性

  • 满足多语言多版本微服务混合构建的场景

  • 构建资源池可动态扩展,更灵活

  • 构建与应用运行共享资源池降低运维工作量

  • 资源按需投入及回收,利用率高

  • 第一种本地构建最常见,也比较简单,但效率太低。

  • 第二种方式是通过CI构建。这种方式则是比较传统的方法。需要指出的:CI/CD的实现,与容器并无必然的联系。在容器火之前,很多客户也基于Jenkins和虚拟机实现了CD/CD。只是容器轻量级的优势,更容易实现CI/CD。在红帽Openshift中,我们可以通过CI构建实现容器镜像。这种构建方式,实际上是在openshift中部署Jenkins
    Slave Pod,在Slave Pod实现构建。红帽提供四种Jenkins Slave
    Pod的镜像(根据应用开发语言的不同),有基于maven的,有基于nodejs的、基于.net的、也有基础镜像(使用者基于基础镜像进行构建)。

  • 第三种方式是通过S2I的方式构建应用镜像。这种方式有第二种方式构建的优点(构建好的应用客户实现CI),并且比第二种方式效率更高、适用多种开发语言。

S2I的应用容器化过程

  • S2I方式构建通常有6个步骤,下图为构建一个tomcat容器应用镜像示例:

1.装S2I命令行工具:
指的是在构建builder的rhel/centos主机上安装s2i的命令行工具
2.选定base image:
也就是说,我们选则一个最初的原始docker image。在基础镜像的选择上,也需要一些考量。比如:我可以选择一个docker.io上的tomcat 镜像直接用,也可以选择一个centos的docker image安装tomcat。
3.编写S2I脚本:
S2I有四个脚本。在S2I脚本的编写中,我的经验是采取“反推法”。也就是应用镜像运行起来,到底需要assmble和run做什么,这两个脚本就应该怎么写。 在这个阶段,我们还需要书写Dockerfile,准备基于第二步选定的base image构建新的builder image。Dockerfile中需要定义S2I脚本的拷贝和执行,base image的名称、和应用相关的一些目录权限、用户和权限等。
4.生成builder image。
5.选定源码库。
6.根据选定的代码地址和builder image,构建应用镜像并部署。

安装S2I命令行工具

下载地址:https://github.com/openshift/source-to-image/releases
curl -L -O https://github.com/openshift/source-to-image/releases/download/v1.1.8/source-to-image-v1.1.8-e3140d01-linux-amd64.tar.gz
tar zxvf source-to-image-v1.1.8-e3140d01-linux-amd64.tar.gz
mv s2i sti /usr/bin/
s2i version
./media/image2.png

选定base image

  • 基于S2I构建一个tomcat容器应用镜像

  • 选择centos的镜像,然后在dockerfile中指定安装tomcat

  • base image选择 openshift/base-centos7

编写S2I脚本并书写Dockerfile

  • 一个符合S2I/B2I的building image,在bin目录下,是需要包含如下四个脚本的:
assemble脚本: 这个脚本负责将外部代码库的代码下载到本地,并且进行编译打包。
run脚本: 这个脚本负责运行assemble编译好的应用。
save-artifacts脚本: save-artifacts脚本负责将构建所需要的所有依赖包收集到一个tar文件中。save-artifacts的好处是可以加速构建的过程。
usage脚本: usage脚本是告诉使用者如何使用镜像。
在S2I的四个脚本中,通常我们只会用到assemble和run两个脚本。实际上脚本的书写,和应用是关系很大的。

创建S2I目录结构

mkdir tomcat8-jdk8 && cd tomcat8-jdk8
mkdir -p .s2i/bin touch .s2i/bin/assemble.sh touch .s2i/bin/run.sh touch .s2i/bin/usage.sh
#也可以使用s2i create直接创建

配置assemble

请记住如下脚本中的”WAR’s copied”输出,这在后文中将作为应用build成功的标志。 assemble 脚本的作用,就是将代码库的代码,拷贝到\$CATALINA_HOME/webapps下去运行。\$CATALINA_HOME变量在dockerfile中被指定成/tomcat
echo “—> Installing application source…” cp -Rf /tmp/src/. \$CATALINA_HOME/webapps echo “WAR’s copied”

配置run

run脚本的作用,就是当build包的应用镜像部署成功以后,启动镜像中的tomcat应用。
\${CATALINA_HOME}/bin/catalina.sh run

配置usage

#!/bin/bash -e cat \<\<EOF This is not an application image, please refer this documentation on using this image https://github.com/debianmaster/openshift-s2i-example.git EOF

配置save-artifacts

#curl -o \$CATALINA_HOME/webapps/ROOT.war -O \${WAR_FILE_URL}
  1. 编写Dockerfile

    1. 指定base image并安装依赖包
vim tomcat8-jdk8/Dockerfile
FROM openshift/base-centos7 MAINTAINER Chen Fei (chenf\@inno-view.cn) ENV BUILDER_VERSION 1.1 RUN yum install wget -y; \ yum install tar -y; \ yum install unzip -y; \ yum install ca-certificates -y;\ yum install sudo -y;\ yum clean all -y ENV TOMCAT_MAJOR_VERSION 8 ENV TOMCAT_MINOR_VERSION 8.0.32 ENV CATALINA_HOME /tomcat

安装jdk和tomcat

# Install openjdk 1.8 RUN yum install java-1.8.0-openjdk.x86_64* -y && \ yum clean all -y && \ rm -rf /var/lib/apt/lists/* # INSTALL TOMCAT WORKDIR / RUN wget -q -e use_proxy=yes https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32.tar.gz && \ tar -zxf apache-tomcat-*.tar.gz &&\ rm -f apache-tomcat-*.tar.gz && \ mv apache-tomcat* tomcat ENV JAVA_OPTS=”-Dtuf.environment=DEV -Dtuf.appFiles.rootDirectory=/TempDirRoot”

创建用户、目录

RUN groupadd -r safe RUN useradd -r -g safe safe RUN mkdir -p /tomcat/webapps /TempDirRoot /usr/libexec/s2i /tmp/src RUN chmod -R 755 /tomcat /TempDirRoot /tmp/src /usr/libexec/s2i /tomcat/bin RUN chown -R 1001:1001 /tomcat /TempDirRoot /tmp/src /usr/libexec/s2i /tomcat/bin RUN chmod -R 777 /tomcat /TempDirRoot RUN cd /tomcat/webapps/; rm -rf ROOT docs examples host-manager manager COPY ./.s2i/bin/ /usr/libexec/s2i RUN chmod -R 755 /usr/libexec/s2i USER 1001 EXPOSE 8080 CMD \$STI_SCRIPTS_PATH/usage

生成builder image

生成builder image

命名名字为tomcat8-jdk8
docker build -t tomcat8-jdk8 .

验证builder image

docker run -it d67311e72289 /bin/bash
前面拷贝的文件都在
./media/image3.png

OpenShift使用builder image

上传到内部docker registry

docker tag tomcat8-jdk8:latest dtr.ivops.cn:5443/openshift-chenf/tomcat8-jdk8:latest
docker push dtr.ivops.cn:5443/openshift-chenf/tomcat8-jdk8:latest
./media/image4.png

创建Image Stream

要导入到openshift项目中,以使该Image Stream可以被其他项目引用
oc import-image dtr.ivops.cn:5443/openshift-chenf/tomcat8-jdk8 -n openshift –confirm –insecure
./media/image5.png
为了让openshift识别出这个镜像是S2I的Builder镜像,需要编辑刚刚导入的Image Stream。添加注解”tags”:”builder”
oc edit is tomcat8-jdk8
./media/image6.png
这样,在web控制台就能看到
./media/image7.png

选定代码库

示例使用GitHub上的代码
URL:https://github.com/debianmaster/sample-binaries.git
war中的内容:
./media/image8.tiff
查看war包中的index.html:
./media/image9.tiff
查看hello.jsp中的代码:
./media/image10.tiff

根据选定的代码和builder image,构建应用镜像并部署

进入project
oc project test
指定builder image的image stream和代码的git地址:
oc new-app tomcat8-jdk8~https://github.com/debianmaster/sample-binaries.git –name=’tomcat8-jdk8-war’
./media/image11.png

Build过程

第一部分:其实就是assemble脚本执行成功后的输出 第二部分:镜像构建成功以后,会先push到docker registry中
./media/image12.png

触发DC

再会根据build成功的镜像,触发dc,也就是部署一个应用的容器
./media/image13.png

部署完成

./media/image14.png

添加route

./media/image15.png
./media/image16.png

测试访问

dnsmasq添加解析
vim /etc/dnsmasq.d/local.conf
./media/image17.png
systemctl restart dnsmasq
./media/image18.png

生成Template

导出成yaml格式的template
oc export is,bc,dc,svc –as-template=tomcat8-jdk8 > ./tomcat8-jdk8.yml
导入
oc create -f tomcat8-jdk8.yml -n openshift
./media/image19.png