1. 程式人生 > 實用技巧 >Docker系列-5.分發映象

Docker系列-5.分發映象

Docker系列-5.分發映象

映象的管理分為手工分發和docker-hub或者Registry倉庫兩種方式

手工分發映象

使用docker savedocker load可以在沒有Registry的情況下實現image的線下分發和遷移

[root@localhost ~]# docker save ubuntu:latest -o ubuntu:tatest.tar
[root@localhost ~]# docker save ubuntu:latest | gzip > ubuntu:tatest.tgz

[root@localhost ~]# ls -lh
-rw-------. 1 root root  73M Aug  2 12:58 ubuntu:tatest.tar
-rw-r--r--. 1 root root  27M Aug  2 12:59 ubuntu:tatest.tgz

[root@localhost ~]# docker save redis:4.0.14_man | gzip >  redis:4.0.14_man.tgz         

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              update              3c7832c9920b        3 hours ago         96.4MB
ubuntu              latest              1e4467b07108        9 days ago          73.9MB
httpd               latest              9d2a0c6e5b57        10 days ago         166MB
nginx               latest              8cf1bfb43ff5        11 days ago         132MB
centos              latest              831691599b88        6 weeks ago         215MB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

[root@localhost ~]# docker load -i redis:4.0.14_man.tgz
4014348e492a: Loading layer [==================================================>]  173.8MB/173.8MB
f3aafaca0eb9: Loading layer [==================================================>]   7.69MB/7.69MB
d0549792a5c2: Loading layer [==================================================>]  103.1MB/103.1MB
bc8ef3880d58: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: redis:4.0.14_man

簡易Registry映象倉庫

Registry用於儲存 Docker 映象,包括映象的層次結構和元資料,利用它可以方便的實現映象的下載、上傳與修改。一般來說倉庫有Docker Hub主倉庫、公有云Registry,私有云Registry。

公有云Registry

Docker Hub是預設的Docker Registry。 Docker Hub 允許任何人線上託管自己的映象。

另外可以在/etc/docker/daemon.json 中加入更多的其他的國內Registry映象,一般公有云的Registry都是可以支援匿名Pull出鏡像的。

自建私有Registry

docker-registry歷經2代,registry1是python語言寫的,而現在registry2版本即docker-distribution更加安全和快速,並且是用go語言寫的,docker1.6及其以上版本已經不再支援老的Registry。

兩種方式安裝和部署Registry,第一種是用傳統的yum方式,安裝後通過systemctl來管理倉庫服務。

1 使用 yum 安裝docker-distribution

[root@localhost ~]# yum info docker-distribution
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.huaweicloud.com
Available Packages
Name        : docker-distribution
Arch        : x86_64
Version     : 2.6.2
Release     : 2.git48294d9.el7
Size        : 3.5 M
Repo        : extras/7/x86_64
Summary     : Docker toolset to pack, ship, store, and deliver content
URL         : https://github.com/docker/distribution
License     : ASL 2.0
Description : Docker toolset to pack, ship, store, and deliver content

[root@localhost ~]# yum install -y docker-distribution
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package docker-distribution.x86_64 0:2.6.2-2.git48294d9.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

====================================================================================================================================================
 Package                                  Arch                        Version                                     Repository                   Size
====================================================================================================================================================
Installing:
 docker-distribution                      x86_64                      2.6.2-2.git48294d9.el7                      extras                      3.5 M

Transaction Summary
====================================================================================================================================================
Install  1 Package

Total download size: 3.5 M
Installed size: 12 M
Downloading packages:
docker-distribution-2.6.2-2.git48294d9.el7.x86_64.rpm                                                                        | 3.5 MB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : docker-distribution-2.6.2-2.git48294d9.el7.x86_64                                                                                1/1 
  Verifying  : docker-distribution-2.6.2-2.git48294d9.el7.x86_64                                                                                1/1 

Installed:
  docker-distribution.x86_64 0:2.6.2-2.git48294d9.el7                                                                                               

Complete!

2 以容器方式安裝registry

