离线环境下docker镜像的共享-搭建本地缓存镜像仓库

前言:

  互联网的很多项目都需要在离线环境下更新,实施,维护,有的是涉密机构,有的仅仅是为了业务的安全,那么在这种场景下的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
原文地址:https://www.cnblogs.com/xiaoyuxixi/p/13099319.html