【DevOps实战系列】第六章:详解Docker私服Nexus3篇

news2025/1/10 23:35:30

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

在这里插入图片描述

概述/目标

私服我们很熟悉了,比如docker hub就是官方私服,而有些情况比如我们自建的镜像,不想往外传,就需要考虑内部搭建一个私有服务器来存放私有的镜像。

Harbor是一个比较成熟且图形界面功能比较完善,而nexus从2升级到3后,做了很大的更改,其中就包括可以作为docker镜像的私服。在这里我们两种私服都讲一下。本节先来看看Nexus3的搭建及原理。

目标:搭建docker私服将应用在jenkins构建完docker镜像后,优先上传到私服,而后部署容器时从私服拉取,这样我们搭建微服务集群的效率就会很高。

在实际生产中,我们一般采用k8s(docker集群化),这样的话如果没有私服,那么假设有3台k8s集群,那么构建镜像的主机可能是任意一个或者是都参与,那么每个主机本地都存一分镜像就会太过冗余,而如果由首次构建镜像的主机上传到私服,而其他主机直接拉取就会很快,并且镜像都在私服也方便管理,更加安全和方便治理。

Docker的概念:在docker的概念中,如果要登录私服,私服必须是https协议服务才能进行正常鉴权,当然docker没那么傻,并没有规定那么死,

只不过出于安全考虑他期望是https,当然如果你有从CA认证机构购买的证书,当然一定要使用https,这样直接配置证书,证书是可以正常验证的;

而如果你使用的是自签发证书或者只有http的仓库服务,那么docker允许你将仓库加入到信任列表,即需要将仓库配置到要连接仓库的docker服务对应的daemon.json

"insecure-registries":[
	"10.10.1.199:9082", # 提交时的hosted仓库
	"10.10.1.199:9083", # 拉取时用的group仓库
]

这样配置好后,即便是http仓库或是自签发证书的https都可以正常登录。

允许docker使用Nexus账号登录私服:说到这里顺便也讲一下docker登录私服的账号,既然docker login到私服,那肯定是需要账号,

默认Nexus是不允许docker使用Nexus的管理账号登录的

需要管理员开启该功能:"设置"->"Security"->"Realms"->"Docker Bearer Token Realm",激活该选项即可。

我们先拿Nexus3来搭建一个提供http服务的私服,再用Harbor搭建一个自签发证书的https私服,显然我是没有花钱买过证书的,

当然免费证书现在也是很多中小型公司比较青睐的,使用率比较高的比如:Let’s Encrypt,大家可以自行申请,但前提是要有一个可以绑定的域名才行。

Nexus3私服搭建

在【DevOps实战系列】第三章:详解Maven仓库及环境搭建中我们已经搭建好了Nexus3服务器,这里我们就直接复用了,其实他和maven的概念基于相同,区分group、hosted、proxy这几种类型的仓库,只不过Nexus3默认安装后并没有自动给我们创建这些仓库,而是需要我们手动自己创建。

官方地址:https://help.sonatype.com/repomanager3/nexus-repository-administration/formats/docker-registry

Docker容器部署

准备工作:我们在安装Nexus容器时,只映射了一个端口9081->8081

在这里插入图片描述

而根据官网描述,docker仓库不能在上下文路径基础上提供服务,也就意味着我们需要单独提供一个端口为docker仓库服务使用,

根据官网描述,每个hosted仓库都建议有一个独占的端口用于接收客户端镜像的提交,而使用一个端口给group的仓库用于客户端从私服拉取镜像,

所以我们这里至少要指定2个端口,一个给hosted一个给group使用(即一个提交一个拉取),比如9082->8082,9083->8083

其实换到docker的角度就很好理解,docker拉取私服需要先登录到私服,而登录的关键信息就是ip+port,而类比Nexus提供的maven的仓库地址形如:

http://10.10.1.199:9081/nexus/repository/maven-public/,显然docker是无法登录到这样的仓库的,而Nexus针对docker仓库是提供了http或https的服务端口,这样就可以通过【docker login ip+port】来登录到对应的docker仓库,进而进行docker pull或docker push操作。

