天天看點

私有docker倉庫搭建

1、背景

在 Docker 中,當我們執行 docker pull xxx 的時候,可能會比較好奇,Docker 會去哪兒查找并下載下傳鏡像呢?

它實際上是從 registry.hub.docker.com 這個位址去查找,這就是Docker公司為我們提供的公共倉庫,上面的鏡像,大家都可以看到,也可以使用,當然由于天朝的問題,這裡可以采用阿裡雲的鏡像位址,位址如下,配置在/etc/docker/daemon.json下面,

("registry-mirrors": ["https://lmb1nmv1.mirror.aliyuncs.com"])。是以,我們也可以帶上倉庫位址去拉取鏡像,如:docker pull registry.hub.docker.com/library/alpine,不過要注意,這種方式下載下傳的鏡像的預設名稱就會長一些。

如果要在公司中使用 Docker,我們基本不可能把商業項目上傳到公共倉庫中,那如果要多個機器共享,又能怎麼辦呢?

正因為這種需要,是以私有倉庫也就有用武之地了。

所謂私有倉庫,也就是在本地(區域網路)搭建的一個類似公共倉庫的東西,搭建好之後,我們可以将鏡像送出到私有倉庫中。這樣我們既能使用 Docker 來運作我們的項目鏡像,也避免了商業項目暴露出去的風險。

下面我們用官方提供的registry鏡像來搭建私有鏡像倉庫,當然還有其它很多方法。

2、環境

準備兩台安裝好docker的伺服器:

服務端機器 (主機名為registry):docker私有倉庫伺服器,運作registry容器;

測試端機器 (主機名為node):普通的docker伺服器,在這台伺服器上下載下傳一個測試鏡像busybox,然後上傳到registry伺服器進行測試;

這裡我使用的Linux版本是CentOS 7

我的内網位址為:10.18.133.2(服務端即建立registry的主機),記得一定是内網ip

我所用的docker版本如下如所示:

私有docker倉庫搭建

3、部署(服務端操作)

3.1 下載下傳鏡像registry

[[email protected] ~]# 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倉庫搭建

3.3 運作registry容器

[[email protected] ~]# 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 測試鏡像倉庫中所有的鏡像

[[email protected] ~]# curl http://10.18.133.2:5000/v2/_catalog

{"repositories":[]}

現在是空的,因為才剛運作,裡面沒有任何鏡像内容。

4、測試鏡像倉庫(測試端操作)(這是通路registry節點的機器!!!!)

這是通路registry節點的機器!!!

這是通路registry節點的機器!!!

這是通路registry節點的機器!!!

重要的事情說三遍!!!(之前在這裡踩過坑,一直在registry主機上配置不起作用)

4.1 修改下鏡像源并重新開機docker服務

[[email protected] ~]# vim /etc/docker/daemon.json

{

  "registry-mirrors": [ "https://registry.docker-cn.com"]

}

[[email protected] ~]# systemctl restart docker

[[email protected] ~]# vim /usr/lib/systemd/system/docker.service

編輯如下:标紅的那行(ExecStart....)

私有docker倉庫搭建

4.2 下載下傳busybox鏡像

[[email protected] ~]# docker pull busybox

[[email protected] ~]# docker images

REPOSITORY          TAG                IMAGE ID            CREATED            SIZE

busybox            latest              f6e427c148a7        36 hours ago        1.15MB

4.3 為鏡像打标簽

[root@node ~]# docker tag busybox:latest  10.18.133.2:5000/busybox:v1

格式說明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 

busybox:lastest 這是源鏡像,也是剛才pull下來的鏡像檔案;

10.18.133.2:500/busybox:v1:這是目标鏡像,也是registry私有鏡像伺服器的IP位址和端口;

檢視一下打好的tag:

私有docker倉庫搭建

4.4 上傳到鏡像伺服器

[[email protected] ~]# docker push 10.18.133.2:5000/busybox:v1 

The push refers to repository [10.18.133.2:5000/busybox]

Get https://10.18.133.2:5000/v2/: http: server gave HTTP response to HTTPS client

注意了,這是報錯了,需要https的方法才能上傳,我們可以修改下daemon.json來解決:

[[email protected] ~]# vim /etc/docker/daemon.json 

{

  "registry-mirrors": [ "https://registry.docker-cn.com"],

  "insecure-registries": [ "10.18.133.2:5000"]

}

添加私有鏡像伺服器的位址,注意書寫格式為json,有嚴格的書寫要求,然後重新開機docker服務:

[[email protected] ~]# systemctl  restart docker

常用到的檢視docker 狀态的指令為 systemctl status docker(可以觀察docker運作狀态),如下圖所示,這樣的運作狀态是正常的。

私有docker倉庫搭建

在次上傳可以看到沒問題 了:

[[email protected] ~]# docker push 10.18.133.2:5000/busybox:v1 

The push refers to repository [10.18.133.2:5000/busybox]

c5183829c43c: Pushed 

v1: digest: sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4 size: 527

4.5 測試下載下傳鏡像

上傳測試沒問題了,我們接下來測試一下從registry伺服器上下載下傳剛才上傳的busybox鏡像,先删除node主機上的鏡像:

[[email protected] ~]# docker rmi -f $(docker images -aq)

私有docker倉庫搭建

Untagged: 10.18.133.2:5000/busybox:v1

Untagged: 10.18.133.2:5000/[email protected]:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4

Untagged: busybox:latest

Untagged: [email protected]:2107a35b58593c58ec5f4e8f2c4a70d195321078aebfadfbfb223a2ff4a4ed21

Deleted: sha256:f6e427c148a766d2d6c117d67359a0aa7d133b5bc05830a7ff6e8b64ff6b1d1d

Deleted: sha256:c5183829c43c4698634093dc38f9bee26d1b931dedeba71dbee984f42fe1270d

檢視一下node主機上的鏡像全部删除了:

[[email protected] ~]# docker images

REPOSITORY          TAG                IMAGE ID            CREATED            SIZE

然後,從registry伺服器上下載下傳busybox鏡像:

[[email protected] ~]# docker pull 10.18.133.2:5000/busybox:v1

v1: Pulling from busybox

d070b8ef96fc: Pull complete 

Digest: sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4

Status: Downloaded newer image for 10.18.133.2:5000/busybox:v1

[[email protected] ~]# docker images

REPOSITORY                  TAG                IMAGE ID            CREATED            SIZE

172.18.18.90:5000/busybox  v1                  f6e427c148a7        36 hours ago        1.15MB

列出所有鏡像:

[[email protected] ~]# curl  http://10.18.133.2:5000/v2/_catalog

{"repositories":["busybox"]}

列出busybox鏡像有哪些tag:

[[email protected] ~]# curl  http://10.18.133.2:5000/v2/busybox/tags/list

{"name":"busybox","tags":["v1"]}