云原生之Docker镜像仓库

1. 前言

同为虚拟化技术,Docker相对于VMWare有什么特点,或者最吸引我的特点?我认为最主要的是Docker Image技术,它让我们非常方便地把应用程序包和其依赖环境打包成一个Docker镜像文件,而且这个文件相对来说还非常小,一般就是几M到几十M,然后不管是开发环境、测试环境、预发布环境还是各个线上环境,只要环境里安装了Docker Engine就可以行为一致地运行起来,不需要去考虑烦人的目标系统的依赖问题。

那么这个Docker镜像文件怎么管理?是不是手工直接放到文件系统里,每个环境的每台Linux服务器都去scp上传一次,如果这么做,运维人员就有巨大工作量了,所以需要一个集中存储镜像文件的系统,以及很方便的访问API接口服务,一次push推送进镜像管理系统,其它任何Linux服务器按API接口进行pull拉取即可。

这样的系统叫作Docker镜像仓库,一般有公有仓库和私有仓库两种。

2. 公有仓库Docker Hub

Docker Hub是Docker提供的一项服务,我们可以查找一般的公共容器镜像,比如基础的Linux系统镜像,这种镜像我们没有必要自己来制作。

Docker Hub是世界上最大的容器镜像存储库,拥有一系列内容源,包括容器社区开发人员、开放源代码项目和独立软件供应商(ISV)在容器中构建和分发代码。

官网:https://hub.docker.com/

我们可以访问免费的公共存储库来存储和共享镜像,也可以为私有存储库选择订阅计划。

Docker Hub提供以下主要功能:

  1. 仓库:推拉容器镜像。
  2. 团队和组织:管理对容器映像的私有存储库的访问。
  3. 官方镜像:提取并使用Docker提供的高质量容器镜像。
  4. Publisher-Images:拉取并使用外部供应商提供的高质量容器镜像。
  5. 构建:从GitHub和Bitbucket自动构建容器镜像,并将它们推送到Docker Hub。
  6. Webhooks:成功推送到存储库后触发操作,以将Docker Hub与其他服务集成。

从仓库下载一个镜像:

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]

向仓库上传一个镜像:

docker image push [OPTIONS] NAME[:TAG]

如果我们在配置image参数时不设置域名和端口,则默认从Docker Hub上拉取镜像。当然互联网上还有一些其它镜像仓库可供使用,可以自己去搜索一下。

3. 私有仓库Docker Registry

基础镜像从Docker Hub拉取非常方便,但是我们自己业务系统构建生成的镜像文件,推送到Docker Hub存储起来供我们使用,有几个问题:

  1. 访问慢:毕竟是国外的服务,push和pull肯定不是每时每刻都速度快;
  2. 安全问题:企业的业务系统镜像文件,不可能推送到公共镜像仓库里去;
  3. 内网问题:如果是安全性要求高的内网环境,无法访问互联网,所以访问Docker Hub无从谈起。

因此,我们需要自己建立一个镜像仓库,在自己的机房环境里,专门供自己业务平台使用,这就是私有仓库。

Docker Hub上已经制作好了它的镜像registry和docker-registry-web,一个是私有镜像系统本身,一个是它的web管理系统。

我们可以编写一个docker-compose.yaml来编排这两个服务进行安装和管理:

XML 复制代码
version: '3'

services:
  api:
    image: registry:2.7.1
    restart: always
    volumes:
      - /data/registry:/var/lib/registry
    ports:
      - 5000:5000
  web:
    image: hyper/docker-registry-web:v0.1.2
    restart: always
    ports:
      - 8080:8080
    environment:
      - REGISTRY_URL=http://api:5000/v2
      - REGISTRY_NAME=192.168.1.100:5000
      - REGISTRY_READONLY=false

服务安装执行:

docker-compose up -d

docker push和docker pull默认是访问https协议的,我们内网一般采用http即可,需要修改/etc/docker/daemon.json:

{

"insecure-registries" : ["registry:5000"]

}

修改配置文件之后,需要重启docker daemon:

sudo systemctl restart docker

上面用到了registry域名,我们需要在每个docker swarm节点上/etc/hosts设置域名指向192.168.1.100,或者使用CoreDNS进行配置就更好。

一切都准备好之后,我们就可以push和pull镜像文件到我们自己的私有镜像仓库了,只要在docker-compose.yml或其它命令参数里指定registry:5000,如:

image: registry:5000/backend-api:${VERSION}

最后我们可以访问registry web进行查看和管理我们推送的镜像文件了:http://192.168.1.100:8080/

界面实在是太简陋,就是显示出镜像文件列表和详情,就不截图说明了。

4. 私有仓库Harbor

如果嫌弃Docker registry太简陋,需要更强大的管理能力,那就使用CNCF的Harbor系统,CNCF说明参见:Harbor | CNCF,Harbor官网:Harbor,具体的架构分析和安装使用,我们在另外单独的文章中再叙述。

5. 总结

Docker镜像仓库是Docker镜像文件集中存储和管理的系统,我们发布的镜像文件可以很方便地push进镜像仓库,而容器集群任何节点都可以很方便地pull镜像仓库里的镜像文件下来进行部署。如果你的系统环境很小很简单,使用Docker registry就足够了,不然则使用Harbor吧。

相关推荐
景天科技苑30 分钟前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge1 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇1 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试3 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!9 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林10 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis12 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision12 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge12 小时前
Docker篇(Docker Compose)
运维·docker·容器
茶馆大橘13 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel