写点什么

持续集成容器篇:Docker 与自动化打包

作者:知了一笑
  • 2022 年 3 月 15 日
  • 本文字数:3059 字

    阅读完需:约 10 分钟

持续集成容器篇:Docker与自动化打包

前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S 相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作;本篇文章主要描述 Docker 基础用法和自动化打包过程


一、Docker 简介

1、基础描述

Docker 作为开源的应用容器引擎,可以把应用程序和其相关依赖打包生成一个 Image 镜像文件,是一个标准的运行环境,提供可持续交付的能力,通过镜像文件可以创建多个 Docker 容器,这里可以理解为类创建对象的原理;镜像文件可以推送到仓库 Repository 中,这里可以理解为 Git 仓库管理代码的原理。


2、核心概念


  • Image 镜像:包含应用和依赖的类库,配置等;

  • Container 容器:通过镜像文件创建多个容器,运行打包应用;

  • Repository 仓库:存放镜像文件的云端服务;


镜像文件与容器,可以理解为基于快照启动虚拟机;或者类与实例对象的关系。

3、架构原理


Docker 基于客户端-服务器的架构模式,Docker 的守护进程(daemon)监听客户端的请求命令,从而管理镜像文件、容器等。

二、管理命令

1、查 docker 信息

# 查看基础信息docker info
# 查看版本信息docker version
# 查看命令说明docker --help
复制代码

2、镜像文件

基础命令


# 查看本地镜像列表docker images  或者 docker image ls
# 搜索镜像docker search ImageName
# 拉取镜像docker image pull ImageName
# 删除镜像docker image rm ImageName
复制代码


推送仓库


首先在云服务平台申请私有的镜像管理仓库,并配置好访问仓库的账号和密码,通过 docker 命令把本地镜像文件推送到该仓库,这里以阿里云为例:


# 1、登录仓库docker login --username=账户名 仓库_url
提示输出仓库密码:Login Succeeded
# 2、查看本地镜像docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcloud-app latest b11d221cc3e0 13 seconds ago 662MB
# 3、标记上述镜像docker tag b11d221cc3e0 仓库_url/cicada-image/cloud-app:latest
# 4、执行推送命令docker push 仓库_url/cicada-image/cloud-app:latest
# 5、拉取该镜像到本地docker pull 仓库_url/cicada-image/cloud-app:latest
复制代码


注意:cicada-image是仓库的命名空间,点击cloud-app可以查看镜像操作的步骤文档:


3、容器管理

# 列出正在运行或运行过的容器docker ps -a
# 停止容器运行docker stop 容器ID
# 删除指定容器docker rm 容器ID
# 删除全部暂停容器docker rm -f $(docker ps -a -q)
复制代码

4、入门案例

- 拉取hello-world镜像docker image pull hello-world
输出日志:Using default tag: latestlatest: Pulling from library/hello-world
- 查看本地镜像docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest feb5d9fea6a5 7 weeks ago 13.3kB
- 运行hello-worlddocker container run hello-world
输出日志:Hello from Docker!This message shows that your installation appears to be working correctly.
复制代码

三、构建镜像

1、Dockerfile

Dockerfile 是一个文本文档,包含构建 Docker 镜像的指令,通过读取该脚本中的指令并执行,完成相关 build 过程。


注意事项


  • 脚本命名 Dockerfile 并且没有任何后缀;

  • Docker 在构建镜像时,默认识别该文件;

  • 通常脚本文件放在打包工程的根目录下;

2、基础样例

语法说明


  • FROM:指定需要使用的基础镜像;

  • MAINTAINER:定义脚本维护者;

  • VOLUME:指定持久化文件目录;

  • WORKDIR:切换到工作目录;

  • ADD:将指定文件添加到容器中;

  • COPY:将指定文件复制到容器中;

  • RUN:镜像构建时执行的命令;

  • ENTRYPOINT:容器参数配置;


使用案例


