你必须知道的Docker镜像仓库的搭建

640?wx_fmt=jpeg

期工作中发现用到的容器镜像越来越多(不多的时候没考虑过镜像仓库的问题),同一个容器镜像也存在多个版本,那么镜像仓库的搭建需求就涌现出来,本文就目前的几个常用镜像仓库的搭建进行介绍,我们可以根据需要选择合适自己的就好。


01

官方标配:Registry私有仓库


Docker Hub作为Docker默认官方公共镜像,如果想要自己搭建私有镜像残酷,官方也提供Registry镜像,使得我们搭建私有仓库变得非常简单。

所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。

下面就是详细的基于Registry搭建私有仓库的步骤,首先我们可以准备两台服务器,这里我有两台Linux的云服务主机(阿里云+腾讯云),他们的角色如下:

主机名角色备注
edc-aliyun-serverregistry-server部署registry容器
edc-tecentcloud-serverregistry-consumer从registry服务器上下载镜像使用

搭建镜像仓库

  首先,下载Registry镜像并启动

docker pull registry

  640?wx_fmt=png

  然后,运行一个Registry镜像仓库的容器实例

docker run -d -v /edc/images/registry:/var/lib/registry 	
-p 5000:500 	
--restart=always	
--name xdp-registry registry

  640?wx_fmt=png

  最后,在客户端查看镜像仓库中的所有镜像

curl http://your-server-ip:5000/v2/_catalog

  640?wx_fmt=png

  这里返回的json数据代表暂无任何仓库,因为我们还没有上传任何镜像。

上传镜像

  首先,为了让客户端服务器能够快速地访问刚刚在服务端搭建的镜像仓库(默认情况下是需要配置HTTPS证书的),这里简单在客户端配置一下私有仓库的可信任设置让我们可以通过HTTP直接访问:# vim /etc/docker/daemon.json

  加上下面这一句,这里的"your-server-ip"请换为你的服务器的外网IP地址:

{	"insecure-registries" : [ "your-server-ip:5000" ]	
}


PS:如果不设置可信任源,又没有配置HTTPS证书,那么会遇到这个错误:error: Get https://ip:port/v1/_ping: http: server gave HTTP response to HTTPS client.

  为了使得配置生效,重新启动docker服务:# systemctl restart docker

  其次,为要上传的镜像打Tag

docker tag your-image-name:tagname your-server-ip:5000/your-image-name:tagname
  

  最后,开始正式上传镜像到服务端镜像仓库

docker push your-registry-server-ip:5000/your-image-name:tagname

  640?wx_fmt=png

  这时我们可以再次通过访问API验证镜像仓库的内容:

  640?wx_fmt=png

下载镜像

  下载镜像就很简单了,使用pull命令即可:

docker pull your-server-ip:5000/your-image-name:tagname

  640?wx_fmt=png

  如果想要知道要下载的镜像都有哪些tag(或版本),可以通过下面这个api来获取:

curl http://your-server-ip:5000/v2/your-image-name/tags/list
  

02

共享源头:Docker Hub公共仓库


程序员们都喜欢用Git,如果把Registry私有仓库比作GitLab的话,那么Docker Hub公共仓库就类似于GitHub,这是一个公共的共享的镜像仓库平台,我们可以像在GitHub上随意得clone公共的开源项目一样pull镜像到本地。下面就是基于Docker Hub建立公共仓库的步骤:

注册账号&创建仓库

  首先,你得去docker hub上注册一个账号:

  640?wx_fmt=png

  其次,注册完成登录之后就可以创建一个Repository,例如这里我创建了一个名为xdp-service-runtime的仓库:

  640?wx_fmt=png

客户端操作

  创建完仓库,我们就可以在客户端上登录:

方式一:docker login	
方式二:docker login --username=your-account

  640?wx_fmt=png

  登录之后,就可以为镜像打Tag:

docker tag xdp-service-runtime:2.2 edisonsaonian/xdp-service-runtime:2.2

  640?wx_fmt=png

  打完Tag就可以推送到远程仓库啦:

docker push edisonsaonian/xdp-service-runtime:2.2

  640?wx_fmt=png

  这时,便可以到docker hub上查看Repository的信息:

  640?wx_fmt=png

  当然,我们可以在另外的客户端上拉取这个刚刚上传的镜像了:

  640?wx_fmt=png

  怎么样,是不是很Easy,Enjoy


03

企业最爱:Harbor企业级私有仓库


Harbor是VMware公司开源的一个企业级Docker Registry项目,项目地址:https://github.com/vmware/harbor

Harbor作为一个企业级私有Registry服务器,提供了更好的性能和安全,提升了用户使用Registry构建和运行环境传输镜像的效率。虽然Harbor和Registry都是私有镜像仓库的选择,但是Harbor的企业级特性更强,因此也是更多企业级用户的选择。

Harbor实现了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制,也常常和K8S中的namespace结合使用。此外,Harbor还提供了图形化的管理界面,我们可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。

有关Harbor的架构,可以参考阅读这一篇《Harbor整体架构》一文,里面讲述了Harbor的6大核心组件构成,有兴趣的朋友可以一读。

下面列出了Harbor的搭建过程:

一些准备工作

(1)下载离线安装包

  Harbor提供了两种安装方式:一种是在线安装包,因此包很小;另一种是离线安装包,因此包很大(>=570MB)。这里选择下载离线安装包,下载地址:https://github.com/goharbor/harbor/releases

  这里选择版本为v1.7.0,下载完成后传输到你的服务器上并解压:

tar zvxf harbor-offline-installer-v1.7.0.tgz

  (2)安装docker

  如果还没有安装docker,那么请先安装docker,已安装则跳过。

# yum install docker	
# systemctl start docker.service

  (3)安装docker-compose

  这里选择Github源:

sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose	
sudo chmod +x /usr/local/bin/docker-compose

  验证:

docker-compose -version

  640?wx_fmt=png

   PS:如果想要卸载docker-compose,请执行以下命令

sudo rm /usr/local/bin/docker-compose

自签TLS证书

        虽然对于所有要求配置HTTPS的要求我都是比较抵触的,不过考虑到去年公司官网被攻击并且还被Google列入黑名单导致公司官网好几天不可用,我们信息中心遭受了很大的压力,因此还是老老实实地为所有有需要的地方配上HTTPS吧。当然,这里演示的只是我们自己创建的证书,实际生产环境中我们切记还是需要去阿里云或者其他云服务器厂商申请免费或收费的证书。

  此小节内容主要参考自Harbor的HTTPS配置文档

  (1)创建存放证书的目录

mkdir -p /data/cert/	
cd   /data/cert/

  (2)创建自签名证书key文件并生成证书请求:

  注意:这里reg.edisonedu.com需要替换为你的域名,我这里是随便取的,会在后面更改DNS。

openssl genrsa -out reg.edisonedu.com.key 4096	
openssl req -x509 -new -nodes -sha512 -days 365 \	-subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=reg.edisonedu.com" \	-key reg.edisonedu.com.key \	-out reg.edisonedu.com.crt

Harbor安装与配置

在解压的harbor目录中编辑harbor.cfg文件,修改以下内容:

......	
hostname = reg.edisonedu.com	
ui_url_protocol = https	
ssl_cert = /data/cert/reg.edisonedu.com.crt	
ssl_cert_key = /data/cert/reg.edisonedu.com.key	
harbor_admin_password = EdisonZhou123456	
......

  以上只是一些最基本的配置,你还可以配置例如SMTP邮件的设置,可以自己去摸索。

  接下来就是执行准备这个harbor.cfg了,在harbor目录下执行以下命令:

./prepare

  然后再执行install这个shell脚本进行install:

./install.sh

  它会经历好几个步骤:加载Harbor镜像(初次安装耗时较长)、准备运行环境、通过docker-compose启动harbor(有兴趣的童鞋可以看看harbor目录下的docker-compose.yml文件)等。

  我们可以通过docker-compose ps命令查看启动起来的docker实例:

  640?wx_fmt=png

  可以看到,整个harbor容器实例群包括了管理服务、数据库服务、Job服务、日志服务以及Portal网页入口(默认是80端口)服务等。

  为了能在你的开发机上能够访问到我们这个域名,你需要改一下Windows的hosts文件(C:/Windows/System32/drivers/etc/hosts),如果你用的阿里云,那么你可能还需要开放一下端口号,80和443端口:

# your server ip	
47.102.140.255 reg.edisonedu.com

  这下我们可以在本地开发机上打开浏览器访问reg.edisonedu.com了,可以看到Harbor的管理平台登录页面了:

  640?wx_fmt=png

  使用刚刚在配置文件里面配置的密码登录之后,可以看到如下管理界面:

  640?wx_fmt=png

  为了进行后面的演示,这里我们创建一个私有项目:

  640?wx_fmt=png

  然后再创建一个项目管理员用户:

  640?wx_fmt=png

  最后,为test项目添加新创建的这个用户作为项目管理员(由于我们后续会演示镜像上传,所以这里设为管理员,如果只是拉取镜像,可以设为开发人员角色,如果只是看看那可以只设置为游客角色):

  640?wx_fmt=png

  接下来我们就会在另一台主机中访问这台服务器上部署的Harbor私有镜像仓库了。

Docker主机访问Harbor

    (1)首先,由于我们这里是自签证书,不是受信任的,所以我们要做一些准备工作才能在普通主机上访问到刚刚部署的Harbor镜像仓库。(注意:这一部分的操作在另外的一台主机上,非我们刚刚部署的Harbor的服务器上面)

  准备工作一:创建Harbor服务域名的证书文件夹

mkdir /etc/docker/certs.d/reg.edisonedu.com -p

  准备工作二:设置Hosts匹配我们设置的假域名

vim /etc/hosts

  加上一行:

47.22.232.200 reg.edisonedu.com #替换为你的Harbor服务器外网IP

  准备工作三:将Harbor服务器上的证书拷贝要访问Harbor仓库的主机上

  这一工作你可以选择直接通过SFTP软件将reg.edisonedu.com.crt从Harbor服务器上拷贝到客户机刚刚创建的文件夹中(/etc/docker/certs.d/reg.edisonedu.com

),也可以通过scp命令去拷贝,总之拷贝过来就行。这里我通过scp去拷贝:

scp root@47.22.232.200:/data/cert/reg.edisonedu.com.crt /etc/docker/certs.d/reg.edisonedu.com

  (2)其次,登录到Harbor镜像仓库(由于Docker的默认源是docker hub,所以刚刚我们需要改host,这里需要登录自己的源仓库)

docker login reg.edisonedu.com

  (3)然后,就跟刚刚我们在docker hub中的步骤一样了,假设我们要push一个镜像到镜像仓库,首先打个Tag:

docker tag xdp-service-runtime:2.2 reg.edisonedu.com/test/xdp-service-runtime:2.2

  PS:这里我们打的tag加上了私有项目名test

  打完Tag,就可以push到镜像仓库了:

docker push reg.edisonedu.com/test/xdp-service-runtime:2.2

  推送完后,我们可以到Harbor的Web管理界面中验证:

  640?wx_fmt=png

  640?wx_fmt=png

  (4)推送完之后,我们想在其他docker主机中pull下来呢?

docker pull reg.edisonedu.com/test/xdp-service-runtime:2.2

  (5)如果想退出我们的私有仓库

docker logout reg.edisonedu.com

其他补充

如果想要继续更改harbor配置,那么改完后需要重新初始化Harbor:

docker-compose down -v # 暂停Harbor实例群	
./prepare  # 生成配置文件,根据 harbor.cfg 配置生成docker-compose文件。	
docker-compose up -d  # 后台启动Harbor实例群

  想要暂停和重启Harbor:

docker-compose  stop # 暂停 Harbor	
docker-compose  start # 启动 Harbor

  不用Harbor了,那么可以彻底删除Harbor的数据和镜像文件:

# 彻底地删除 Harbor 的数据和镜像	rm -r /data/database	rm -r /data/registry


04

小结


本文总结了流行的几个镜像仓库的搭建步骤,并给出了基本使用示例。个人感觉:对于个人开发者或开源社区而言,docker hub主要提供的是类似于github的共享公共仓库(当然docker hub也有提供私有仓库)。对于小团队而言,官方提供的Registry项目可以帮助小团队快速地构建起自己的镜像仓库把精力更多放在快速迭代上面。而对于中大规模的团队,Harbor的企业级特性更加适合此类型的团队使用。

