有時候使用 Docker Hub 這樣的公用倉庫可能不方便,並且公司的私人鏡像為了業務安全,也不會push到docker hub上,使用者可以建立一個本地倉庫供私人使用。類似於git 和maven一樣,同時節省伺服器下載和上傳鏡像頻寬。
那什麼是docker registry呢
Docker Registry由三個部分組成:index,registry,registry client。
可以把Index認為是負責登入、負責認證、負責儲存鏡像資訊和負責對外顯示的外部實現,而registry則是負責儲存鏡像的內部實現,而Registry Client則是docker用戶端。
我這台伺服器已經安裝docker1.6版本,至於怎麼安裝我就不多說了,可以參考這裡,centos上部署docker
[root@docker data]# docker -v
Docker version 1.6.2, build ba1f6c3/1.6.2
[root@docker data]# uname -r
4.1.2-1.el7.elrepo.x86_64
安裝docker-registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
如果本地沒有下載過docker-registry,則首次會pull registry 運行時會映射路徑和連接埠,以後就可以從/data/registry下找到私人倉庫,這裡查看下我原生鏡像
[root@docker data]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/registry latest ddfbba49d0b6 21 hours ago 423.6 MB
docker.io/centos latest 7322fbe74aa5 3 weeks ago 172.2 MB
從上面資訊可以分別看出
來自於哪個倉庫,比如 centos
鏡像的標記,比如 latest 最後一個版本
它的 識別碼(唯一)
建立時間
鏡像大小
可以看到registry容器已經啟動
[root@docker data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad3469d9302b registry:latest "docker-registry" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp compassionate_newton
4c86d4e541e3 centos:latest "/bin/bash" 23 hours ago Exited (0) 23 hours ago high_galileo
e79a883fdc8b centos:latest "/bin/echo 'Hello Wo 23 hours ago Exited (0) 23 hours ago stoic_lalande
訪問私人倉庫
[root@docker data]# curl 127.0.0.1:5000/v1/search
{"num_results": 0, "query": "", "results": []}
因為我們還沒有像私人容器提交鏡像,所以這裡返回空,下面我們提交一個鏡像試試,上面可以看到我本地有一個registry的鏡像
使用docker tag 將我本地的id為7322fb474aa5的這個鏡像標記為 127.0.0.1:5000/centos
命令格式為 docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
[root@docker data]# docker tag 7322fbe74aa5 127.0.0.1:5000/centos
[root@docker data]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/registry latest ddfbba49d0b6 21 hours ago 423.6 MB
docker.io/centos latest 7322fbe74aa5 3 weeks ago 172.2 MB
127.0.0.1:5000/centos latest 7322fbe74aa5 3 weeks ago 172.2 MB
[root@docker data]#
鏡像的 ID 唯一標識了鏡像,注意到 docker.io/centos和 127.0.0.1:5000/centos具有相同的鏡像 ID,說明它們實際上是同一鏡像。
PUSH 鏡像
然後我們將這個鏡像push到私人鏡像庫
[root@docker data]# docker push 127.0.0.1:5000/centos
The push refers to a repository [127.0.0.1:5000/centos] (len: 1)
Sending image list
Pushing repository 127.0.0.1:5000/centos (1 tags)
f1b10cd84249: Image successfully pushed
c852f6d61e65: Image successfully pushed
7322fbe74aa5: Image successfully pushed
Pushing tag for rev [7322fbe74aa5] on {http://127.0.0.1:5000/v1/repositories/centos/tags/latest}
然後我麼拿在看下私人倉庫中有沒有鏡像
[root@docker data]# curl 127.0.0.1:5000/v1/search
{"num_results": 1, "query": "", "results": [{"description": "", "name": "library/centos"}]}
可以看到一家有個叫centos的鏡像存在了,就是我剛剛上傳的鏡像。然後你的其他伺服器就可以來下載這個鏡像使用了
docker pull 192.168.1.222:5000/centos
如果本地有很多鏡像想批量上傳怎麼辦,可以用這個指令碼
$ wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push_images.sh
$ ./push_images.sh ubuntu:latest centos:centos7
這裡大家可以看到,訪問我們私人庫的時候,沒有任何許可權控制,也就是說別人知道這個倉庫地址也可以push 和pull鏡像,這樣很不安全,大家可以在網路層面,也可以前面加層nginx,然後nginx反向 Proxy本地的5000連接埠