前言:
互联网的很多项目都需要在离线环境下更新,实施,维护,有的是涉密机构,有的仅仅是为了业务的安全,那么在这种场景下的docker或k8s环境下进行产品的迭代更新就是一个比较麻烦的事情,尤其是在大项目,多组件的情况下,比较繁琐,而使用离线缓存仓库registry,可以很好的解决这个问题,当然,不是使离线环境发生变化,而是使用在线下载,离线上传,上传仓库,修改tag,上传私有缓存仓库的方式来完成的,下面,介绍这个工具的使用:
1.1、介绍
registry用于保存docker 镜像,包括镜像的层次结构和元数据。
启动容器时,docker daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其将从registry中下载该镜像并保存到本地;
拉取镜像时,如果不知道registry仓库地址,默认从docker HUB搜索拉取镜像
1.2、分类
Sponsor Registry:第三方的registry,供客户和docker社区使用;
mirror Registry:第三方的registry,只让客户使用;如docker cn和阿里云的镜像加速器;
vendor Registry:服务商的registry,由发布docker镜像的供应商提供的registry;如红帽提供的专有的,收费提供;
private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry;自建的registry,在本地搭建registry,节省带宽
1.3、registry组成(repository和index)
1)repository
由特定的docker镜像的所有迭代版本组成的镜像仓库
一个registry中可以存在多个repository
repository可以分为“顶层仓库”和“用户仓库”
用户仓库名称格式为“用户名/仓库名”
每个仓库可以包含多个Tag(标签)。每个标签对应一个镜像
2)Index
维护用户账户、镜像的校验以及公共命名空间的信息
相当于为registry提供了一个完整用户认证等功能的检索接口
1.4、拉取上传仓库镜像
1)拉取镜像
docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
注:
registry :仓库服务器地址:不指定默认是docker hub
port: 端口;默认是443,因为是https协议
namespace: 名称空间,指是哪个用户的仓库,如果是顶层仓库,可省略
name:仓库名
tar: 标签名;默认是latest版本
2)上传镜像
docker push [OPTIONS]NAME:TAG
2、搭建私有仓库distribution
2.1、distribution介绍
docker提供的开源registry,但是很简单,只能作为存储镜像的仓库,没有额外的功能;如管理页面等
2.2、安装启动distribution
两种方案可安装,我采用的是方案2
方案1:使用yum安装(直接从extras源中下载安装)
[root@hackerlin ~]# yum info docker-distribution
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
可安装的软件包
名称 :docker-distribution
架构 :x86_64
版本 :2.6.2
发布 :2.git48294d9.el7
大小 :3.5 M
源 :extras/7/x86_64
简介 : Docker toolset to pack, ship, store, and deliver content
网址 :https://github.com/docker/distribution
协议 : ASL 2.0
描述 : Docker toolset to pack, ship, store, and deliver content
[root@hackerlin ~]# yum -y install docker-distribution
方案2、拉取镜像,作为容器安装
拉取镜像
[root@hackerlin dockerfile]# docker pull registry:2.6.2
Trying to pull repository docker.io/library/registry ...
2.6.2: Pulling from docker.io/library/registry
486039affc0a: Pull complete
ba51a3b098e6: Pull complete
470e22cd431a: Pull complete
1048a0cdabb0: Pull complete
ca5aa9d06321: Pull complete
Digest: sha256:c4bdca23bab136d5b9ce7c06895ba54892ae6db0ebfc3a2f1ac413a470b17e47
Status: Downloaded newer image for docker.io/registry:2.6.2
启动registry容器
[root@hackerlin dockerfile]# docker run --name registry -p 5000:5000 -v /data/registry:/var/lib/registry -d registry:2.6.2
WARNING: IPv4 forwarding is disabled. Networking will not work.
f876e8e76b97383bf0e070762b6da65c49de49c1c163e17b05bbc3e2d533544c
[root@hackerlin dockerfile]# docker port registry
5000/tcp -> 0.0.0.0:5000
[root@hackerlin dockerfile]# ss -tlnp | grep 5000
LISTEN 0 128 [::]:5000 [::]:* users:(("docker-proxy-cu",pid=17038,fd=4))
[root@hackerlin dockerfile]# docker inspect -f {{.Mounts}} registry
[{bind /data/registry /var/lib/registry true rprivate}]
注:
-p 5000:5000:将容器中的5000端口,暴露在宿主机的5000端口
-v /data/registry:/var/lib/registry:指定宿主机存储的位置为 /data/registry
-d:后台运行容器
2.3、从私有仓库上传下载镜像
1)将本地的镜像上传到私有仓库
现将本地仓库打上合适的标签
[root@hackerlin dockerfile]# docker tag busybox:latest 192.169.72.200:5000/busybox:v0.1
#注意这里打包必须打成IP地址这个格式的
[root@hackerlin dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.169.72.200:5000/busybox v0.1 83aa35aa1c79 5 weeks ago 1.22 MB
docker.io/busybox latest 83aa35aa1c79 5 weeks ago 1.22 MB
docker.io/registry 2.6.2 10b45af23ff3 2 months ago 28.5 MB
docker.io/nginx 1.14-alpine 8a2fb25a19f5 12 months ago 16 MB
尝试上传镜像
[root@hackerlin dockerfile]# docker push 192.169.72.200:5000/busybox:v0.1
The push refers to a repository [192.169.72.200:5000/busybox]
Get https://192.169.72.200:5000/v1/_ping:http: server gave HTTP response to HTTPS client
上传失败;原因:docker上传下载默认只支持https协议,搭建的私有仓库是http协议
修改重启docker服务
[root@hackerlin dockerfile]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["192.168.72.200:5000"]
}
[root@hackerlin dockerfile]# systemctl restart docker
再次上传镜像,成功
[root@hackerlin dockerfile]# docker push 192.168.72.200:5000/busybox:v1
The push refers to a repository [192.168.72.200:5000/busybox]
5b0d2d635df8: Pushed
v1: digest: sha256:a2490cec4484ee6c1068ba3a05f89934010c85242f736280b35343483b2264b6 size: 527
在私有仓库的服务器上验证(这里是做了挂载的)
[root@hackerlin v2]# ll /data/registry/docker/registry/v2/
total 0
drwxr-xr-x. 3 root root 20 Apr 16 02:35 blobs
drwxr-xr-x. 3 root root 21 Apr 16 02:35 repositories
从私有仓库拉取镜像,先删除再拉取
[root@hackerlin v2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.72.200:5000/busybox v1 be5888e67be6 35 hours ago 1.22 MB
docker.io/busybox latest be5888e67be6 35 hours ago 1.22 MB
docker.io/registry 2.6.2 10b45af23ff3 2 months ago 28.5 MB
docker.io/nginx 1.14-alpine 8a2fb25a19f5 12 months ago 16 MB
[root@hackerlin v2]# docker rmi -f be5888e67be6
Untagged: 192.168.72.200:5000/busybox:v1
Untagged: 192.168.72.200:5000/busybox@sha256:a2490cec4484ee6c1068ba3a05f89934010c85242f736280b35343483b2264b6
Untagged: docker.io/busybox:latest
Untagged: docker.io/busybox@sha256:89b54451a47954c0422d873d438509dae87d478f1cb5d67fb130072f67ca5d25
Deleted: sha256:be5888e67be651f1fbb59006f0fd791b44ed3fceaa6323ab4e37d5928874345a
Deleted: sha256:5b0d2d635df829f65d0ffb45eab2c3124a470c4f385d6602bda0c21c5248bcab
[root@hackerlin v2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry 2.6.2 10b45af23ff3 2 months ago 28.5 MB
docker.io/nginx 1.14-alpine 8a2fb25a19f5 12 months ago 16 MB
[root@hackerlin v2]# docker pull 192.168.72.200:5000/busybox:v1
Trying to pull repository 192.168.72.200:5000/busybox ...
v1: Pulling from 192.168.72.200:5000/busybox
e2334dd9fee4: Pull complete
Digest: sha256:a2490cec4484ee6c1068ba3a05f89934010c85242f736280b35343483b2264b6
Status: Downloaded newer image for 192.168.72.200:5000/busybox:v1
[root@hackerlin v2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.72.200:5000/busybox v1 be5888e67be6 35 hours ago 1.22 MB
docker.io/registry 2.6.2 10b45af23ff3 2 months ago 28.5 MB
docker.io/nginx 1.14-alpine 8a2fb25a19f5 12 months ago 16 MB