参考资料

  1. 李振良,《1天掌握Docker

  2. Harbor,《Installation Guide

  3. 自由早晚乱余生,《Docker企业级镜像仓库Harbor的搭建与维护

  4. Ivanzz,《Harbor整体架构

  5. 杨振涛,《Harbor介绍与实践




640?wx_fmt=jpeg


点个在看少个bug ?

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

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

相关文章

nowcoder 河 我 车 题 错 天 乐 赛 倍增处理

传送门 文章目录题意:思路:题意: 思路: 倍增经典题了,考虑维护一个前缀和sum[i]sum[i]sum[i],对于iii位置我们肯定是贪心的选能到的最远位置,即第一个>sum[i−1]k>sum[i-1]k>sum[i−1…

狄利克雷生成函数

一个没啥用的东西,权当加深对数论函数和狄利克雷卷积的理解。 定义 序列 {f1,f2,…}\{f_1,f_2,\dots\}{f1​,f2​,…} 的狄利克雷生成函数 DGF 定义为 f(s)∑n1∞fnnsf(s)\sum_{n1}^{\infin}\frac{f_n}{n^s}f(s)n1∑∞​nsfn​​ 这里不要求 fff 是积性函数。 显…

ASP.NET Core Web Api之JWT(一)

最近沉寂了一段,主要是上半年相当于休息和调整了一段时间,接下来我将开始陆续学习一些新的技能,比如Docker、Jenkins等,都会以生活实例从零开始讲解起,到时一并和大家分享和交流。接下来几节课的内容将会讲解JWT&#…

Codeforces Round #658 (Div. 2) D. Unmerge 思维 + 背包

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们可以假设有两个桶&#xff0c;让后向里面放数&#xff0c;可以发现&#xff0c;如果向其中放入了aia_iai​&#xff0c;那么紧跟在他后面的所有<ai<a_i<ai​的数都必须跟在ai…

【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】

题意&#xff1a;一个魔塔游戏的地图是一棵以 111 为根的树&#xff0c;起点为根&#xff0c;除根外每个结点有一个怪物&#xff0c;给定每个怪物血量、攻击、防御、奖励蓝宝石个数&#xff08;加防御&#xff09;&#xff0c;勇士的血量、攻击、防御&#xff0c;遇到怪物必须战…

撸过一万行代码,你看过这篇文章吗?

北上广深真的是技术的宝地吗&#xff1f;犹记得刚刚参加工作之后&#xff0c;有人邀请我去深圳&#xff0c;说沿海地区是IT行业从业人员的宝地&#xff0c;只有在那里才会学到真正的技术&#xff0c;而且能拿到更高的工资&#xff0c;不管从哪个层面来说&#xff0c;都值得你去…

Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 初始有左右手&#xff0c;上面各有一个数字为000的卡牌&#xff0c;每次都有一个新卡kik_iki​&#xff0c;你可以将其放在左手或者右手&#xff0c;使两只手上的卡片范围在[ll,i,rl,i][l_{l,i},r_{l,i}][ll…

【CEOI2017】Building Bridges【任意坐标斜率优化】【李超线段树】

题意&#xff1a;有 nnn 个柱子&#xff0c;每个柱子有高度 hih_ihi​。你需要在柱子间修桥&#xff0c;在 i,ji,ji,j 间修桥代价为 (hi−hj)2(h_i-h_j)^2(hi​−hj​)2,桥梁只能在柱子处相交&#xff0c;未安装桥的柱子需要拆除&#xff0c;代价为 wiw_iwi​&#xff08;可能为…

【牛客NOIP模拟】路径难题【建图】【最短路证明】

题意&#xff1a;一张 nnn 个点 mmm 条边的无向图&#xff0c;边带距离&#xff0c;可以坐出租车&#xff0c;花费为距离除以常数 rrr 向上取整&#xff1b;也可以坐公交车&#xff0c;每路车行驶路线给定&#xff0c;无论坐多少站花费都为 cic_ici​ &#xff08;每路车可能不…

Codeforces Round #595 (Div. 3) F. Maximum Weight Subset 树形dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤200n\le200n≤200 思路&#xff1a; 明显的树形dpdpdp&#xff0c;所以考虑一下dpdpdp状态。 这个题状态挺神的。。可能是因为我太菜了&#xff0c;看了半天才看懂。 算法111: 复杂度O(n3)O(n^3)O(n3) …

利用ICSharpCore搭建基于.NET Core的机器学习和深度学习的本地开发环境

每个人都习惯使用Python去完成机器学习和深度学习的工作&#xff0c;但是对于习惯于某种特定语言的人来说&#xff0c;转型不是那么容易的事。这两年我花了不少时间在Python&#xff0c;毕竟工作的重心也从移动开发转为机器学习和深度学习。感谢我的老板给我很大的空间去开拓新…

【牛客NOIP模拟】牛半仙的妹子序列【DP】【Segment Tree Beats】

题意&#xff1a;排列的极长上升子序列个数 n≤2105n\leq 2\times 10^5n≤2105 显然有个 dp fn∑i<n,pi<pn,∄i<j<ns.t. pi<pj<pnfif_n\sum_{i<n,p_i<p_n,\nexists i<j<n\text{ s.t. }p_i<p_j<p_n}f_ifn​i<n,pi​<pn​,∄i<j&l…

Acwing 252. 树 点分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 好久没写淀粉质了&#xff0c;心血来潮复习一下。 淀粉质通常用来统计路径个数&#xff0c;将路径分为子树内的和子树之间的。子树内的递归处理&#xff0c;子树间的存下信息来每次都处理即…

CLR与JVM

首先要纠正垃圾回收在于JVM和.NET的CLR的平台功能而不是语言本身。存在一些历史差异主要是因为.Net的设计是从java&#xff08;和其他基于gc的平台&#xff09;演变中吸取教训改良后的结果。CLR一开始就设计成了分代垃圾回收&#xff0c;但是初始JVM没有分代垃圾收集器。第一代…

【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】

题意&#xff1a; nmn\times mnm 的网格图&#xff0c;每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j​,bufi,j​&#xff0c;从 (1,1)(1,1)(1,1) 开始只能向下或向右走到 (n,m)(n,m)(n,m) &#xff0c;在某个位置时可以选择触发该位置的事件&#xff08;也可不触发…

Free tour II SPOJ - FTOUR2 点分治 + 树状数组

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个有nnn个点的树&#xff0c;有mmm个点拥堵&#xff0c;连接两个点的一条边有一个美丽值&#xff0c;让你选择一个路径&#xff0c;使其经过的拥堵点数不超过kkk且美丽值最大。 n≤2e5,m≤n,k≤mn\le2…

使用Mutex进行线程处理

Mutex就像一个C&#xff03;锁(lock)&#xff0c;但它可以跨多个进程工作。换句话说&#xff0c;Mutex可以是计算机范围的&#xff0c;也可以是应用程序范围的。Mutex是一个同步原语&#xff0c;也可用于进程间同步。当两个或多个线程需要同时访问共享资源时&#xff0c;系统需…

【NOIP模拟】开車【回退贪心】【multiset】

题意&#xff1a;有 1∼n1 \sim n1∼n nnn 个城市排成一行&#xff0c;给定每个城市的单位距离油价和两个城市间的距离、油箱容量&#xff0c;求 111 到 nnn 最小代价。 用 multiset 来维护当前油箱中的油的价格。 在每个城市假装把油加满。如果发现这个城市的油比油箱里的一…

Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing 二分 + check

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接算不好算&#xff0c;考虑二分这个中位数midmidmid。 考虑如何checkcheckcheck&#xff0c;这个分情况来就好了&#xff1a; (1)mid>a[i].r(1)mid>a[i].r(1)mid>a[i].r&#…

【Linux】Linux常见指令解析上

目录 1. 前言2. ls指令3. pwd指令4. cd指令3.1 cd常见快捷指令 4. touch指令5. mkdir指令6. rmdir指令 && rm指令 &#xff08;重要&#xff09;6.1 rmdir指令6.2 rm指令 7. man指令 1. 前言 这篇文章我们将详细介绍一下Linux下常见的基本指令。 2. ls指令 语法: ls [选…