Docker Registry

Stella981
• 阅读 640

1. 理解Registry

一个registry是一个存储和内容交付系统,其中维护着若干命名的Docker镜像,这些镜像有不同的标记版本。(例如:有一个镜像名字叫 hello/world,它有两个tags分别是2.0和2.1)

用户通过使用 docker push 和 docker pull 命令与 registry 进行交互。(例如:docker pull registry-1.docker.io/hello/world:2.1)

A registry is a storage and content delivery system, holding named Docker images, available in different tagged versions.Users interact with a registry by using docker push and pull commands.

前面说了,registry是一个存储系统,它存储的是Docker镜像。那么,镜像到底存到哪里呢?存储本身委托给驱动程序。默认的存储驱动程序是本地posix文件系统,还支持其它基于云的存储驱动程序,例如 Aliyun OSS

由于保护对托管映像的访问至关重要,因此Registry本身支持TLS和基本身份验证。

1.1. 理解镜像命名

docker pull ubuntu 指示docker从官方Docker Hub中拉取一个名字叫ubuntu的镜像。这条命令其实是docker pull docker.io/library/ubuntu的简写

docker pull myregistrydomain:port/foo/bar 指示docker拉取位于myregistrydomain:port的镜像foo/bar

1.2. 用例

运行你自己的Registry是与CI/CD系统集成并对其进行补充的绝佳解决方案。在典型的工作流程中,对源版本控制系统的提交将触发在CI系统上的构建,如果构建成功,则将新镜像推送到你的Registry。然后,来自Registry的通知将触发在暂存环境上的部署,或者通知其它系统有一个新镜像可用。

如果要在大型计算机集群上快速部署新镜像,它也是必不可少的组件。

这也是在隔离的网络中分发镜像的最佳方法。

2. 部署一个registry server

# Run a local registry
docker run -d -p --restart=always --name registry registry:2

2.1. Copy an image from Docker Hub to your registry

你可以从Docker Hub上拉取一个镜像,并把它推送到你自己的Registry上。下面的例子中,从Docker Hub上拉取镜像ubuntu:16.04,并将其重新打标记为my-ubuntu,然后将其推送到本地registry,最后,再将ubuntu:16.04和my-ubuntu删除。

# 1. Pull the ubuntu:16.04 image from Docker Hub
docker pull ubuntu:16.04

# 2. Tag the image as localhost:5000/my-ubuntu
#   (注意,当tag的第一部分是主机名和端口时,push时Docker会将其解释为registry的位置)
docker tag ubuntu:16.04 localhost:5000/my-ubuntu

# 3. Push the image to the local registry running at localhost:5000
docker push localhost:5000/my-ubuntu

# 4. Remove the locally-cached ubuntu:16.04 and localhost:5000/my-ubuntu images, so that you can test pulling the image from your registry. This does not remove the localhost:5000/my-ubuntu image from your registry.
docker image remove ubuntu:16.04
docker image remove localhost:5000/my-ubuntu

# 5. Pull the localhost:5000/my-ubuntu image from your local registry
docker pull localhost:5000/my-ubuntu 

停止本地registry

# stop the registry
docker container stop registry
# remove the container
docker container stop registry && docker container rm -v registry

3. 基本配置

为了配置container,可以给docker run命令指定额外的选项参数

# 自动重启registry
# -p选项的值,第一个是主机端口,第二个是容器端口。在容器中,registry默认监听端口是5000
docker run -d -p 5000:5000 --restart=always --name registry registry:2
# 自定义存储位置
docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/registry:/var/lib/registry registry:2

3.1. 运行一个外部可访问的registry

运行一个仅在本地主机上可访问的registry没有什么用处,为了使你的registry可供外部主机访问,必须首先使用TLS保护registry。

下面是一个将registry作为服务来运行的例子:

首先,获得一个证书

假设你的registry的URL是https://myregistry.domain.com/,同时假设的DNS,路由和防火墙设置允许通过端口443访问registry的主机,再假设你已经从CA那里获得一个证书。

那么,接下来

创建一个certs目录

从CA那里复制.crt和.key文件到certs目录,假设分别重命名为domain.crt和domain.key

重启registry,将其指向使用TLS证书

docker run -d \
     --restart=always \
     --name registry \
     -v "$(pwd)"/certs:/certs \
     -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
     -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
     -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
     -p 443:443 \
     registry:2 

现在Docker客户端就可以通过registry的外网地址进行pull和push了

docker pull ubuntu:16.04
docker tag ubuntu:16.04 myregistry.domain.com/my-ubuntu
docker push myregistry.domain.com/my-ubuntu
docker pull myregistry.domain.com/my-ubuntu

将registry作为一个服务运行

与独立容器相比,swarm services具有多个优点。它们使用声明式模型,这意味着你定义了所需的状态,而Docker则将服务保持在该状态。服务提供了自动负载平衡扩展,并具有控制服务分配的能力以及其他优势。服务还允许你秘密存储敏感数据,例如TLS证书。

下面这个例子将registry作为单副本服务启动,可以在端口80上的任何群集节点上访问该registry,并假定使用的是与前面示例相同的TLS证书。

# 首先,保存TLS证书和key作为secret
docker secret create domain.crt certs/domain.crt
docker secret create domain.key certs/domain.key

# 接下来,将你想要在上面允许registry的node添加一个标签
docker node update --label-add registry=true node1

# 再接着,创建一个服务,并授权它可以访问两个secret,并将其限制为仅在标签为registry=true的节点上运行
docker service create \
     --name registry \
     --secret domain.crt \
     --secret domain.key \
     --constraint 'node.labels.registry==true' \
     --mount type=bind,src=/mnt/registry,dst=/var/lib/registry \
     -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
     -e REGISTRY_HTTP_TLS_CERTIFICATE=/run/secrets/domain.crt \
     -e REGISTRY_HTTP_TLS_KEY=/run/secrets/domain.key \
     --publish published=443,target=443 \
     --replicas 1 \
     registry:2

现在你可以在任何swarm节点的443端口上访问服务。Docker会将请求发送到运行该服务的节点。

4. 文档

# 启动registry
docker run -d -p 5000:5000 --name registry registry:2
# 从Docker Hub上拉取镜像
docker pull ubuntu
# 给镜像打tag
docker image tag ubuntu localhost:5000/myfirstimage
# 推送至你自己的registry
docker push localhost:5000/myfirstimage
# 再次从你自己的registry拉取镜像
docker pull localhost:5000/myfirstimage
# 停止registry并删除所有数据
docker container stop registry && docker container rm -v registry

https://docs.docker.com/registry/introduction/

https://docs.docker.com/registry/deploying/

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这