Gitlab 多重构建镜像上传私有 Harbor与 Dockerhub

news2024/10/5 15:34:48

在这里插入图片描述

文章目录

    • 1. 预备条件
    • 2. 安装 docker
      • 2.1 安装 docker buidx
      • 2.2 docker 配置
      • 2.3 安装 Buildx
      • 2.4 安装模拟器
    • 3. 安装 git
    • 4. 安装 gitlab
    • 5. 部署 gitlab-runner
    • 6. 搭建 harbor
    • 7. 开发应用
    • 8. 配置 BuildKit
      • 8.1 Registry mirror
      • 8.2 设置镜像仓库正式
    • 9. 编写 .gitlabs-ci.yaml

1. 预备条件

三台虚拟机

  • 192.168.10.2 harbor 仓库
  • 192.168.10.3 gitlab-ce
  • 192.168.10.4 gitlab-runner
  • 192.168.10.5 开发平台

系统: CentOS Linux release 8.5.2111
CPU: 4c
内存:8G
磁盘:40G

2. 安装 docker

sudo yum install -y yum-utils  device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum list docker-ce --showduplicates | sort -r
sudo yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl start docker && sudo systemctl enable docker && sudo systemctl status docker

2.1 安装 docker buidx

buidx在gitlab runner 节点安装

默认的 docker build 命令无法完成跨平台构建任务,我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性,它能够创建多个 builder 实例,在多个节点并行地执行构建任务,以及跨平台构建。

2.2 docker 配置

docker客户端开启实验室特性。在客户端的配置文件~/.docker/config.json中加入如下配置项,如果~/.docker/config.json文件不存在,则创建该文件。

$ cat ~/.docker/config.json
{
	"experimental": "enabled"
}

# 确认实验室性能开启。
$ docker version

docker服务端开启实验室特性。在配置文件/etc/docker/daemon.json中加入如下配置项即可,如果/etc/docker/daemon.json文件不存在,则创建该文件。

$ cat /etc/docker/daemon.json
{
	"experimental": true
}

$ systemctl daemon-reload && systemctl restart docker
$ docker version

2.3 安装 Buildx

  • 首先从 Docker buildx 项目的 release 页面找到适合自己平台的二进制文件。
  • 下载二进制文件到本地并重命名为 docker-buildx,移动到 docker 的插件目录 ~/.docker/cli-plugins
wget https://github.com/docker/buildx/releases/download/v0.10.0/buildx-v0.10.0.linux-amd64
mkdir -p ~/.docker/cli-plugins
mv buildx-v0.9.1.linux-amd64 ~/.docker/cli-plugins/docker-buildx
chmod +x ~/.docker/cli-plugins/docker-buildx

如果想让其在系统级别可用,可将其拷贝至如下路径:

  • /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins

  • /usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins

确认安装成功

$ docker buildx version
github.com/docker/buildx v0.9.1 ed00243a0ce2a0aee75311b06e32d33b44729689

2.4 安装模拟器

安装模拟器的主要作用是让 buildx 支持跨 CPU 架构编译。

首先查看是否已经安装模拟器

$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  BUILDKIT PLATFORMS
default * docker
  default default         running 20.10.22 linux/amd64, linux/386

模拟器对饮的仓库名称是:tonistiigi/binfmt:latest,要确保内核在4.8以上,3.10.xx不支持,Centos 7 如何升级内核。

docker run --privileged --rm tonistiigi/binfmt --install all
installing: s390x OK
installing: arm OK
installing: ppc64le OK
installing: riscv64 OK
installing: mips64le OK
installing: mips64 OK
installing: arm64 OK
{
  "supported": [
    "linux/amd64",
    "linux/arm64",
    "linux/riscv64",
    "linux/ppc64le",
    "linux/s390x",
    "linux/386",
    "linux/mips64le",
    "linux/mips64",
    "linux/arm/v7",
    "linux/arm/v6"
  ],
  "emulators": [
    "qemu-aarch64",
    "qemu-arm",
    "qemu-mips64",
    "qemu-mips64el",
    "qemu-ppc64le",
    "qemu-riscv64",
    "qemu-s390x"
  ]
}