# 基础镜像FROM java:8
# 维护者MAINTAINER cicadasmile
# 持久化目录VOLUME /data/docker/logs
# 添加应用服务JAR包ADD auto-client.jar application.jar
# 配置参数ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]
复制代码

3、构建镜像

项目打包


这里获取 maven 项目打包后的 jar 包,即auto-client.jar包,然后复制到 docker 镜像制作的目录下,与 Dockerfile 在同一级。


结构如下



镜像构建命令


docker build -t client-img:latest .
复制代码


构建流程执行完之后,查看镜像列表,上面构建的镜像已经存在;

4、运行容器

# 执行命令docker run -d -p 8079:8079 client-img:latest
# 查看日志docker logs 容器ID
复制代码


访问容器中应用的接口,查看响应正常即可。

四、自动化打包

微服务架构是当前主流的技术选型,在业务具体落地时,会存在很多业务服务,不管是在开发、测试、上线的任意节点中,如果基于手动编译的方式打包服务,操作成本不仅极高,而且很容易出现纰漏。


通过 Pipeline 流水线的方式,将服务镜像构建编排成一键触发执行,实现自动化的管理流程,是微服务架构中的必要的功能模块。

五、流程设计

本篇中的流程节点,主要针对打包好的应用Jar包,在 docker 模块中的处理流程,主要是镜像构建管理与容器运行:



  • 构建 docker 文件目录与内容;

  • 拷贝Jar包,创建Dockerfile脚本文件;

  • 执行 docker 镜像构建,推送云仓库;

  • 拉取镜像文件并运行 docker 容器;


整个流程的都放在 Pipeline 流水线中,衔接在本地 Jar 包生成之后。

六、实现过程

1、插件安装

首先安装流程中 Docker 集成的相关插件:Docker PipelineDocker pluginCloudBees Docker Hub/Registry Notification


在之前的流水线篇幅中,已经通过流水线完成 Gitee 仓库代码 pull 和本地打包,下面开始处理 docker 环节。

2、镜像构建脚本

关于 Dockerfile 的脚本语法也可以参考之前 docker 篇幅,下面看流水线中的用法:


    environment {        docker_directory = 'docker-app'        docker_repository = '仓库URL'    }            stage('Dockerfile') {            steps {                sh '''                rm -rf ${docker_directory}                mkdir -p ${docker_directory}                cp auto-client/target/auto-client-1.0-SNAPSHOT.jar ${docker_directory}/auto-client.jar                cd ${docker_directory}cat>Dockerfile<<EOFFROM java:8MAINTAINER cicadasmileVOLUME /data/docker/logsADD auto-client.jar application.jarENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]EOF                cat Dockerfile                '''                echo "create Dockerfile success"            }        }
复制代码


脚本说明:


  • 在流水线的工作空间创建目录docker-app

  • 每次执行都清空一次 docker 目录,再把 Jar 包和 Docker 脚本放进去;

  • cat-EOF-EOF:即创建 Dockerfile 文件,并把中间的内容写入;

  • 脚本中的内容必须在文件中顶行写入;

3、打包推送

这里即进入 docker 目录,执行镜像打包的操作,并把镜像推送到云端仓库,很多仓库都是私有的,需要身份验证,通过配置凭据去访问:


stage('DockerImage'){    steps {        script {            dir("${docker_directory}") {                sh 'ls'                docker.withRegistry("${docker_directory}", '访问凭据') {                   docker.build("doc-line-app:latest").push()                }            }            echo "build DockerImage success"        }    }}
复制代码

4、凭据配置

打开Manage Jenkins界面,Manage Credentials选项;



按如下流程配置即可:


七、源代码地址

GitEE·地址https://gitee.com/cicadasmile/butte-auto-parentWiki·地址https://gitee.com/cicadasmile/butte-java-note
复制代码



发布于: 2022 年 03 月 15 日阅读数: 51
用户头像

知了一笑

关注

公众号:知了一笑 2020.04.08 加入

源码仓库:https://gitee.com/cicadasmile

评论

发布
暂无评论
持续集成容器篇:Docker与自动化打包_Docker_知了一笑_InfoQ写作平台