1、背景
在 Docker 中,當我們執行 docker pull xxx 的時候,可能會比較好奇,docker 會去哪兒查找並下載鏡像呢?
它實際上是從 registry.hub.docker.com 這個地址去查找,這就是Docker公司為我們提供的公共倉庫,上面的鏡像,大家都可以看到,也可以使用。所以,我們也可以帶上倉庫地址去拉取鏡像,如:docker pull registry.hub.docker.com/library/alpine,不過要注意,這種方式下載的鏡像的默認名稱就會長一些。
如果要在公司中使用 Docker,我們基本不可能把商業項目上傳到公共倉庫中,那如果要多個機器共享,又能怎么辦呢?
正因為這種需要,所以私有倉庫也就有用武之地了。
所謂私有倉庫,也就是在本地(局域網)搭建的一個類似公共倉庫的東西,搭建好之后,我們可以將鏡像提交到私有倉庫中。這樣我們既能使用 Docker 來運行我們的項目鏡像,也避免了商業項目暴露出去的風險。
下面我們用官方提供的registry鏡像來搭建私有鏡像倉庫,當然還有其它很多方法。
2、環境
准備兩台安裝好docker的服務器:
服務端機器 (主機名為registry):docker私有倉庫服務器,運行registry容器;
測試端機器 (主機名為node):普通的docker服務器,在這台服務器上下載一個測試鏡像busybox,然后上傳到registry服務器進行測試;
3、部署(服務端操作)
3.1 下載鏡像registry
[root@registry ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
81033e7c1d6a: Pull complete
b235084c2315: Pull complete
c692f3a6894b: Pull complete
ba2177f3a70e: Pull complete
a8d793620947: Pull complete
Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
Status: Downloaded newer image for registry:latest
3.2 查看鏡下是否pull下來了
docker:用registry快速搭建私有鏡像倉庫
[root@mhshhtitylywb01 log]# docker images
registry latest 2e2f252f3c88 3 months ago 33.3MB
3.3 運行registry容器
[root@registry ~]# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
06a972de6218b1f1c3bf9b53eb9068dc66d147d14e18a89ab51db13e339d3dc9
參數說明
-itd:在容器中打開一個偽終端進行交互操作,並在后台運行;
-v:把宿主機的/data/registry目錄綁定 到 容器/var/lib/registry目錄(這個目錄是registry容器中存放鏡像文件的目錄),來實現數據的持久化;
-p:映射端口;訪問宿主機的5000端口就訪問到registry容器的服務了;
--restart=always:這是重啟的策略,假如這個容器異常退出會自動重啟容器;
--name registry:創建容器命名為registry,你可以隨便命名;
registry:latest:這個是剛才pull下來的鏡像;
3.4 測試鏡像倉庫中所有的鏡像
[root@registry ~]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
現在是空的,因為才剛運行,里面沒有任何鏡像內容。
4、測試鏡像倉庫(測試端操作)
4.1 修改下鏡像源並重啟docker服務
[root@node ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}
[root@node ~]# systemctl restart docker
4.1 下載busybox鏡像
[root@node ~]# docker pull busybox
[root@node ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest f6e427c148a7 36 hours ago 1.15MB
4.2 為鏡像打標簽
[root@node ~]# docker tag busybox:latest 172.18.18.90:5000/busybox:v1
格式說明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
busybox:lastest 這是源鏡像,也是剛才pull下來的鏡像文件;
172.18.18.90:500/busybox:v1:這是目標鏡像,也是registry私有鏡像服務器的IP地址和端口;
查看一下打好的tag:
docker:用registry快速搭建私有鏡像倉庫
4.3 上傳到鏡像服務器
[root@node ~]# docker push 172.18.18.90:5000/busybox:v1
The push refers to repository [172.18.18.90:5000/busybox]
Get https://172.18.18.90:5000/v2/: http: server gave HTTP response to HTTPS client
注意了,這是報錯了,需要https的方法才能上傳,我們可以修改下daemon.json來解決:
[root@node ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "172.18.18.90:5000"]
}
添加私有鏡像服務器的地址,注意書寫格式為json,有嚴格的書寫要求,然后重啟docker服務:
[root@node ~]# systemctl restart docker
在次上傳可以看到沒問題 了:
[root@node ~]# docker push 172.18.18.90:5000/busybox:v1
The push refers to repository [172.18.18.90:5000/busybox]
c5183829c43c: Pushed
v1: digest: sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4 size: 527
4.4 測試下載鏡像
上傳測試沒問題了,我們接下來測試一下從registry服務器上下載剛才上傳的busybox鏡像,先刪除node主機上的鏡像:
[root@node ~]# docker rmi -f $(docker images -aq)
Untagged: 172.18.18.90:5000/busybox:v1
Untagged: 172.18.18.90:5000/busybox@sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4
Untagged: busybox:latest
Untagged: busybox@sha256:2107a35b58593c58ec5f4e8f2c4a70d195321078aebfadfbfb223a2ff4a4ed21
Deleted: sha256:f6e427c148a766d2d6c117d67359a0aa7d133b5bc05830a7ff6e8b64ff6b1d1d
Deleted: sha256:c5183829c43c4698634093dc38f9bee26d1b931dedeba71dbee984f42fe1270d
查看一下node主機上的鏡像全部刪除了:
[root@node ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
然后,從registry服務器上下載busybox鏡像:
[root@node ~]# docker pull 172.18.18.90:5000/busybox:v1
v1: Pulling from busybox
d070b8ef96fc: Pull complete
Digest: sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4
Status: Downloaded newer image for 172.18.18.90:5000/busybox:v1
[root@node ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
172.18.18.90:5000/busybox v1 f6e427c148a7 36 hours ago 1.15MB
列出所有鏡像:
[root@node ~]# curl http://10.118.156.4:5000/v2/_catalog
{"repositories":["busybox"]}
列出busybox鏡像有哪些tag:
[root@node ~]# curl http://10.118.156.4:5000/v2/busybox/tags/list
{"name":"busybox","tags":["v1"]}
docker使用web界面管理Registry
1:安裝 docker-registry-web項目
------------registry-web
admin、123456
docker run -it -d -p 5001:8080 --name registry-web --link registry-srv \
-e REGISTRY_URL=http://10.115.142.43:5000/v2/ \
-e REGISTRY_TRUST_ANY_SSL=true \
-e REGISTRY_BASIC_AUTH="YWRtaW46MTIzNDU2Cg==" \
-e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web
-p 8080:8080 host主機端口8080映射到container8080
--name 起個名字,docker logs start stop啥的就可以用了
--link 連接registry,可以不加,以為下面有registry的url訪問方式
-e REGISTRY_TRUST_ANY_SSL=true, 環境變量,相信所有的ssl,因為我們大部分的ssl都是自建的哦
-e REGISTRY_BASEIC_AUTH 這個里面的值是賬號以及密碼的base64獲取的,可以通過
echo "ops:123123123" | base64
b3BzOjEyMzEyMzEyMwo=
獲得。
-e REGISTRY_NAME, 目前看起來這個是會在頁面上的顯示