最近學習 docker 和 k8s; 由於 k8s 部署 Deployment 的時候,從 docker.io 拉取鏡像容易超時,於是考慮搭建一個本機的 docker hub。了解到 docker 有一個 registry 鏡像,遂學習之: Deploy a registry server
在 mac 上新建了一個 registry 項目,編寫 Makefile
如下
REGISTRY_REPO=/var/lib/registry/docker/registry/v2/repositories
LOCAL_REPO=`pwd`/data/v2/repositories
IMAGE=registry
CONTAINER=registry
build:
@if [ ! -d $(LOCAL_REPO) ]; then mkdir -p $(LOCAL_REPO); fi
@echo LOCAL_REPO=$(LOCAL_REPO)
docker run -d -p 5000:5000 -v $(LOCAL_REPO):$(REGISTRY_REPO) --privileged=true --restart always --name $(CONTAINER) $(IMAGE)
start:
docker start $(CONTAINER)
stop:
docker stop $(CONTAINER)
delete:
docker rm -f $(CONTAINER)
執行 make build
運行了 registry
鏡像,但是 push 本地 image 到 registry 出現問題:
[16:09:11 registry] $ docker push localhost:5000/my-getting-started:3000
The push refers to repository [localhost:5000/my-getting-started]
398786771e51: Pushing 7.052MB
bef245e6b7fc: Retrying in 18 seconds
788783bb5410: Pushing 178.7kB
9b2457fcc1c5: Pushing 2.048kB
c5088e2ef878: Pushing 3.584kB
12587d8b4618: Retrying in 5 seconds
738f7039e20b: Pushing 22.79MB/77.6MB
8d3ac3489996: Retrying in 5 seconds
received unexpected HTTP status: 500 Internal Server Error
屢試屢錯。
后來嘗試將 Makefile 中的變量修改如下:
REGISTRY_REPO=/var/lib/registry
LOCAL_REPO=`pwd`/data
刪除現有的 registry 容器,重新build,再次嘗試push,就好使了。
再仔細看官方文檔 Customize the storage location, 里面也是綁定的 /var/lib/registry
目錄。
查看本機的 registry 項目目錄,可以看到 data/docker/registry/v2
目錄下除了 repositories
目錄,還有 blobs
目錄。而最初我們只綁定了容器里的 /var/lib/registry/docker/registry/v2/repositories
目錄,這或許就是失敗的原因。