version: '3'
services:
nexus3:
 image: 'sonatype/nexus3:3.17.0'
 restart: always
 container_name: 'nexus3'
 hostname: 'nexus3'
 environment:
      - NEXUS_CONTEXT=nexus # 默认不指定上下文为根/,这是和nexus2不同的地方
    ports:
      - '9081:8081'
      - '9082:8082'
      - '9083:8083'
    networks:
      - 'exist-net-bloom'
    volumes:
      - '/docker/nexus3/data:/nexus-data'
      - '/etc/timezone:/etc/timezone:ro'
      - '/etc/localtime:/etc/localtime:ro'
networks:
  exist-net-bloom:
    external:
      name: devops

重新部署容器:docker-compose up -d

仓库创建与配置

1.创建proxy类型的docker仓库:

用来作为中心仓库,本地没有的通过代理到中心仓库下载到私服仓库。

操作路径: 设置->Repository->Repositories->create repository->docker(proxy)
在这里插入图片描述

除以上配置我有些是偷工减料了,比如Storage,正常为了与其他库隔离,docker可以单独创建一个存储目录,可以到Blob Storage中创建,这里为了方便我们省略了。

[重要属性:Docker Index]:注意这里我指定的是"Use Docker Hub",他的作用是当我们通过docker pull或docker search的时候,仓库会先到Docker Index指定的服务器去查找镜像的关键信息,找到后再去用完成的镜像标签去镜像源拉取镜像,我们平时使用的标签只不过是一个简化的索引,所以这个Docker Index不能随意指定,否则会找不到镜像,而一般的Docker Index都会和镜像源的地址一起发布,而Docker Hub的索引服务时https://index.docker.io/,所以此处我是用了它,当然也可以手动指定地址https://index.docker.io/;如果大家知道其他索引服务器也可以选择手动指定。

官网出处:https://help.sonatype.com/repomanager3/nexus-repository-administration/formats/docker-registry/proxy-repository-for-docker

一些常用的镜像源列举:

  • docker hub:https://registry-1.docker.io
  • docker中国:https://registry.docker-cn.com
  • 网易:http://hub-mirror.c.163.com
  • 腾讯云:https://cloud.tencent.com
  • 中科大:http://mirrors.ustc.edu.cn/

注意: 这里的proxy仓库并没有指定http或https端口,其实是可以指定的,如果指定了当然可以单独连接该仓库通过docker pull拉取代理的源中的镜像,但是这里我们主要是要用到group类型的仓库的拉取,他的特点就是可以汇集hosted和proxy多个仓库的镜像,具体可以看后边的测试部分。

2.创建hosted类型的docker仓库:用来保存自己构建的镜像

操作路径: 同上,只不过需要指定http的端口,我们这里设置8082,proxy代理仓库因为是代理,并不直接提供服务,所以无需指定端口,而他一般是交给group,由客户端连接group然后拉取所有在group下的仓库的内容,优先拉取本地私服镜像,如果没有的,则由私服拉取proxy代理仓库的镜像。
在这里插入图片描述

3.创建group类型的docker仓库:

同maven的group一个意思,是一个虚构的仓库,里边包含了所有仓库镜像的集合(需要创建时手动选择汇总哪些仓库)
在这里插入图片描述

实践

1.试错

假设此时没有将仓库地址加入docker信任列表、也没有开启允许docker使用nexus账号登录
在这里插入图片描述
错误意思就是请使用https协议,所以我们进行优化,将仓库加入信任列表:

# 进入宿主机操作
vi /etc/docker/daemon.json

# 注意这里因为是通过映射到宿主机的端口访问,所以不是Nexus中设置的8082和8083,而是宿主机的端口
"insecure-registries":[
"10.10.1.199:9082", # 提交时的hosted仓库
"10.10.1.199:9083", # 拉取时用的group仓库
]

# 重启docker使之生效
systemctl restart docker
# 查看配置是否生效
docker info

再次执行: docker login http://10.10.1.199:9083
在这里插入图片描述
从错误得知,不再要求https了,而是401认证错误,所以此时我们在没有输错账号密码的情况,就需要开启支持nexus账号登录的功能:
在这里插入图片描述
再试
在这里插入图片描述
这次没问题,成功连接到group仓库

问题:但是仔细看日志,可以发现登陆成功后,docker会将密码存入到当前用户home目录的.docker/config.json中,并且是未加密不安全的,打开后我们发现内容如下:

{
	"auths": {
		"10.10.1.199:9083": {
			"auth": "YWRtaW46amllMTIzNDU2" # 该内容为base64编码
		}
	}
}
# 我们可以使用base64解码,可以发现很容易拿到明文的密码,所以这样是不安全的,这主要看我们实际环境的网络架构,
# 如果有风险docker提供了其他保存密码的方式,大家感兴趣可以自行研究下,这里不是我们的重点就不多说了。
echo 'YWRtaW46amllMTIzNDU2' | base64 --decode
2.镜像拉取/推送环节[完整案例]

从互联网拉取(不使用私服)

docker pull busybox
# 拉取后我们到私服上查看并没有保存该镜像,而是只有宿主机本地有此镜像,说明没有走私服

从group仓库拉取镜像:以busybox镜像为例

# 拉取之前我们先把本地的busybox镜像删除,避免干扰测试
docker rmi busybox:latest
# 登录group仓库
docker login 10.10.1.199:9083
# 通过group仓库拉取镜像
docker pull 10.10.1.199:9083/busybox:latest

在这里插入图片描述
我们看结果是报错了,本地并没有拉到镜像,看私服的proxy仓库确实有内容了,这个其实是我们配置的代理仓库的镜像源有问题,

我把163的镜像源换成了我的阿里云镜像源就没有问题了:阿里云镜像源大家到阿里云的容器管理中自己生成一个地址就行了,前边有案例就不多说了。

再次执行结果如下:
在这里插入图片描述
再看下私服的proxy仓库:也是拉取到了
在这里插入图片描述
从hosted仓库拉取/推送镜像

# 接下来我们把刚拉下来的镜像重新打个标签(标签中指定要上传到的私服仓库地址),上传到私服,即上传到hosted仓库
docker tag 10.10.1.199:9083/busybox:latest 10.10.1.199:9082/busybox:hosted-1.0

在这里插入图片描述

# 将打好标签的新镜像,推送到hosted仓库
docker push 10.10.1.199:9082/busybox:hosted-1.0

在这里插入图片描述
再从group仓库拉取推送到hosted中的镜像

# 这里我们演示下从group仓库拉取hosted仓库的镜像

# 先删除本地的所有busybox镜像,避免干扰测试
docker rmi 10.10.1.199:9083/busybox:latest 
docker pull 10.10.1.199:9083/busybox:hosted-1.0

在这里插入图片描述
匿名拉取:根据我们的配置,是已经开启了允许匿名拉取,下边我们测一下

# 首先我们退出group仓库,退出成功后会将~/.docker/config.json中的密码删除
docker logout 10.10.1.199:9083
# 拉取一个nginx镜像 --> 结果是没问题的。
docker pull 10.10.1.199:9083/nginx

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

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

相关文章

ELK 日志框架搭建 (springboot 接入 elk)

什么是ELK? ELK 是一个开源的实时日志分析平台,它主要由 Elasticsearch、Logstash 和 Kiabana 三部分组成。 Logstash Logstash 主要用于收集日志,它是一个开源数据收集引擎,具有实时管道功能。Logstash 可以动态地将来自不同数…

《大正野球娘》:棒球少女·棒球1号位

《大正野球娘。》是根据神乐坂淳的人气轻小说「大正棒球少女」及「大正棒球少女~沾满土与尘~」改编的电视动画。原作小说是神乐坂淳原作,小池定路插画的轻小说改德间书店出版,至2009年6月已发行三卷。此外,小说还被改编…

曙光超算平台如何使用以及常见问题

官方参考链接如下,有需要的自取: Notebook 计算服务 了解常用的E-shell命令 (1) squeue: 查看目前提交作业的信息 (2) salloc :抢占计算资源命令 salloc -p wzhdtest -N 1 -n 8 --gresdcu:1 (部分地区有绑卡机制,比如乌镇&am…

PHP将PDF转图片-实战

Windows环境下 一、开启 Imagick 扩展 1、安装PHP扩展:Imagick,下载地址 https://pecl.php.net/package/imagick 注意和php版本保持一致; 2、将下载下来的文件解压,把php_imagick.dll复制到php/ext下,即php的扩展目…

【人脸识别】形态学教室人数统计(带面板)【含Matlab源码 1703期】

⛄一、人数统计简介(附课程作业报告) 1 课题背景 本课题为基于matlab的人数统计系统。近年来,很多行业对人流信息有极大的需求,如汽车公交站,地铁站台,商场出入口等。通过人数统计系统可以方便、可靠、实时…

5-6: Elasticsearch(入门安装)

Elasticsearch简介 一个分布式的(多台服务器集群部署)、Restful风格(设计风格,前后端交互的风格,请求标准的描述)的搜索引擎。支持对各种类型的数据的检索。搜索速度快,可以提供实时的搜索服务。便于水平扩展&#xf…

23.层和块

在构造自定义块之前,我们先回顾一下多层感知机 的代码。 下面的代码生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层, 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 import torch from torch import nn …

是面试官放水,还是公司实在是太缺人?这都没挂,京东原来这么容易进...

“京东是大企业,是不是很难进去啊?”“在京东做软件测试,能得到很好的发展吗?一进去就有9.5K,其实也没有想的那么难”直到现在,心情都还是无比激动! 本人211非科班,之前在字节和腾讯…

第04讲:Security之用户授权

一、创建项目 参考:浅试Security 二、实现用户授权 2.1、基于权限进行访问控制 hasAuthority方法:如果当前的主体具有指定的权限,则返回true,否则返回false。hasAnyAuthority方法:如果当前的主体有任何提供的权限的…

二叉树的前序-中序-后序遍历

在牛客网刷到了二叉树的遍历,二叉树的遍历分为前序遍历,前序遍历也有先序遍历之称,还有中序遍历,以及后序遍历,这么多种遍历,遍历的方式不一样而已,前序遍历是先遍历根然后左节点然后是右节点&a…

两年前端的2022:24岁、辗转三省、进入阿里

前言 前排声明:文中主人公不是博主,另外本文只是一些朋友在工作、生活上的经历和琐碎,想看技术干货的掘友请止步,不要在本文上浪费你的学习时间~~~ 2022年,也实实在在满24岁了,毕业进入社会两年多&#xff…

我与外企上司的四个职场故事

标题:我与外企上司的四个职场故事 我在目前这家任职的外企从事软件开发工作,已经整整十五年了。本系列文章通过介绍我与自己上司的四个职场小故事,想和大家分享在外企里,一个程序员除了埋头提升自己技术之外,还有哪些…

数据自动录入并生成报表神器怎么玩?

做报表、分析数据、做汇报是许多打工人的日常,每天都要耗费不少的时间用Excel来整理、清洗数据和生成好看的报表。如果这些数据都是手动整理、复制粘贴的话,不仅费时费力,而且很容易出错。 在越来越多企业采用SaaS产品和不同数据应用的今天&…

没有任何销售经验怎么进行销售团队管理?

没有任何销售经验想要进行销售团队管理,并不是一件容易的事情。每一行都有值得研究和学习的地方,需要学习补充的知识点还是比较多的。 参考《销售管理管理成长手册》,本文为您讲解以下管理知识,包括:1、明白销售经理是…

春招升级打怪拿offer,10w+字总结的Java面试题(附答案)够你刷

春招升级打怪拿offer,献上熬夜整理最新“10w字总结的Java面试题(附答案)”够你刷! 其包含的内容模块有:基础、JVM、多线程与高并发、Spring、MyBatis、SpringBoot、MYSQL、SpringCloud、Dubbo、Nginx、MQ、数据结构与算…

libevent实战学习

目录 编译安装libevent libevent 事件对象 事件操作 事件循环 事件处理 libevent 客户端demo libevent 服务端demo libevent 服务端升级demo libevent完整demo 总结 C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 编译安装libevent git上下载h…

十分钟彻底搞懂python异常

异常 目标 异常的概念捕获异常异常的传递抛出异常 01. 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常程序停止执行并且提示错误信息 这个动作,…

真无线耳机哪个品牌音质最好?半入耳式真无线蓝牙耳机推荐

对于社恐的人来说,出门在外都会选择佩戴上耳机,那么这种情况下,一款高品质的耳机真的是必不可少的,选择了一款性能优秀的耳机,不光能够让自己听音乐的过程中有更好的体验感,同时还能舒缓身心,让…

编程常见的问题(三) 线程池

编程常见的问题(三) 线程池 今天,我来讲讲使用线程池需要注意的一些问题。 在程序中,我们会用各种池化技术来缓存创建昂贵的对象,比如线程池、连接池、内存池。一般是预先创建一些对象放入池中,使用的时候直接取出使用&#xff…

[附源码]Node.js计算机毕业设计高校运动会管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…