前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >企业DevOps之路:Jenkins 集成 Harbor 自动发布镜像

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

作者头像
BUG弄潮儿
发布2022-04-15 15:39:15
2.4K0
发布2022-04-15 15:39:15
举报
文章被收录于专栏:JAVA乐园

1. 概述

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

大致流程说明:

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

2. Jenkins 脚本式发布镜像

  • 新建构建任务

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

  • 配置代码仓库
  • 上传成果物到服务器

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

代码语言:javascript
复制
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
  • 发布镜像
代码语言:javascript
复制
cd /home/huangjinjin/software/springdocker
docker build -t zwt:v1.0 .
docker login -u admin -p Harbor123 192.168.10.8
docker tag zwt:v1.0 192.168.10.8/omg/zwt:v1.0 
docker push 192.168.10.8/omg/zwt:v1.0
  • 创建 Dockerfile

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

代码语言:javascript
复制
/home/huangjinjin/software/springdocker

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

代码语言:javascript
复制
FROM openjdk:8-jre-slim
MAINTAINER huangjinjin "huangjinjin@qq.com"
ENV PARAMS=""
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /servers
ADD zwt-pestilence-web-RELEASE.jar app/zwt-pestilence-web-RELEASE.jar
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /servers/app/zwt-pestilence-web-RELEASE.jar $PARAMS"]

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

  • 构建并验证

执行 Jenkins 任务

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

3. Jenkins 插件式发布镜像

  • 安装 CloudBees Docker Build and Publish 插件

Manage Jenkins -> Manage Plugins

  • 添加凭证

Manage Jenkins -> Manage Credentials

创建一个 Harbor 的账密凭证。

  • 构建增加 Docker Build and Publish

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

  1. Build Context:构建上下文路径
  2. Dockerfile Path:Dockerfile 文件的路径

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

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

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

  • Docker 常见端口

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

  • 开启配置

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

代码语言:javascript
复制
vi /etc/default/docker

加入下面一行

代码语言:javascript
复制
DOCKER_OPTS="-H tcp://0.0.0.0:2375"

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

代码语言:javascript
复制
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS

重启docker即可

代码语言:javascript
复制
systemctl daemon-reload
systemctl restart docker

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

方法二

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

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

代码语言:javascript
复制
systemctl enable docker
Created 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

代码语言:javascript
复制
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

重启

代码语言:javascript
复制
systemctl daemon-reload
systemctl restart docker

方法三

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

代码语言:javascript
复制
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 服务

代码语言:javascript
复制
systemctl daemon-reload
systemctl restart docker

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

代码语言:javascript
复制
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 进程

代码语言:javascript
复制
[root@slaver2 ~]# ps -ef| grep docker
root      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 版本

代码语言:javascript
复制
 docker -H tcp://192.168.10.8:2375 version

查看镜像包

代码语言:javascript
复制
docker -H tcp://192.168.10.8:2375 images
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 概述
  • 2. Jenkins 脚本式发布镜像
  • 3. Jenkins 插件式发布镜像
  • 4. 附:开启Docker 的 Remote API 访问 2375端口
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档