$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  BUILDKIT PLATFORMS
default * docker
  default default         running 20.10.22 linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6

3. 安装 git

  • 官方:安装 git
  • 博客: 安装 git

4. 安装 gitlab

  • 官方: 安装 gitlab
  • 博客:docker 安装 gitlab

5. 部署 gitlab-runner

  • 官方:https://docs.gitlab.com/runner/install/
  • 博客: 安装 gitlab runner

6. 搭建 harbor

官方:安装 harbor
博客:安装 harbor

7. 开发应用

  • kube operator demo (略)

8. 配置 BuildKit

如果您使用Buildx创建了一个docker-containerkubernetes构建器,您可以通过将--config标志传递给docker buildx create命令来应用自定义的BuildKit配置。

8.1 Registry mirror

您可以定义一个注册表镜像以用于您的生成。这样做会重定向BuildKit以从不同的主机名提取映像。以下步骤举例说明了如何将docker.io(Docker Hub)的镜像定义为mirror.gcr.io。

/etc/buildkitd.toml中创建一个TOML,包含以下内容:

debug = true
[registry."docker.io"]
  mirrors = ["mirror.gcr.io"]

debug = true打开BuildKit守护进程中的调试请求,该守护进程记录一条消息,显示何时使用镜像。

创建一个使用此BuildKit配置的docker-container构建器:

docker buildx create --use --bootstrap \
  --name mybuilder \
  --driver docker-container \
  --config /etc/buildkitd.toml

构建一个镜像

docker buildx build --load . -f - <<EOF
FROM alpine
RUN echo "hello world"
EOF

这个构建器的BuildKit日志现在显示它使用了GCR镜像。您可以通过响应消息包含x-goog-* HTTP头这一事实来判断。

docker logs buildx_buildkit_mybuilder0

输出:

...
time="2022-02-06T17:47:48Z" level=debug msg="do request" request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.8+unknown request.method=GET spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="fetch response received" response.header.accept-ranges=bytes response.header.age=1356 response.header.alt-svc="h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"" response.header.cache-control="public, max-age=3600" response.header.content-length=1469 response.header.content-type=application/octet-stream response.header.date="Sun, 06 Feb 2022 17:25:17 GMT" response.header.etag="\"774380abda8f4eae9a149e5d5d3efc83\"" response.header.expires="Sun, 06 Feb 2022 18:25:17 GMT" response.header.last-modified="Wed, 24 Nov 2021 21:07:57 GMT" response.header.server=UploadServer response.header.x-goog-generation=1637788077652182 response.header.x-goog-hash="crc32c=V3DSrg==" response.header.x-goog-hash.1="md5=d0OAq9qPTq6aFJ5dXT78gw==" response.header.x-goog-metageneration=1 response.header.x-goog-storage-class=STANDARD response.header.x-goog-stored-content-encoding=identity response.header.x-goog-stored-content-length=1469 response.header.x-guploader-uploadid=ADPycduqQipVAXc3tzXmTzKQ2gTT6CV736B2J628smtD1iDytEyiYCgvvdD8zz9BT1J1sASUq9pW_ctUyC4B-v2jvhIxnZTlKg response.status="200 OK" spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="fetch response received" response.header.accept-ranges=bytes response.header.age=760 response.header.alt-svc="h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"" response.header.cache-control="public, max-age=3600" response.header.content-length=1471 response.header.content-type=application/octet-stream response.header.date="Sun, 06 Feb 2022 17:35:13 GMT" response.header.etag="\"35d688bd15327daafcdb4d4395e616a8\"" response.header.expires="Sun, 06 Feb 2022 18:35:13 GMT" response.header.last-modified="Wed, 24 Nov 2021 21:07:12 GMT" response.header.server=UploadServer response.header.x-goog-generation=1637788032100793 response.header.x-goog-hash="crc32c=aWgRjA==" response.header.x-goog-hash.1="md5=NdaIvRUyfar8201DleYWqA==" response.header.x-goog-metageneration=1 response.header.x-goog-storage-class=STANDARD response.header.x-goog-stored-content-encoding=identity response.header.x-goog-stored-content-length=1471 response.header.x-guploader-uploadid=ADPycdtR-gJYwC7yHquIkJWFFG8FovDySvtmRnZBqlO3yVDanBXh_VqKYt400yhuf0XbQ3ZMB9IZV2vlcyHezn_Pu3a1SMMtiw response.status="200 OK" spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="do request" request.header.accept="application/vnd.docker.image.rootfs.diff.tar.gzip, */*" request.header.user-agent=containerd/1.5.8+unknown request.method=GET spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="fetch response received" response.header.accept-ranges=bytes response.header.age=1356 response.header.alt-svc="h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"" response.header.cache-control="public, max-age=3600" response.header.content-length=2818413 response.header.content-type=application/octet-stream response.header.date="Sun, 06 Feb 2022 17:25:17 GMT" response.header.etag="\"1d55e7be5a77c4a908ad11bc33ebea1c\"" response.header.expires="Sun, 06 Feb 2022 18:25:17 GMT" response.header.last-modified="Wed, 24 Nov 2021 21:07:06 GMT" response.header.server=UploadServer response.header.x-goog-generation=1637788026431708 response.header.x-goog-hash="crc32c=ZojF+g==" response.header.x-goog-hash.1="md5=HVXnvlp3xKkIrRG8M+vqHA==" response.header.x-goog-metageneration=1 response.header.x-goog-storage-class=STANDARD response.header.x-goog-stored-content-encoding=identity response.header.x-goog-stored-content-length=2818413 response.header.x-guploader-uploadid=ADPycdsebqxiTBJqZ0bv9zBigjFxgQydD2ESZSkKchpE0ILlN9Ibko3C5r4fJTJ4UR9ddp-UBd-2v_4eRpZ8Yo2llW_j4k8WhQ response.status="200 OK" spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
...

8.2 设置镜像仓库正式

如果您在BuildKit配置中指定了镜像仓库证书,则守护进程会将文件复制到/etc/buildkit/certs下的容器中。以下步骤显示如何将自签名镜像仓库证书添加到BuildKit配置。

  1. 将以下配置添加到/etc/buildkitd.toml
# /etc/buildkitd.toml
debug = true
[registry."myregistry.com"]
  ca=["/etc/docker/certs.d/myregistry.com/myregistry.crt"]
  [[registry."myregistry.com".keypair]]
    key="/etc/docker/certs.d/myregistry.com/myregistry.key"
    cert="/etc/docker/certs.d/myregistry.com/myregistry.cert"

这将告诉构建器使用指定位置(/etc/certs)中的证书将图像推送到 myregistry.com 仓库。

  1. 创建一个使用以下配置的docker-container构建器:
docker buildx create --use --bootstrap \
  --name mybuilder \
  --driver docker-container \
  --config /etc/buildkitd.toml

检查构建器的配置文件(/etc/buildkit/buildkitd.toml),它显示证书配置现在已在构建器中配置。

docker exec -it buildx_buildkit_mybuilder0 cat /etc/buildkit/buildkitd.toml
debug = true

[registry]

  [registry."myregistry.com"]
    ca = ["/etc/buildkit/certs/myregistry.com/myregistry.crt"]

    [[registry."myregistry.com".keypair]]
      cert = "/etc/buildkit/certs/myregistry.com/myregistry.cert"
      key = "/etc/buildkit/certs/myregistry.com/myregistry.key"

验证证书是否在容器中:

$ docker exec -it buildx_buildkit_mybuilder0 ls /etc/buildkit/certs/myregistry.com/
myregistry.crt    myregistry.cert   myregistry.key

现在,您可以使用此构建器推送到镜像仓库,它将使用证书进行身份验证:

