前言:
互聯網的很多項目都需要在離線環境下更新,實施,維護,有的是涉密機構,有的僅僅是為了業務的安全,那么在這種場景下的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