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

本文涉及的产品
.cn 域名,1个 12个月
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文总结了流行的几个镜像仓库的搭建步骤,并给出了基本使用示例。个人感觉:对于个人开发者或开源社区而言,docker hub主要提供的是类似于github的共享公共仓库(当然docker hub也有提供私有仓库)。

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

一、官方标配:Registry私有镜像仓库

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

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

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

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

1.1 搭建镜像仓库

  首先,下载Registry镜像并启动

docker pull registry

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

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

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

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

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

1.2 上传镜像

  首先,为了让客户端服务器能够快速地访问刚刚在服务端搭建的镜像仓库(默认情况下是需要配置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

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

1.3 下载镜像

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

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

  示例:

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

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

二、共享源头:Docker Hub公共镜像仓库

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

2.1 注册和创建仓库

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

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

2.2 客户端操作

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

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

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

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

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

docker push edisonsaonian/xdp-service-runtime:2.2

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

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

  怎么样,是不是很Easy,Enjoy

三、企业最爱:Harbor企业级镜像仓库

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

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

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

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

  下面列出了Harbor的搭建过程,主要参考自Harbor的github文档:

3.1 一些准备工作

  (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

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

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

3.2 自签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

3.3 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实例:

  可以看到,整个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的管理平台登录页面了:

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

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

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

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

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

3.4 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管理界面中验证:

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

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

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

docker logout reg.edisonedu.com

3.5 其他补充

  如果想要继续更改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

四、小结

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

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
13天前
|
缓存 监控 持续交付
|
1天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
13 2
|
3天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
8 1
|
4天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
9天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
21 1
|
16天前
|
Docker 容器
docker:记录如何在x86架构上构造和使用arm架构的镜像
为了实现国产化适配,需将原x86平台上的Docker镜像转换为适用于ARM平台的镜像。本文介绍了如何配置Docker buildx环境,包括检查Docker版本、安装buildx插件、启用实验性功能及构建多平台镜像的具体步骤。通过这些操作,可以在x86平台上成功构建并运行ARM64镜像,实现跨平台的应用部署。
123 2
|
20天前
|
网络协议 Docker 容器
docker pull命令拉取镜像失败的解决方案
docker pull命令拉取镜像失败的解决方案
425 0
|
20天前
|
Go Docker Python
docker的python与go镜像的制作
docker的python与go镜像的制作
21 1
|
27天前
|
缓存 安全 Linux
docker镜像管理问题
【10月更文挑战第3天】
74 1
|
27天前
|
NoSQL MongoDB Docker
求助,有没有大神可以找到arm64架构下mongodb的3.6.8版本的docker镜像?
在Docker Hub受限的情况下,寻求适用于ARM架构的docker镜像资源或拉取链接,以便在x86架构上获取;内网中的机器为ARM架构,因此优先请求适合ARM的Docker镜像或Dockerfile,非常感激您的帮助。