[root@localhost ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
cbdbe7a5bc2a: Pull complete 
47112e65547d: Pull complete 
46bcb632e506: Pull complete 
c1cc712bcecd: Pull complete 
3db6272dcbfa: Pull complete 
Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d
Status: Downloaded newer image for registry:latest

企業級Registry映象倉庫

企業級映象倉庫方案

常見的幾種docker registry企業級實現,包括官方的registry、Harbor,Quay Enterprise以及 Nexus等。

相對於企業級Registry映象倉庫,簡易的Registry沒有考慮的因素有:

  • 缺少UI使用者介面

  • 缺少角色的許可權控制、使用者管理、許可權管控、行為審計等安全功能

  • 無法和企業的統一登入或者LDAP對接

  • 缺少對映象的漏洞掃描等安全防護

  • 缺少對映象檔案生命週期維護功能

  • 缺少映象其它映象倉庫的能力

  • 缺少高效的映象檔案分發能力,如,使用BT協議進行分發

  • 缺少映象倉庫的執行時監控

  • 缺少企業級的服務支援,如, bug fix、安全漏洞補丁的通知、產品升級等

  • 不適合大規模容器叢集的使用,特別是跨地域的在多個數據中心進行映象的同步

Harbor

Harbor是VMware公司開源的企業級雲原生Registry專案, 由中國研發團隊開源,包含在vmware tanzu產品中,用來儲存、簽名並掃描儲存工件,能夠提供諸如使用者管理,訪問控制,活動審計,和節點間的複製等一系列高階功能,可以讓你迅速的搭建自己的私有映象倉庫。Harbor只能通過docker的方式進行部署,但是Harbor的開源版本並沒有與Kubernetes進行深度整合;不能執行在K8S平臺上。

Quay Enterprise

Quay.io是第一個使用私有儲存庫的託管映象倉庫。CoreOS於2014年收購了Quay,以推出首個企業級的映象倉庫。2018年CoreOS被Red Hat收購之後,Red Hat也將Quay Enterprise產品開源並持續提供企業級的支援服務。
Quay Enterprise 也是最早支援 OCI 規範的企業級映象倉庫,與 Kubernetes 整合為 Operator 提供良好的支援,並提供以下的特性:

  • 異地複製

  • 高可用性和可擴充套件性

  • 安全掃描

  • 自動構建觸發器

  • 時間機器image回滾(基於build版本的回退)

  • 細粒度的訪問控制

  • 詳細的日誌和審計

  • 自動連續垃圾收集,無需停機

  • 與多個儲存後端整合 (如 ceph 等)

  • 支援多種身份提供商:LDAP,OAuth,OpenStack Keystone等。

  • 加密的CLI密碼

  • 洪流分佈

  • 容器和應用程式註冊

  • 與Quay.io保持一致的UI和程式碼庫

Nexus3

在企業中Nexus最初是給 Java用的,大家把一些工具包放入Nexus中,後來慢慢發展,可以作為眾多軟體pipy、yum的倉庫,最新版本 Nexus3.x 全面支援 Docker 的私有映象。所以使用 Nexus3.x 一個軟體來統一管理 Docker , Maven , Yum , PyPI 也是一個明智的選擇。Nexus支援傳統和容器兩種方式部署。

總結

它們之間的各方面對比如下表所示:

對比項 Harbor Quay Nexus
語言 Golang Python Java
部署方式 docker容器 docker容器 docker容器+傳統方式
使用者管理 支援 DB、LDAP 和 OIDC 支援 LDAP、Keystone、OIDC、Google 和 GitHub 支援與外部LDAP/AD
機器人賬號 支援 支援 支援
許可權管理 支援 支援 支援
圖形使用者介面 支援 支援 支援
使用文件 非常全面 較少 待定
映象安全掃描 支援 支援 可整合Clair
映象可信 支援 支援 待定
映象清理 支援 支援 支援
審計日誌 支援 支援 待定
Helm 管理 支援 支援 支援
多倉庫管理 支援 不支援 支援多種不同型別倉庫管理
映象同步 支援 不支援 支援Proxy代理到另一個映象庫
程式碼倉庫整合 不支援 支援 支援
映象構建 不支援 支援 不支援
映象下載 不支援 支援 支援
通知 支援 Webhook 支援站內信、Webhook、Email、Slack 等 支援

參考

常見的幾種開源映象倉庫介紹

私有映象倉庫選型:Harbor VS Quay