企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

  1. 概述

在实际生产中,如果进行手动发布镜像到 Harbor,那么实在太 low 了。实际中,一般会结合 Jenkins 的流水线,进行自动构建和发布。

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

大致流程说明:

  • 开发人员每天把代码提交到 Gitlab 代码仓库
  • Jenkins 从 Gitlab 代码仓库中拉取项目源码,进行编译并打成 jar 包;然后构建成 Docker 镜像,将镜像推送到 Harbor 私有镜像仓库
  • Jenkins 发送 SSH 远程命令,让生成部署服务器从 Harbor 私有镜像仓库中拉取镜像到本地;然后创建容器
  • 最后用户可以访问到容器

  • Jenkins 脚本式发布镜像

  • 新建构建任务

新建Item -> 构建一个Maven项目

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像
  • 配置代码仓库

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像
  • 上传成果物到服务器

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

因 Jenkins 部署在 Windows 操作系统,所以采用批处理脚本。请根据 Jenkins 部署的操作系统的情况使用 batch command 或者 shell。

C:\jenkins\pscp.exe -r -l root -pw root %WORKSPACE%/zwt-pestilence/zwt-pestilence-web/target/zwt-pestilence-web-RELEASE.jar 192.168.10.8:/home/huangjinjin/software/springdocker
  • 发布镜像

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像
cd /home/huangjinjin/software/springdockerdocker build -t zwt:v1.0 .docker login -u admin -p Harbor123 192.168.10.8docker tag zwt:v1.0 192.168.10.8/omg/zwt:v1.0docker push 192.168.10.8/omg/zwt:v1.0
  • 创建 Dockerfile

构建后的 jar 上传到如下路径

/home/huangjinjin/software/springdocker

所以在该路径下创建 Dockerfile 文件,内容如下:

FROM openjdk:8-jre-slimMAINTAINER huangjinjin "huangjinjin@qq.com"ENV PARAMS=""ENV TZ=PRCRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneWORKDIR /serversADD zwt-pestilence-web-RELEASE.jar app/zwt-pestilence-web-RELEASE.jarENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /servers/app/zwt-pestilence-web-RELEASE.jar $PARAMS"]

Dockerfile 文件的内容根据实际项目情况进行修改。

  • 构建并验证

执行 Jenkins 任务

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

登录 Harbor 查看是否推送镜像到 Harbor 镜像仓库成功

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像
  1. Jenkins 插件式发布镜像

  2. 安装 CloudBees Docker Build and Publish 插件

Manage Jenkins -> Manage Plugins

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像
  • 添加凭证

Manage Jenkins -> Manage Credentials

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

创建一个 Harbor 的账密凭证。

  • 构建增加 Docker Build and Publish

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

在点击 高级选项中可以设置

  1. Build Context:构建上下文路径

  2. Dockerfile Path:Dockerfile 文件的路径

根据实际情况配置,配置如下:

企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

经过以上设置,即可进行 Jenkins 任务执行,构建镜像。

  1. 附:开启Docker 的 Remote API 访问 2375端口

  2. Docker 常见端口

2375:未加密的docker socket,远程root无密码访问主机2376:tls加密套接字,很可能这是您的CI服务器4243端口作为https 443端口的修改2377:群集模式套接字,适用于群集管理器,不适用于docker客户端5000:docker注册服务4789和7946:覆盖网络

  • 开启配置

方法一(该方法没有验证通过)

vi /etc/default/docker

加入下面一行

DOCKER_OPTS="-H tcp://0.0.0.0:2375"

修改 /usr/lib/systemd/system/docker.service 配置文件

EnvironmentFile=-/etc/default/dockerExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS

重启docker即可

systemctl daemon-reloadsystemctl restart docker

这种简单配置让 Docker Daemon 把服务暴露在 tcp 的 2375 端口上,这样就可以在网络上操作 Docker 了。Docker 本身没有身份认证的功能,只要网络上能访问到服务端口,就可以操作 Docker。

方法二

/usr/lib/systemd/system/docker.service,配置远程访问。

产生 /usr/lib/systemd/system/docker.service配置文件

systemctl enable dockerCreated symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

在 [Service] 这个部分的 ExecStart,加上 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

vi /usr/lib/systemd/system/docker.service[Service]ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

重启

systemctl daemon-reloadsystemctl restart docker

方法三

修改 /etc/docker/daemon.json的配置

vi /etc/docker/daemon.json{ "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}

“tcp://0.0.0.0:2375″:tcp socket,表示允许任何远程客户端通过 2375 端口连接 Docker Daemon。

“unix:///var/run/docker.sock”:unix socket,本地客户端将通过这个来连接 Docker Daemon。

修改配置后,然后让 Docker 重新读取配置文件,并重启 Docker 服务

systemctl daemon-reloadsystemctl restart docker

在启动时,可能报如下错误

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

是因为 Docker 的 socket 配置 hosts 出现了冲突。解决办法是编辑 /usr/lib/systemd/system/docker.service配置文件,

ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock 修改为 ExecStart=/usr/bin/dockerd;再次启动即可。

查看 docker 进程

[root@slaver2 ~]# ps -ef| grep dockerroot      44221      1  1 18:16 ?        00:00:06 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

Docker 守护进程打开一个 HTTP Socket,才能实现远程通信。

  • 验证

-H 为连接目标主机 Docker 服务

查看 Docker 版本

docker -H tcp://192.168.10.8:2375 version

查看镜像包

docker -H tcp://192.168.10.8:2375 images

Original: https://www.cnblogs.com/happyhuangjinjin/p/16129508.html
Author: BUG弄潮儿
Title: 企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579812/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • windows javaee 安装

    一. 下载jdk 并安装 二. 配置环境变量 JAVA_HOME:D:\Java\jdk1.8.0_25 CLASSPATH :.;%JAVA_HOME%\lib;%JAVA_HO…

    Java 2023年5月29日
    079
  • 踩到一个关于分布式锁的非比寻常的BUG!

    你好呀,我是歪歪。 提到分布式锁,大家一般都会想到 Redis。 想到 Redis,一部分同学会说到 Redisson。 那么说到 Redisson,就不得不掰扯掰扯一下它的&#8…

    Java 2023年6月5日
    064
  • SQL Server2008安装详细教程

    链接 posted @2022-07-05 22:17 叫我小锅锅 阅读(64 ) 评论() 编辑 Original: https://www.cnblogs.com/lhboke…

    Java 2023年6月5日
    078
  • Netty源码分析之自定义编解码器

    在日常的网络开发当中,协议解析都是必须的工作内容,Netty中虽然内置了基于长度、分隔符的编解码器,但在大部分场景中我们使用的都是自定义协议,所以Netty提供了 MessageT…

    Java 2023年6月9日
    080
  • 数组判断任意出现的重复值

    1、题目背景 给你一个整数数组nums,如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false 2、代码实现 public class Solut…

    Java 2023年6月8日
    081
  • JDK成长记15:从0分析你不知道的synchronized底层原理(上)

    前几节你应该已经了解和掌握了Thread、ThreadLocal、Volatile这几个并发基础知识的底层原理。这一节,你可以跟我一起深入了解下synchronized关键字的底层…

    Java 2023年6月5日
    0100
  • Skywalking-10:Skywalking查询协议——GraphQL

    GraphQL GraphQL 基础 参照Getting started with GraphQL Java and Spring Boot这篇文章学习即可 PS:可以使用 bre…

    Java 2023年6月5日
    087
  • Java内部DNS查询实现和参数设置

    一、Java内部DNS查询 Java使用域名查询时,用的自己内部的域名实现机制,最后都是交给InetAddress去做DNS解析。 二、JNDI DNS服务提供者设置(JNDI D…

    Java 2023年5月29日
    063
  • Java 并发编程

    基础知识 1. 为什么要使用并发编程 提升多核CPU的利用率:一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论 上讲操作系统可以将多个线程分配给不同的CPU去执行…

    Java 2023年6月9日
    0171
  • JavaWeb中过滤器Filter的url-pattern设置

    源码 https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Filter-UrlPattern Fil…

    Java 2023年5月29日
    077
  • restcontroller和controller区别

    RestController的作用相当于Controller加ResponseBody共同作用的结果,但采用RestController请求方式一般会采用Restful风格的形式。…

    Java 2023年6月14日
    077
  • 【解决方案】Java获取文件字符集格式

    背景: excel格式,不管是.xlx 还是 .xlsx, 每个单元格cell都有容量限制,最大容量是32767字节,不满足我们的需求,所以我们使用逗号分隔值文件,即.csv格式,…

    Java 2023年5月29日
    072
  • MSSQL中游标的语法结构

    | 0.21分钟 | 342.4字符 | 1、引言&背景 2、开箱即用的游标结构 3、声明与参考资料 | SCscHero | 2022/4/30 PM10:3 | 系列 …

    Java 2023年6月5日
    063
  • Kubernetes-Ingress

    1. 简介 Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。 I…

    Java 2023年6月7日
    076
  • LEDE 虚拟机安装

    虽然我对路由器没什么兴趣,但是紧跟潮流还是有必要的,现在因为网络闭关锁国政策,很多人都想自己搭配一台私人的服务器,不想被商业公司左右数据安全。我感觉这个是一个商机,建议大家可以朝这…

    Java 2023年5月30日
    085
  • 反射和注解

    1.1 类加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出意外情况,JVM将会连续完成这三个步…

    Java 2023年6月6日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球