離線環境下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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM