前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器 & 服务:Docker 应用的 Jenkins 构建

容器 & 服务:Docker 应用的 Jenkins 构建

作者头像
程序员架构进阶
发布2021-03-04 14:55:32
6460
发布2021-03-04 14:55:32
举报
文章被收录于专栏:架构进阶架构进阶

系列文章:

容器 & 服务:开篇,压力与资源

容器 & 服务:Jenkins 本地及 docker 安装部署

容器 & 服务:Jenkins 构建实例

容器 & 服务:一个 Java 应用的 Docker 构建实战

一 概述

上一篇文章,我们介绍了一个基于Idea 和 Docker插件来构建SpringBoot应用的实例。但严格来说,那只是个“玩具”,因为太过简陋,不具备任何实用价值。显然实际使用中,除了测试环境,几乎不可能只通过idea插件去创建一个应用的容器并直接提供单点、点对点的服务。

本章将结合之前的Jenkins基础,把应用改造为更接近真实场景的应用构建、发布过程。

二 回顾

再看一下这张图,是我们在demo中构建docker配置的内容,其中标红部分,是docker命令:

文本内容如下:

代码语言:javascript
复制
docker build -t dockerdemoapplication . && docker run -p 18080:8080 --name dockerdemoapplication dockerdemoapplication

这是我们的一个切入点。意味着,我们可以考虑把命令提出来,在Jenkins中执行构建镜像及创建容器、启动应用过程。

命令是通过&&连接,所以我们可以把命令分解为两个部分:

1)docker build -t dockerdemoapplication .

2)docker run -p 18080:8080 --name dockerdemoapplication dockerdemoapplication

其中1) docker build -t 命令创建镜像tag,名称为dockerdemoapplication;

2)docker run 命令启动容器,-p 18010:8080 参数指定了暴露端口;--name指定了容器名称。

三 本地执行

我们在本地分别执行上述两条命令,分别验证一下执行效果。

3.1 构建镜像

为了区分,镜像名称修改为dockerdemoapplication1

代码语言:javascript
复制
192:dockerdemo mine$  docker build -t dockerdemoapplication1 .
Sending build context to Docker daemon  557.1kB
Sending build context to Docker daemon  16.95MB
Step 1/7 : FROM openjdk:8u201-jdk-alpine3.9
 ---> 3675b9f543c5
Step 2/7 : MAINTAINER flamingstar <575912990@qq.com>
 ---> Using cache
 ---> edec2a37497c
Step 3/7 : ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
 ---> Using cache
 ---> 03a8d5f16036
Step 4/7 : VOLUME /tmp
 ---> Using cache
 ---> 46ee6c847a31
Step 5/7 : ADD target/dockerdemo-1.0.0-SNAPSHOT.jar dockerdemo.jar
 ---> Using cache
 ---> 7fd8e955168f
Step 6/7 : ENTRYPOINT ["java","-jar","/dockerdemo.jar"]
 ---> Using cache
 ---> 43b847a9121b
Step 7/7 : EXPOSE 8080
 ---> Using cache
 ---> fcf2e206b2e1
Successfully built fcf2e206b2e1
Successfully tagged dockerdemoapplication1:latest

执行完成后,在Docker的image列表中可以看到镜像:

3.2 运行

代码语言:javascript
复制
docker run -p 18080:8080 --name dockerdemoapplication1 dockerdemoapplication1


192:dockerdemo qingclass$ docker run -p 18080:8080 --name dockerdemoapplication1 dockerdemoapplication1
docker: Error response from daemon: driver failed programming external connectivity on endpoint dockerdemoapplication1 (2492e30f46e81b2ac634b0766c7a083bcec6176a3cb29bbfc96a3e7b9de14a4f): Bind for 0.0.0.0:18080 failed: port is already allocated.
ERRO[0000] error waiting for container: context canceled
代码语言:javascript
复制

报错,不过容易看到,是因为端口被占用导致的,我们把端口改为18011:8080再次执行(或在docker的container中停止并删除占用18080端口的容器):

代码语言:javascript
复制
192:dockerdemo qingclass$ docker run -p 18081:8080 --name dockerdemoapplication1 dockerdemoapplication1

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.7.RELEASE)

2021-02-22 09:53:17.520  INFO 1 --- [           main] c.f.docker.DockerDemoApplication         : Starting DockerDemoApplication v1.0.0-SNAPSHOT on ffc89aa508c0 with PID 1 (/dockerdemo.jar started by root in /)
2021-02-22 09:53:17.540  INFO 1 --- [           main] c.f.docker.DockerDemoApplication         : No active profile set, falling back to default profiles: default
2021-02-22 09:53:21.041  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-02-22 09:53:21.140  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-02-22 09:53:21.141  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.22]
2021-02-22 09:53:21.338  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-02-22 09:53:21.338  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3648 ms
2021-02-22 09:53:22.052  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-02-22 09:53:22.759  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-02-22 09:53:22.772  INFO 1 --- [           main] c.f.docker.DockerDemoApplication         : Started DockerDemoApplication in 6.585 seconds (JVM running for 7.799)

执行成功,本地浏览器通过18081端口访问:

四 Jenkins构建

4.1 Jenkins构建配置回顾

再回顾一下容器 & 服务:Jenkins 构建实例,我们构建示例工程时使用的构建脚本:

代码语言:javascript
复制
#!/bin/sh
. /etc/profile

mvn2package(){
    cd $WORKSPACE
    mvn clean install -DskipTests=true
    if [ $? -eq 0 ];then
        echo "mvn package is success!"
    else
        echo -e 'mvn package is Failed!' && exit 1
    fi
    sleep 2
}

mvn2package


上述shell中,重点的其实就是 mvn clean install -DskipTests=true 一句。根据上一章的分析,我们会把这里改为docker构建和启动容器的方式来发布应用。
代码语言:javascript
复制
#!/bin/sh
. /etc/profile

mvn2package(){
    cd $WORKSPACE
    docker build -t dockerdemoapplication1 .
    docker run -p 18081:8080 --name dockerdemoapplication1 dockerdemoapplication1
    if [ $? -eq 0 ];then
        echo "mvn package is success!"
    else
        echo -e 'mvn package is Failed!' && exit 1
    fi
    sleep 2
}

mvn2package

运行后执行日志如下:

4.2 问题分析

看起来似乎没有问题了,但眉头一皱,事情不可能这么简单。果然,任务构建卡死,这个圈一直再转。那么很容易判断,肯定是配置在jenkins中的deploy命令有问题,也就是上面的两条命令。

回头再看,docker run -p 18081:8080 --name dockerdemoapplication1 dockerdemoapplication1 是在控制台启动一个容器,并且会一直常驻,除非手动终止界面,所以造成卡死。这是个很low的问题,我们只要改成后台执行就可以了。

修改后的配置如下:

代码语言:javascript
复制
#!/bin/sh
. /etc/profile

mvn2package(){
    cd $WORKSPACE
    docker build -t dockerdemoapplication1 .
    docker run -d -t -p 18081:8080 --name dockerdemoapplication1 dockerdemoapplication1
    sleep 2
}

mvn2package
代码语言:javascript
复制

再次构建任务,很快构建成功,日志可见如下:

标红的部分是构建的主要内容,包括构建结果,创建镜像(打tag),并返回容器id。在终端查看docker进程,可以查到如下结果:

代码语言:javascript
复制
192:dockerdemo xxx$ docker ps|grep dockerdemo
f4b38bd4f331        dockerdemoapplication1   "java -jar /dockerde…"   7 minutes ago       Up 7 minutes        0.0.0.0:18081->8080/tcp    dockerdemoapplication1

确定容器已启动,浏览器访问:

至此,通过Jenkins构建docker镜像和启动容器成功,我们的demo又前进了一小步。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员架构进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 概述
  • 二 回顾
  • 三 本地执行
    • 3.1 构建镜像
      • 3.2 运行
      • 四 Jenkins构建
        • 4.1 Jenkins构建配置回顾
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档