說明
記錄搭建 docker 私有倉庫步驟
介紹
docker鏡像可以托管到dockerhub中,跟代碼庫托管到github是一個道理。但如果我們不想把docker鏡像公開放到dockerhub中,只想在部門或團隊內部共享docker鏡像,能不能項gitlab一樣在搭建私有的倉庫呢?答案是肯定的,docker也支持將鏡像存到私有倉庫。下面將驗證docker原生的倉庫和開源的私用倉庫,並分析其特點。
原理
Docker模型的核心部分是有效的利用分層鏡像機制,鏡像可以通過分層來進行繼承,基於基礎鏡像,可以制作各種具體的應用鏡像。不同的Docker容器可以共享一些基礎的文件系統層,同時再加上自己獨有的改動層,大大提高了存儲的效率。由於最終鏡像最終是以tar.gz的方式靜態存儲在服務器端,這種存儲適用於對象存儲而不是塊存儲。
一次docker pull (即用戶從客戶端向倉庫拉鏡像),發生的交互
- 客戶端向索引請求ubuntu鏡像下載地址
- 索引回復:ubuntu所在倉庫A、 ubuntu鏡像的校驗碼(Checksum)和所有層的Token
- 客戶端向倉庫A請求 ubuntu的所有層(倉庫A負責存儲ubuntu,以及它所依賴的層)
- 倉庫A向索引發起請求,驗證用戶Token的合法性
- 索引返回這次請求是否合法
- 客戶端從倉庫下載所有的層,倉庫從后端存儲中獲取實際的文件數據,返給客戶端
搭建
本次直接使用yum
安裝 docker-registry
[root@registory ~]# yum install docker-registry -y
[root@registory ~]# rpm -ql docker-distribution # 查看安裝包詳細信息
/etc/docker-distribution/registry/config.yml # 配置文件
/usr/bin/registry # 啟動明命令
/usr/lib/systemd/system/docker-distribution.service # 服務啟動腳本
/usr/share/doc/docker-distribution-2.6.2
/usr/share/doc/docker-distribution-2.6.2/AUTHORS
/usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md
/usr/share/doc/docker-distribution-2.6.2/LICENSE
/usr/share/doc/docker-distribution-2.6.2/MAINTAINERS
/usr/share/doc/docker-distribution-2.6.2/README.md
/var/lib/registry # Docker 鏡像存放的目錄
查看配置文件
[root@registory ~]# cat /etc/docker-distribution/registry/config.yml
version: 0.1
log:
fields:
service: registry # 服務名稱
storage:
cache:
layerinfo: inmemory
filesystem:
rootdirectory: /var/lib/registry # 鏡像存放目錄,可以根據情況修改
http:
addr: :5000 # 端口,這里需要根據實際情況來修改為 80 或者 443
這里先不進行修改,簡便安裝使用。
啟動
[root@registory ~]# systemctl start docker-distribution
[root@registory ~]# ps aux|grep registry
root 20843 0.0 0.8 307476 17476 ? Ssl 13:31 0:00 /usr/bin/registry serve /etc/docker-distribution/registry/config.yml
上傳和下載鏡像測試
測試上傳鏡像
注意: 默認情況下,docker使用的是https方式上傳和下載,本次是用的是5000端口,所以需要手動配置一下
[root@registory ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://0tb09e4d.mirror.aliyuncs.com"], # 鏡像加速
"insecure-registries": ["registry.kubernetes:5000"] # 這里列表中可配置多個
}
說明:上述中的registry.kubernetes
手動寫了hosts文件,所以需要注意,在需要使用該registry的機器上,都需要能解析。
[root@registory ~]# grep registry /etc/hosts
192.168.1.120 registry registry.kubernetes
然后隨意上傳一個打包好的鏡像
[root@registory registry]# docker push registry.kubernetes:5000/myweb:v0.3-6
The push refers to repository [registry.kubernetes:5000/myweb]
cc7d034b0d81: Pushed
b9a751a05ed2: Pushed
076c58d2644f: Pushed
b2cbae4b8c15: Pushed
5ac9a5170bf2: Pushed
a464c54f93a9: Pushed
v0.3-6: digest: sha256:016196f127de6b4b726f0ea466216567903ad8c4820cf37b62559ea78d7f2ec3 size: 1567
測試下載鏡像
也需要手動配置hosts解析和docker的配置文件修改
[root@node03 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://0tb09e4d.mirror.aliyuncs.com"], # 鏡像加速
"insecure-registries": ["registry.kubernetes:5000"] # 這里列表中可配置多個
}
[root@node03 ~]# grep registry /etc/hosts
192.168.1.120 registry registry.kubernetes
操作查看
[root@node03 ~]# docker image pull registry.kubernetes:5000/myweb:v0.3-6
v0.3-6: Pulling from myweb
bdf0201b3a05: Pull complete
3d0a573c81ed: Pull complete
8129faeb2eb6: Pull complete
3dc99f571daf: Pull complete
c77cad417662: Pull complete
f8733d9c3f79: Pull complete
Digest: sha256:016196f127de6b4b726f0ea466216567903ad8c4820cf37b62559ea78d7f2ec3
Status: Downloaded newer image for registry.kubernetes:5000/myweb:v0.3-6
registry.kubernetes:5000/myweb:v0.3-6
[root@node03 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.kubernetes:5000/myweb v0.3-6 63478b4469e1 21 hours ago 16MB