云原生之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吧。

相关推荐
xiao智11 分钟前
剖析 Docker Swarm 操作对容器端口影响
docker
葟雪儿44 分钟前
Docker常用命令
linux·服务器·spring cloud·docker·微服务·容器
AutoMQ2 小时前
吉利汽车采用 EMQX 与AutoMQ联合方案构建公私有云一体化的车联网核心架构
云原生·架构·云计算·汽车
爬台阶的蚂蚁3 小时前
搭建docker registry私服,并且支持https推送
docker·容器·https
小小她爹3 小时前
dify新版本1.1.3的一些问题
云原生·eureka
张家宝68373 小时前
Containerd学习
后端·容器
容器魔方5 小时前
KubeEdge边缘设备管理系列(五):Mapper-Framework设备数据写入
云原生·容器·云计算
晴空๓5 小时前
在CentOS上安装Docker需要注意的事项
linux·docker·centos
穷儒公羊6 小时前
第一部分——Docker篇 第一章 Docker容器
运维·docker·云原生·容器
飞猪~6 小时前
docker相关命令
运维·docker·容器