$ docker buildx build --push --tag myregistry.com/myimage:latest .

构建并推送到 harbor 镜像仓库和 dockerhub

$ docker buildx build --platform linux/amd64,linux/arm64 -t $HARBOR_HOST/$HARBOR_PROJECT/$NMAE:dev-${CI_COMMIT_SHORT_SHA} -t docker.io/ghostwritten/$NMAE:dev-${CI_COMMIT_SHORT_SHA}  -f Dockerfile . --push

9. 编写 .gitlabs-ci.yaml

variables:
  PLATFORM: "linux/amd64,linux/arm64"
  HARBOR_HOST: "harbor.demo.com"
  HARBOR_PROJECT: "library"
 
image: docker:24.0.4

services:
  - docker:24.0.4-dind

stages:
  - build_push


build-push-dev-job:
  stage: build_push
  script:
    - docker buildx build --platform $PLATFORM -t $HARBOR_HOST/$HARBOR_PROJECT/xxxxxx:dev-${CI_COMMIT_SHORT_SHA} -t docker.io/ghostwritten/xxxxx:dev-${CI_COMMIT_SHORT_SHA}  -f Dockerfile-multi . --push
  only:
    - dev

参考:

  • Configure BuildKit
  • Install GitLab
  • Harbor Installation and Configuration

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Stream流对多个字段进行排序

谈起Java 8&#xff0c;不少熟悉它的人&#xff0c;都会知道有一个对我们帮助很大的新特性&#xff0c;没错&#xff0c;就是我们在项目中经常用到的stream&#xff0c;它对我们处理数据的过程中提供了很多的便利&#xff0c;而这边文章主要讲述stream的便利之一&#xff1a;对…

聊一聊Java抽象同步队列AQS

抽象同步队列AQS概述 AQS是锁的底层支持 AQS类图 由该图可以看到,AQS是一个FIFO的双向队列,其内部通过节点head和tail记录队首和队尾元素,队列元素的类型为Node。其中Node中的thread变量用来存放进入AQS队列里面的线程;Node节点内部的SHARED用来标记该线程是获取共享资源时…

考核:QTableWidget开发[折叠/展开单元格QTableWidgetItem]

