你必须知道的Docker镜像仓库的搭建
<p>本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。</p><p>近期工作中发现用到的容器镜像越来越多(不多的时候没考虑过镜像仓库的问题),同一个容器镜像也存在多个版本,那么镜像仓库的搭建需求就涌现出来,本文就目前的几个常用镜像仓库的搭建进行介绍,我们可以根据需要选择合适自己的就好。</p>
<h1>一、官方标配:Registry私有镜像仓库</h1>
<p> Docker Hub作为Docker默认官方公共镜像,如果想要自己搭建私有镜像残酷,官方也提供Registry镜像,使得我们搭建<strong>私有仓库</strong>变得非常简单。</p>
<p> 所谓<strong>私有仓库</strong>,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。</p>
<p> 下面就是详细的基于Registry搭建私有仓库的步骤,首先我们可以准备两台服务器,这里我有两台Linux的云服务主机(阿里云+腾讯云),他们的角色如下:</p>
<table style="margin: 0 auto" border="1">
<tbody>
<tr>
<td><strong>主机名</strong></td>
<td><strong>角色</strong></td>
<td><strong>备注</strong></td>
</tr>
<tr>
<td>edc-aliyun-server</td>
<td>registry-server</td>
<td>部署registry容器</td>
</tr>
<tr>
<td>edc-tecentcloud-server</td>
<td>registry-consumer</td>
<td>从registry服务器上下载镜像使用</td>
</tr>
</tbody>
</table>
<h2>1.1 搭建镜像仓库</h2>
<p> 首先,下载Registry镜像并启动</p>
<div class="cnblogs_code">
<pre>docker pull registry</pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712120314325-1297021719.png" alt=""></p>
<p> 然后,运行一个Registry镜像仓库的容器实例</p>
<div class="cnblogs_code">
<pre>docker run -d -v /edc/images/registry:/var/lib/<span style="color: rgba(0, 0, 0, 1)">registry
</span>-p <span style="color: rgba(128, 0, 128, 1)">5000</span>:<span style="color: rgba(128, 0, 128, 1)">5000</span>
--restart=<span style="color: rgba(0, 0, 0, 1)">always
</span>--name xdp-registry registry</pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712120421658-529741968.png" alt=""></p>
<p> 最后,在客户端查看镜像仓库中的所有镜像</p>
<div class="cnblogs_code">
<pre>curl http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">your-server-ip:5000/v2/_catalog</span></pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712120452378-417479611.png" alt=""></p>
<p> 这里返回的json数据代表暂无任何仓库,因为我们还没有上传任何镜像。</p>
<h2>1.2 上传镜像</h2>
<p> 首先,为了让客户端服务器能够快速地访问刚刚在服务端搭建的镜像仓库(默认情况下是需要配置HTTPS证书的),这里简单在客户端配置一下私有仓库的可信任设置让我们可以通过HTTP直接访问:# vim /etc/docker/daemon.json</p>
<p> 加上下面这一句,这里的"your-server-ip"请换为你的服务器的外网IP地址:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insecure-registries</span><span style="color: rgba(128, 0, 0, 1)">"</span> : [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">your-server-ip:5000</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> ]
}</span></pre>
</div>
<blockquote>
<p><em><strong>PS:</strong></em>如果不设置可信任源,又没有配置HTTPS证书,那么会遇到这个错误:<strong>error: Get https://ip:port/v1/_ping: http: server gave HTTP response to HTTPS client.</strong></p>
</blockquote>
<p> 为了使得配置生效,重新启动docker服务:# systemctl restart docker</p>
<p> 其次,为要上传的镜像打Tag</p>
<div class="cnblogs_code">
<pre>docker tag your-image-name:tagname your-server-ip:<span style="color: rgba(128, 0, 128, 1)">5000</span>/your-image-name:tagname</pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712124153476-504489707.png" alt=""></p>
<p> 最后,开始正式上传镜像到服务端镜像仓库</p>
<div class="cnblogs_code">
<pre>docker push your-registry-server-ip:<span style="color: rgba(128, 0, 128, 1)">5000</span>/your-image-name:tagname</pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712124236869-1052870890.png" alt=""></p>
<p> 这时我们可以再次通过访问API验证镜像仓库的内容:</p>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712124331163-1912306054.png" alt=""></p>
<h2>1.3 下载镜像</h2>
<p> 下载镜像就很简单了,使用pull命令即可:</p>
<div class="cnblogs_code">
<pre>docker pull your-server-ip:<span style="color: rgba(128, 0, 128, 1)">5000</span>/your-image-name:tagname</pre>
</div>
<p> 示例:</p>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712124658774-2139389929.png" alt=""></p>
<p> 如果想要知道要下载的镜像都有哪些tag(或版本),可以通过下面这个api来获取:</p>
<div class="cnblogs_code">
<pre>curl http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">your-server-ip:5000/v2/your-image-name/tags/list</span></pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712124811812-1863987878.png" alt=""></p>
<h1>二、共享源头:Docker Hub公共镜像仓库</h1>
<p> 程序员都喜欢用Git,如果把Registry私有仓库比作GitLab的话,那么Docker Hub公共仓库就类似于GitHub,这是一个公共的共享的镜像仓库平台,我们可以像在GitHub上随意得clone公共的开源项目一样pull镜像到本地。下面就是基于Docker Hub建立公共仓库的步骤:</p>
<h2>2.1 注册和创建仓库</h2>
<p> 首先,你得去docker hub上注册一个账号:</p>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712190811134-972862401.png" alt=""></p>
<p> 其次,注册完成登录之后就可以创建一个Repository,例如这里我创建了一个名为xdp-service-runtime的仓库:</p>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712191010110-392774783.png" alt=""></p>
<h2>2.2 客户端操作</h2>
<p> 创建完仓库,我们就可以在客户端上登录:</p>
<div class="cnblogs_code">
<pre>方式一:docker <span style="color: rgba(0, 0, 255, 1)">login</span><span style="color: rgba(0, 0, 0, 1)">
方式二:docker </span><span style="color: rgba(0, 0, 255, 1)">login</span> --username=your-account</pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712191138304-1959941266.png" alt=""></p>
<p> 登录之后,就可以为镜像打Tag:</p>
<div class="cnblogs_code">
<pre>docker tag xdp-service-runtime:<span style="color: rgba(128, 0, 128, 1)">2.2</span> edisonsaonian/xdp-service-runtime:<span style="color: rgba(128, 0, 128, 1)">2.2</span></pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712191238121-1189559387.png" alt=""></p>
<p> 打完Tag就可以推送到远程仓库啦:</p>
<div class="cnblogs_code">
<pre>docker push edisonsaonian/xdp-service-runtime:<span style="color: rgba(128, 0, 128, 1)">2.2</span></pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712191339548-229729843.png" alt=""></p>
<p> 这时,便可以到docker hub上查看Repository的信息:</p>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712191420255-1695629547.png" alt=""></p>
<p> 当然,我们可以在另外的客户端上拉取这个刚刚上传的镜像了:</p>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712191500851-186918509.png" alt=""></p>
<p> 怎么样,是不是很Easy,<strong>Enjoy</strong>!</p>
<h1>三、企业最爱:Harbor企业级镜像仓库</h1>
<p> Harbor是VMware公司开源的一个企业级Docker Registry项目,项目地址:https://github.com/goharbor/harbor</p>
<p style="text-align: left"> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712224747490-693611835.png" alt=""></p>
<p> Harbor作为一个企业级私有Registry服务器,提供了更好的性能和安全,提升了用户使用Registry构建和运行环境传输镜像的效率。虽然Harbor和Registry都是私有镜像仓库的选择,但是Harbor的企业级特性更强,因此也是更多企业级用户的选择。</p>
<p> Harbor实现了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制,也常常和K8S中的namespace结合使用。此外,Harbor还提供了图形化的管理界面,我们可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。</p>
<p> 有关Harbor的架构,可以参考阅读这一篇《Harbor整体架构》一文,里面讲述了Harbor的6大核心组件构成,有兴趣的朋友可以一读。</p>
<p> 下面列出了Harbor的搭建过程,主要参考自Harbor的github文档:</p>
<h2>3.1 一些准备工作</h2>
<p> (1)下载离线安装包</p>
<p> Harbor提供了两种安装方式:一种是在线安装包,因此包很小;另一种是离线安装包,因此包很大(>=570MB)。这里选择下载离线安装包,下载地址:https://github.com/goharbor/harbor/releases</p>
<p> 这里选择版本为<strong><em>v1.7.0</em></strong>,下载完成后传输到你的服务器上并解压:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">tar</span> zvxf harbor-offline-installer-v1.<span style="color: rgba(128, 0, 128, 1)">7.0</span>.tgz</pre>
</div>
<p> (2)安装docker</p>
<p> 如果还没有安装docker,那么请先安装docker,已安装则跳过。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span><span style="color: rgba(0, 0, 0, 1)"> docker
# systemctl start docker.service</span></pre>
</div>
<p> (3)安装docker-compose</p>
<p> 这里选择Github源:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> curl -L https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose</span>
<span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">chmod</span> +x /usr/local/bin/docker-compose</pre>
</div>
<p> 验证:</p>
<div class="cnblogs_code">
<pre>docker-compose -version</pre>
</div>
<p> <img style="width: 60%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190712230442472-304495912.png" alt=""></p>
<p> <em><strong>PS:</strong></em>如果想要卸载docker-compose,请执行以下命令</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">rm</span> /usr/local/bin/docker-compose</pre>
</div>
<h2>3.2 自签TLS证书</h2>
<p> 虽然对于所有要求配置HTTPS的要求我都是比较抵触的,不过考虑到去年公司官网被攻击并且还被Google列入黑名单导致公司官网好几天不可用,我们信息中心遭受了很大的压力,因此还是老老实实地为所有有需要的地方配上HTTPS吧。当然,这里演示的只是我们自己创建的证书,实际生产环境中我们切记还是需要去阿里云或者其他云服务器厂商申请免费或收费的证书。</p>
<p> 此小节内容主要参考自Harbor的HTTPS配置文档:</p>
<p> (1)创建存放证书的目录</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /data/cert/<span style="color: rgba(0, 0, 0, 1)">
cd </span>/data/cert/</pre>
</div>
<p> (2)创建自签名证书key文件并生成证书请求:</p>
<p> <strong><em>注意:</em></strong>这里reg.edisonedu.com需要替换为你的域名,我这里是随便取的,会在后面更改DNS。</p>
<div class="cnblogs_code">
<pre>openssl genrsa -out reg.edisonedu.com.key <span style="color: rgba(128, 0, 128, 1)">4096</span><span style="color: rgba(0, 0, 0, 1)">
openssl req </span>-x509 -new -nodes -sha512 -days <span style="color: rgba(128, 0, 128, 1)">365</span><span style="color: rgba(0, 0, 0, 1)"> \
</span>-subj <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=reg.edisonedu.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> \
</span>-<span style="color: rgba(0, 0, 0, 1)">key reg.edisonedu.com.key \
</span>-out reg.edisonedu.com.crt</pre>
</div>
<h2>3.3 Harbor安装与配置</h2>
<p> 在解压的harbor目录中编辑harbor.cfg文件,修改以下内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">......
</span><span style="color: rgba(0, 0, 255, 1)">hostname</span> =<span style="color: rgba(0, 0, 0, 1)"> reg.edisonedu.com
ui_url_protocol </span>=<span style="color: rgba(0, 0, 0, 1)"> https
ssl_cert </span>= /data/cert/<span style="color: rgba(0, 0, 0, 1)">reg.edisonedu.com.crt
ssl_cert_key </span>= /data/cert/<span style="color: rgba(0, 0, 0, 1)">reg.edisonedu.com.key
harbor_admin_password </span>=<span style="color: rgba(0, 0, 0, 1)"> EdisonZhou123456
......</span></pre>
</div>
<p> 以上只是一些最基本的配置,你还可以配置例如SMTP邮件的设置,可以自己去摸索。</p>
<p> 接下来就是执行准备这个harbor.cfg了,在harbor目录下执行以下命令:</p>
<div class="cnblogs_code">
<pre>./prepare</pre>
</div>
<p> 然后再执行install这个shell脚本进行install:</p>
<div class="cnblogs_code">
<pre>./<span style="color: rgba(0, 0, 255, 1)">install</span>.<span style="color: rgba(0, 0, 255, 1)">sh</span></pre>
</div>
<p> 它会经历好几个步骤:加载Harbor镜像(初次安装耗时较长)、准备运行环境、通过docker-compose启动harbor(有兴趣的童鞋可以看看harbor目录下的docker-compose.yml文件)等。</p>
<p> 我们可以通过docker-compose ps命令查看启动起来的docker实例:</p>
<p> <img style="width: 80%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190713234255737-1288606081.png" alt=""></p>
<p> 可以看到,整个harbor容器实例群包括了管理服务、数据库服务、Job服务、日志服务以及Portal网页入口(默认是80端口)服务等。</p>
<p> 为了能在你的开发机上能够访问到我们这个域名,你需要改一下Windows的hosts文件(C:/Windows/System32/drivers/etc/hosts),如果你用的阿里云,那么你可能还需要开放一下端口号,80和443端口:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># your server ip
</span><span style="color: rgba(128, 0, 128, 1)">47.102</span>.<span style="color: rgba(128, 0, 128, 1)">140.255</span> reg.edisonedu.com</pre>
</div>
<p> 这下我们可以在本地开发机上打开浏览器访问reg.edisonedu.com了,可以看到Harbor的管理平台登录页面了:</p>
<p> <img style="width: 80%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190714000406034-38065350.png" alt=""></p>
<p> 使用刚刚在配置文件里面配置的密码登录之后,可以看到如下管理界面:</p>
<p> <img style="width: 80%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190714000801667-1690433183.png" alt=""></p>
<p> 为了进行后面的演示,这里我们创建一个私有项目:</p>
<p> <img style="width: 70%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190714141406665-935155666.png" alt=""></p>
<p> 然后再创建一个项目管理员用户:</p>
<p> <img style="width: 70%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190714141613048-1590278802.png" alt=""></p>
<p> 最后,为test项目添加新创建的这个用户作为项目管理员(由于我们后续会演示镜像上传,所以这里设为管理员,如果只是拉取镜像,可以设为开发人员角色,如果只是看看那可以只设置为游客角色):</p>
<p> <img style="width: 70%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190714141743549-323450867.png" alt=""></p>
<p> 接下来我们就会在另一台主机中访问这台服务器上部署的Harbor私有镜像仓库了。</p>
<h2>3.4 Docker主机访问Harbor</h2>
<p> (1)首先,由于我们这里是自签证书,不是受信任的,所以我们要做一些准备工作才能在普通主机上访问到刚刚部署的Harbor镜像仓库。(注意:这一部分的操作在另外的一台主机上,非我们刚刚部署的Harbor的服务器上面)</p>
<p> 准备工作一:创建Harbor服务域名的证书文件夹</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">mkdir</span> /etc/docker/certs.d/reg.edisonedu.com -p</pre>
</div>
<p> 准备工作二:设置Hosts匹配我们设置的假域名</p>
<div class="cnblogs_code">
<pre>vim /etc/hosts</pre>
</div>
<p> 加上一行:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 128, 1)">47.22</span>.<span style="color: rgba(128, 0, 128, 1)">232.200</span> reg.edisonedu.com #替换为你的Harbor服务器外网IP</pre>
</div>
<p> 准备工作三:将Harbor服务器上的证书拷贝要访问Harbor仓库的主机上</p>
<p> 这一工作你可以选择直接通过SFTP软件将reg.edisonedu.com.crt从Harbor服务器上拷贝到客户机刚刚创建的文件夹中(/etc/docker/certs.d/reg.edisonedu.com</p>
<p>),也可以通过scp命令去拷贝,总之拷贝过来就行。这里我通过scp去拷贝:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">scp</span> root@<span style="color: rgba(128, 0, 128, 1)">47.22</span>.<span style="color: rgba(128, 0, 128, 1)">232.200</span>:/data/cert/reg.edisonedu.com.crt /etc/docker/certs.d/reg.edisonedu.com</pre>
</div>
<p> (2)其次,登录到Harbor镜像仓库(由于Docker的默认源是docker hub,所以刚刚我们需要改host,这里需要登录自己的源仓库)</p>
<div class="cnblogs_code">
<pre>docker <span style="color: rgba(0, 0, 255, 1)">login</span> reg.edisonedu.com</pre>
</div>
<p> (3)然后,就跟刚刚我们在docker hub中的步骤一样了,假设我们要push一个镜像到镜像仓库,首先打个Tag:</p>
<div class="cnblogs_code">
<pre>docker tag xdp-service-runtime:<span style="color: rgba(128, 0, 128, 1)">2.2</span> reg.edisonedu.com/test/xdp-service-runtime:<span style="color: rgba(128, 0, 128, 1)">2.2</span></pre>
</div>
<p> <em><strong>PS:</strong></em>这里我们打的tag加上了私有项目名test</p>
<p> 打完Tag,就可以push到镜像仓库了:</p>
<div class="cnblogs_code">
<pre>docker push reg.edisonedu.com/test/xdp-service-runtime:<span style="color: rgba(128, 0, 128, 1)">2.2</span></pre>
</div>
<p> 推送完后,我们可以到Harbor的Web管理界面中验证:</p>
<p> <img style="width: 70%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190714170913320-2010256563.png" alt=""></p>
<p> <img style="width: 70%; border: 2px solid rgba(221, 221, 221, 1); border-radius: 5px" src="https://img2018.cnblogs.com/blog/381412/201907/381412-20190714171452964-1370506417.png" alt=""></p>
<p> (4)推送完之后,我们想在其他docker主机中pull下来呢?</p>
<div class="cnblogs_code">
<pre>docker pull reg.edisonedu.com/test/xdp-service-runtime:<span style="color: rgba(128, 0, 128, 1)">2.2</span></pre>
</div>
<p> (5)如果想退出我们的私有仓库</p>
<div class="cnblogs_code">
<pre>docker logout reg.edisonedu.com</pre>
</div>
<h2>3.5 其他补充</h2>
<p> 如果想要继续更改harbor配置,那么改完后需要重新初始化Harbor:</p>
<div class="cnblogs_code">
<pre>docker-compose down -<span style="color: rgba(0, 0, 0, 1)">v # 暂停Harbor实例群
./prepare# 生成配置文件,根据 harbor.cfg 配置生成docker</span>-<span style="color: rgba(0, 0, 0, 1)">compose文件。
docker</span>-compose up -d# 后台启动Harbor实例群</pre>
</div>
<p> 想要暂停和重启Harbor:</p>
<div class="cnblogs_code">
<pre>docker-<span style="color: rgba(0, 0, 0, 1)">composestop # 暂停 Harbor
docker</span>-composestart # 启动 Harbor</pre>
</div>
<p> 不用Harbor了,那么可以彻底删除Harbor的数据和镜像文件:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># 彻底地删除 Harbor 的数据和镜像
</span><span style="color: rgba(0, 0, 255, 1)">rm</span> -r /data/<span style="color: rgba(0, 0, 0, 1)">database
</span><span style="color: rgba(0, 0, 255, 1)">rm</span> -r /data/registry</pre>
</div>
<h1>四、小结</h1>
<p> 本文总结了流行的几个镜像仓库的搭建步骤,并给出了基本使用示例。个人感觉:对于个人开发者或开源社区而言,docker hub主要提供的是类似于github的共享公共仓库(当然docker hub也有提供私有仓库)。对于小团队而言,官方提供的Registry项目可以帮助小团队快速地构建起自己的镜像仓库把精力更多放在快速迭代上面。而对于中大规模的团队,Harbor的企业级特性更加适合此类型的团队使用。</p>
<h1>参考资料</h1>
<p>李振良,《1天掌握Docker》</p>
<p>Harbor,《Installation Guide》</p>
<p>自由早晚乱余生,《Docker企业级镜像仓库Harbor的搭建与维护》</p>
<p>Ivanzz,《Harbor整体架构》</p>
<p>杨振涛,《Harbor介绍与实践》</p>
<p> </p>
<div id="Copyright">
<p>作者:周旭龙</p>
<p>出处:https://edisonchou.cnblogs.com</p>
<p>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。</p>
</div>
</div>
<div id="MySignature" role="contentinfo">
<div align="center"><img border="0" src="http://service.t.sina.com.cn/widget/qmd/2068032061/d643d182/10.png"></div><br><br>
来源:https://www.cnblogs.com/edisontalk/p/docker_registry_repository_setup_introduction.html
頁:
[1]