kubernetes学习:1.构建harbor镜像仓库

本文详细介绍了如何在CentOS 7.2上构建单机版Harbor镜像仓库,包括安装Docker和docker-compose,下载并配置Harbor离线安装包,以及启动和验证Harbor服务。接着,文章演示了如何推送和拉取镜像,包括更改Docker配置以适应Harbor的HTTP访问,以及推送和验证镜像到Harbor仓库的过程。

构建harbor镜像仓库

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,可以在测试和生产环境中部署harbor对业务上的镜像进行统一的管理。harbor 的官方网站如下所示:
https://vmware.github.io/harbor/cn/

一般来讲我们在生产环境部署harbor的时候需要使用多节点方案。将数据库从配置项中抽取出来,后端的镜像资源存储使用统一的共享资源(ceph分配的磁盘挂载到指定目录中)。前端可以使用nginx或者haproxy对多个harbor服务进行负载均衡。

本文搭建一个单机的harbor镜像仓库,体会对镜像进行上传和下载的过程。上述的复杂架构就是在此基础上的不断拓展。

构建harbor


构建环境

具体的构建过程主要分为以下几个步骤:

  • 操作系统: centos7.2
  • docker版本: 1.12.6
  • docker-compose: 1.9.0

首先安装docker服务:

[root@wecloud-test-harbor ~]# yum install docker -y

启动docker服务:

[root@wecloud-test-harbor ~]# systemctl start docker.service 
[root@wecloud-test-harbor ~]# systemctl enable docker.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

查看docker服务状态:

[root@wecloud-test-harbor ~]# systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 一 2018-03-26 22:33:04 CST; 12s ago
     Docs: http://docs.docker.com
 Main PID: 2311 (dockerd-current)
   CGroup: /system.slice/docker.service
           ├─2311 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-run...
           └─2318 /usr/bin/docker-containerd-current -l 

安装docker-compose:

[root@wecloud-test-harbor ~]# yum install docker-compose -y

下载harbor的离线安装包(离线的安装速度会比较快一些),下载地址如下:
https://storage.googleapis.com/harbor-releases/release-1.4.0/harbor-offline-installer-v1.4.0.tgz

解压harbor-offline-installer-v1.4.0.tgz:

[root@wecloud-test-harbor ~]# tar xvf harbor-offline-installer-v1.4.0.tgz

跳转到harbor目录,修改harbor.cfg配置文件:


[root@wecloud-test-harbor harbor]# grep "^[^#]" harbor.cfg 
# harbor的主机地址
hostname = 192.168.99.180
# 这里使用http协议,如果需要上传镜像,需要在docker.service文件中添加一个配置,后续会介绍到
ui_url_protocol = http
max_job_workers = 3 
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
secretkey_path = /data
admiral_url = NA
log_rotate_count = 50
log_rotate_size = 200M
#××××××××××××××××××邮件的配置信息××××××××××××××××××
email_identity = 
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false
email_insecure = false
#××××××××××××××××××邮件的配置信息××××××××××××××××××
# 管理员密码,管理员帐号为:admin
harbor_admin_password = Harbor12345
# 使用数据库存储认证信息
auth_mode = db_auth
# 配置ldap信息
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid 
ldap_scope = 2 
ldap_timeout = 5
ldap_verify_cert = true
self_registration = on
token_expiration = 30
project_creation_restriction = everyone
# 指定mysql数据库的信息
db_host = mysql
db_password = root123
db_port = 3306
db_user = root
# redis地址
redis_url =
clair_db_host = postgres
clair_db_password = password
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert
<think>我们有一个任务:在Jenkins的Freestyle项目中配置从Harbor拉取基础镜像(docker.io/tomcat:9.0.67-jdk8),然后使用Dockerfile添加WAR包构建新的镜像,并将新镜像推送到Harbor。步骤分解:1.准备环境:确保Jenkins服务器上已安装Docker,并且Jenkins用户有权限操作Docker(通常需要将Jenkins用户加入docker组)。2.在Jenkins中安装必要插件,例如Docker插件、Pipeline插件(虽然我们是Freestyle,但可能需要Docker相关支持)。3.配置Harbor仓库的凭据(Credentials)在Jenkins中,以便Jenkins可以拉取和推送镜像到Harbor。4.创建Freestyle项目,配置源码管理(例如Git,用于获取Dockerfile和WAR包)。5.构建步骤中添加执行Shell命令或使用Docker构建步骤来构建镜像。6.构建后推送镜像到Harbor。详细步骤:步骤1:环境准备-确保Jenkins服务器上已安装Docker,并且Jenkins用户(通常是jenkins)在docker组中(执行`sudousermod-aGdockerjenkins`后重启Jenkins服务)。步骤2:安装插件-在Jenkins中,进入“ManageJenkins”->“ManagePlugins”,确保已安装以下插件:-DockerPipeline(虽然名称是Pipeline,但其中的一些功能Freestyle也可用)-Docker(如果可用)-或者使用Shell命令直接操作Docker。步骤3:配置Harbor凭据-在Jenkins首页,点击“ManageJenkins”->“ManageCredentials”->“全局凭据”->“添加凭据”。-类型:选择“Usernamewithpassword”。-范围:保持默认。-用户名:Harbor仓库的用户名。-密码:Harbor仓库的密码。-ID:可以留空,Jenkins会自动生成,也可以自定义(例如harbor_cred)。-描述:可填写“HarborCredentials”。步骤4:创建Freestyle项目-点击“新建Item”,输入项目名称,选择“Freestyleproject”,然后点击“OK”。步骤5:配置源码管理-在“源码管理”部分,选择Git。-RepositoryURL:填写包含Dockerfile和WAR包的Git仓库地址。-如果需要认证,添加相应的Git凭据(可以是SSH密钥或用户名密码)。-指定分支(例如master)。步骤6:添加构建步骤-在“构建”部分,点击“增加构建步骤”,选择“Executeshell”(或“执行Shell命令”)。-在命令框中编写Shell脚本,步骤如下:1.登录Harbor(使用步骤3中配置的凭据)。2.构建Docker镜像(使用Dockerfile,其中基础镜像为docker.io/tomcat:9.0.67-jdk8)。3.将新镜像推送到Harbor。示例Shell脚本(假设Harbor地址harbor.example.com,项目为myproject,新镜像名为my-tomcat-app,版本为v1):```bash#登录Harbor,这里使用环境变量避免密码明文出现在脚本中(更安全的做法是使用Jenkins的凭据绑定)#但我们也可以使用之前添加的凭据,不过Jenkins的Shell环境不能直接使用凭据,需要先将凭据以环境变量形式注入,或者使用以下方式(不推荐在脚本中写密码):#更安全的方式:使用Jenkins的“绑定凭据”选项(在构建环境部分)将用户名和密码作为环境变量注入,然后在这里使用。#假设我们已经在构建环境部分注入了环境变量HARBOR_USER和HARBOR_PASSWORD#如果没有,我们可以通过以下方式(但会暴露密码,所以建议使用绑定凭据):#或者使用Jenkins的withCredentials步骤(但Freestyle不支持Pipeline语法),因此Freestyle中我们可以使用“Injectenvironmentvariablestothebuildprocess”插件来注入。#另一种方法:在构建步骤中直接使用我们之前添加的凭据ID(harbor_cred)来登录,但Shell步骤不能直接使用凭据ID,因此我们需要通过变量传入。#鉴于Freestyle项目的限制,我们可以这样:#在构建环境部分,勾选“Usesecrettext(s)orfile(s)”,然后添加绑定:#Variable:HARBOR_PASSWORD#Credentials:选择之前添加的Harbor凭据(注意:这里只能绑定密码,用户名需要另外绑定,或者我们直接使用凭据中的用户名和密码)#但是,Freestyle项目默认没有提供绑定环境变量的功能,需要安装插件“EnvironmentInjectorPlugin”。#安装插件后,在构建环境部分会有一个“Injectenvironmentvariablestothebuildprocess”的选项,我们可以在这里定义环境变量,但如何从凭据获取?#实际上,该插件支持从凭据文件注入,但比较复杂。#因此,我们可能采用另一种方法:在构建步骤中直接使用Docker登录命令,并通过读取Jenkins凭据文件来获取用户名和密码?这也不安全。#建议:在Jenkins服务器上先手动登录一次Harbor(使用`dockerloginharbor.example.com`),这样Docker会保存凭据在`~/.docker/config.json`中(注意是Jenkins用户的home目录)。这样在构建脚本中执行docker命令时就不需要再次登录。但这种方法在凭据变更时需要重新登录。#权衡之后,我们选择在脚本中直接登录,但需要避免密码暴露在日志中。我们可以使用Jenkins的“MaskPasswords”插件(或“CredentialsBinding”插件)来隐藏密码。#由于我们使用的是Freestyle,我们可以使用“CredentialsBinding”插件(安装插件“CredentialsBindingPlugin”)来绑定凭据。#安装后,在构建环境部分,勾选“Usesecrettext(s)orfile(s)”,然后点击“添加”->“Usernameandpassword(separated)”:#UsernameVariable:HARBOR_USER#PasswordVariable:HARBOR_PASSWORD#Credentials:选择之前添加的Harbor凭据。#然后,在构建步骤的Shell命令中,我们可以这样写:dockerlogin-u$HARBOR_USER-p$HARBOR_PASSWORDharbor.example.com#构建镜像dockerbuild-tharbor.example.com/myproject/my-tomcat-app:v1.#推送镜像dockerpushharbor.example.com/myproject/my-tomcat-app:v1#退出登录(可选)dockerlogoutharbor.example.com```但是,请注意:基础镜像是从docker.io拉取的,而我们的构建机器需要能够访问docker.io和Harbor。另外,Dockerfile中应该包含从基础镜像构建的指令,并且将WAR包复制到镜像中。假设Dockerfile内容如下(位于Git仓库根目录):```DockerfileFROMdocker.io/tomcat:9.0.67-jdk8COPYpath/to/your/app.war/usr/local/tomcat/webapps/```注意:请将`path/to/your/app.war`替换为WAR包在Git仓库中的实际路径。步骤7:保存并构建-保存项目,然后点击“BuildNow”进行构建。注意事项:-确保Jenkins服务器可以访问Harbor仓库(网络和DNS解析)。-确保Harbor仓库已存在项目myproject(如果没有,需要提前在Harbor中创建)。-如果Harbor使用的是HTTPS且自签名证书,需要在Jenkins服务器的Docker配置中添加信任(在/etc/docker/daemon.json中添加insecure-registries配置,并重启docker服务)。引用说明:在构建过程中,我们使用了Jenkins的凭据管理来安全地处理Harbor的认证信息[^1]。同时,通过Docker构建和推送命令,我们实现了镜像的自动化构建和部署[^2]。整个流程包括从源码管理获取Dockerfile和WAR包,构建镜像,并推送到私有仓库[^3]。相关问题:§§相关问题§§1.如何在Jenkins中安全地管理Docker登录凭据?2.如果Harbor使用自签名证书,Jenkins构建时出现证书错误应如何解决?3.如何优化Docker镜像构建过程以减少构建时间?</think>### Jenkins Freestyle项目配置:从Harbor拉取基础镜像构建并推送新镜像 以下是详细步骤,实现从Harbor拉取 `tomcat:9.0.67-jdk8` 基础镜像,添加WAR包构建新镜像并推送至Harbor: --- ### **步骤1:环境准备** 1. **Jenkins插件安装** - 必需插件:`Docker Pipeline`、`CloudBees Docker Build and Publish`(或使用Shell脚本) - 检查路径:`Manage Jenkins` → `Manage Plugins` → `Installed` 2. **服务器配置** - 确保Jenkins节点已安装Docker,且Jenkins用户有Docker操作权限: ```bash sudo usermod -aG docker jenkins # 添加Jenkins用户到docker组 sudo systemctl restart jenkins # 重启服务 ``` 3. **Harbor凭据配置** - `Manage Jenkins` → `Manage Credentials` → `全局凭据` → `添加凭据`: - 类型:`Username and password` - 用户名:Harbor账户名(如`admin`) - 密码:Harbor账户密码 - ID:`harbor_cred`(自定义唯一标识符) --- ### **步骤2:创建Freestyle项目** 1. **基础配置** - 项目名称:自定义(如`docker-image-builder`) - 描述:可选填 2. **源码管理(获取Dockerfile和WAR包)** - 选择Git/SVN: - Repository URL:代码仓库地址(含Dockerfile和WAR包) - Credentials:代码仓库认证凭据 - 分支:`*/main`(按需修改) 3. **构建环境** - 勾选`Use secret text(s) or file(s)` → 添加绑定: - 类型:`Username and password` - 凭据:选择`harbor_cred` - 变量:`HARBOR_USER` 和 `HARBOR_PASSWORD`(自动注入环境变量) --- ### **步骤3:构建脚本配置** 在**构建步骤**中选择`Execute shell`,输入以下脚本: ```bash #!/bin/bash # 登录Harbor echo $HARBOR_PASSWORD | docker login -u $HARBOR_USER --password-stdin harbor.your-domain.com # 拉取基础镜像 docker pull harbor.your-domain.com/library/tomcat:9.0.67-jdk8 # 构建新镜像(假设Dockerfile在代码根目录) docker build -t harbor.your-domain.com/your-project/new-image:${BUILD_NUMBER} . # 推送镜像到Harbor docker push harbor.your-domain.com/your-project/new-image:${BUILD_NUMBER} ``` > **关键说明**: > - `harbor.your-domain.com`:替换为实际Harbor地址 > - `your-project`:Harbor中的项目名称 > - `${BUILD_NUMBER}`:使用Jenkins构建号作为镜像标签(避免重复) > - Dockerfile示例内容: > ```dockerfile > FROM harbor.your-domain.com/library/tomcat:9.0.67-jdk8 > COPY ./your-app.war /usr/local/tomcat/webapps/ # 复制WAR包 > ``` --- ### **步骤4:验证与测试** 1. **手动触发构建** - 点击`Build Now`,在控制台查看日志: - 成功输出:`Login Succeeded`, `Successfully built`, `Pushed` 2. **检查Harbor仓库** - 登录Harbor Web界面 → 进入`your-project` → 确认新镜像存在(标签为构建号) --- ### **故障排查** - **权限问题**:确保Jenkins用户有`/var/run/docker.sock`的读写权限。 - **证书错误**:若Harbor使用HTTPS,需在Jenkins节点配置Docker信任证书: ```bash mkdir -p /etc/docker/certs.d/harbor.your-domain.com scp harbor-server:/certs/ca.crt /etc/docker/certs.d/harbor.your-domain.com/ ``` - **网络不通**:检查Jenkins节点能否解析Harbor域名并访问对应端口[^1]。 --- ### **优化建议** 1. **使用构建参数**: - 在项目配置中定义`IMAGE_TAG`参数,允许自定义镜像版本。 2. **清理旧镜像**: 在脚本末尾添加: ```bash docker rmi harbor.your-domain.com/your-project/new-image:${BUILD_NUMBER} ``` 3. **结合Kubernetes**: 结合Jenkins的Kubernetes插件动态创建Slave Pod,实现资源隔离[^1]。 --- ### 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值