目录 效果要求一、功能概述二、功能三、关系FATable 表NTable 表CTable 表 实现infos.hmain.cppcomplextablewidget.hcomplextablewidget.cppschemedialog.hschemedialog.cpp 源码模糊知识点 效果 要求 一、功能概述 二、功能 三、关系 FATable 表 CREATE TABLE fatable (idF…

UE4从零开始制作数字孪生道路监测平台

UE4从零开始制作数字孪生道路监测平台 UE4集成Cesium for Unreal和WebSocket&#xff0c;后端使用NodeJs搭建服务器进行数据模拟和真实数据实时转发。 1&#xff1a;新建UE4项目并集成Cesium for Unreal Cesium for UE4插件解锁了虚幻引擎中的3D地理空间生态系统。通过将高精…

基于FPGA的softmax函数优化及实现

文章目录 前言优化方案测试数据产生及Matlab结果处理流程工程说明功耗与面积标准softmax函数功耗与面积总结前言 FPGA异构计算是一个趋势,在AI推理、深度学习中广泛使用FPGA进行加速,减小系统延迟。而AI推理中有一个组件被广泛使用,各种网络模型中都有其身影,那就是激活函…

【雕爷学编程】Arduino动手做(152)---BMI160 六轴陀螺仪模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

走进Linux世界【三、Linux文件与路径】

第三章 Linux文件与路径 1、文件结构 ​ Windows和Linux文件系统区别 ​ 在windows平台下&#xff0c;打开“此电脑”&#xff0c;我们可以看到盘符分区 ​ 每个驱动器都有自己的根目录结构&#xff0c;这样形成了多个树并列的情形 ​ 但是在 Linux 下&#xff0c;我们是看…

创建和分析二维桁架和梁结构研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用完全分析

前言 上一个记录中的 虚拟地址里的虚拟内存区域没有说的很完全 这次补充一下 同时记录一些 物理地址空间 内存映射原理 最后直接通过进程使用函数完成虚拟空间到物理空间的映射 物理地址空间 物理地址是处理器在系统总线上看到的地址。使用RISC的处理器通常只实现一个物理地…

递归函数(详解+实战)

目录 递归函数介绍 递归函数的作用 案例&#xff1a;实现10以内阶乘 递归思想 递归的编写 斐波那契数列(实战) 循环实现 递归实现 递归函数介绍 递归函数是指在函数的定义中调用函数本身的过程。递归函数可以用于解决那些可以通过将大问题拆分为更小的相似子问题来解决的…

窗口看门狗 WWDG

窗口看门狗介绍 Q: 什么是窗口看门狗&#xff1f; A: 窗口看门狗用于监测单片机程序运行时效是否精准&#xff0c;主要检测软件异常(独立看门狗检测的是硬件异常)&#xff0c;一般用于需要精准检测&#xff08;独立看门狗不太精准&#xff09;程序运行时间的场合。 窗口看门狗…

MySQL数据库操作篇3(聚合函数分组查询)

通过MySQL提供的聚合函数&#xff0c;可以很方便的进行一些计算来辅助查询&#xff0c;所谓聚合函数就是将表中的数据统计后进行的某种处理 分组查询可以理解成将一张表按照某个属性分成多张表&#xff0c;属性值相同的在一张表里 比如说学生表&#xff0c;按照性别这个属性分组…

java+大数据实战 短链项目

一.前言 1.1课程大致包含技术 首先选这套课的目的是 包含了我所学的大部分技术 比如springboot ssm redis kafka flink clickhouse 等 1.2 外界客观原因 就业环境一般 目前来看暂时还没但是有后续潜在的毕业 或者 离职 1.3技术追求 个人的技术追求暂时是在技术总监 技术…

vue3功能实现

在vue2中&#xff0c;要实现一些方法&#xff08;增删改查&#xff09;一般都是写在一起的。如下图所示&#xff1a; 但是在vue3中&#xff0c;实现一个方法需要用到很多文件。 方法定义方法如下&#xff1a; export function classSign(phone: string) {return sign_reques…

TypeScript基础篇 - 类型的思考方式

目录 重新认识&#xff1a;什么是类型&#xff1f; 类型是人类的思考方式 类型是错误检查的利器 总结&#xff1a;为什么我们用TS&#xff1f; 一张ai生成图~ 重新认识&#xff1a;什么是类型&#xff1f; 汽车可以跑怎么理解&#xff1f; car.run() 【面向对象】car imp…

【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

微服务架构Ribbon与OpenFeign的使用 【快速入门】

一、实现负载均衡&#x1f349; 1.什么是负载均衡&#x1f95d; 通俗的讲&#xff0c; 负载均衡就是将负载&#xff08;工作任务&#xff0c;访问请求&#xff09;进行分摊到多个操作单元&#xff08;服务器,组件&#xff09;上进行执行。 根据负载均衡发生位置的不同,一般分…

Terraform(一)

IaC 自动化配置与编排神器 - Terraform 1. 相关概念1.1 什么是 IaCIaC 的两种实现方式IaC 的好处IaC 优点IaC 工具为什么 IaC 对 DevOps 很重要&#xff1f; 1.2 什么是 Terraform1.3 Terraform 的主要特性1.4 Terraform 架构1.5 Terraform 核心概念1.6 Terraform 生命周期1.7 …

高等数学❤️第一章~第二节~极限❤️无穷小量与无穷大量~无穷小量概念及其性质与比较详解

【精讲】高等数学中的无穷小量概念及其性质与比较 博主&#xff1a;命运之光的主页 专栏&#xff1a;高等数学 目录 【精讲】高等数学中的无穷小量概念及其性质与比较 导言 一、无穷小量的概念 二、无穷小量的性质 三、无穷小量的比较 四、无穷小量的应用 必需记忆知识点…