官方的Docker hub是一個用於管理公共鏡像的好地方,咱們能夠在上面找到咱們想要的鏡像,也能夠把咱們本身的鏡像推送上去。可是,有時候,咱們的使用場景須要咱們擁有一個私有的鏡像倉庫用於管理咱們本身的鏡像。這個能夠經過開源軟件Registry來達成目的。python
Registry在github上有兩份代碼:老代碼庫和新代碼庫。老代碼是採用python編寫的,存在pull和push的性能問題,出到0.9.1版本以後就標誌爲deprecated,再也不繼續開發。從2.0版本開始就到在新代碼庫進行開發,新代碼庫是採用go語言編寫,修改了鏡像id的生成算法、registry上鏡像的保存結構,大大優化了pull和push鏡像的效率。git
官方在Docker hub上提供了registry的鏡像(詳情),咱們能夠直接使用該registry鏡像來構建一個容器,搭建咱們本身的私有倉庫服務。Tag爲latest的registry鏡像是0.9.1版本的,咱們直接採用2.1.1版本。github
運行下面命令獲取registry鏡像,算法
$ sudo docker pull registry:2.1.1
而後啓動一個容器,docker
$ sudo docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1
Registry服務默認會將上傳的鏡像保存在容器的/var/lib/registry,咱們將主機的/opt/registry目錄掛載到該目錄,便可實現將鏡像保存到主機的/opt/registry目錄了。json
運行docker ps看一下容器狀況,ubuntu
lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f3766397a458 registry:2.1.1 "/bin/registry /etc/d" 46 seconds ago Up 45 seconds 0.0.0.0:5000->5000/tcp registry
說明咱們已經啓動了registry服務,打開瀏覽器輸入http://127.0.0.1:5000/v2,出現下面狀況說明registry運行正常,vim
如今咱們經過將鏡像push到registry來驗證一下。瀏覽器
個人機器上有個hello-world的鏡像,咱們要經過docker tag將該鏡像標誌爲要推送到私有倉庫,tcp
$ sudo docker tag hello-world 127.0.0.1:5000/hello-world
而後查看如下本地的鏡像,
lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry 2.1.1 b91f745cd233 5 days ago 220.1 MB ubuntu 14.04 a5a467fddcb8 6 days ago 187.9 MB hello-world latest 975b84d108f1 2 weeks ago 960 B 127.0.0.1:5000/hello-world latest 975b84d108f1 2 weeks ago 960 B
接下來,咱們運行docker push將hello-world鏡像push到咱們的私有倉庫中,
lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker push 127.0.0.1:5000/hello-world The push refers to a repository [127.0.0.1:5000/hello-world] (len: 1) 975b84d108f1: Image successfully pushed 3f12c794407e: Image successfully pushed latest: digest: sha256:1c7adb1ac65df0bebb40cd4a84533f787148b102684b74cb27a1982967008e4b size: 2744
如今咱們能夠查看咱們本地/opt/registry目錄下已經有了剛推送上來的hello-world。咱們也在瀏覽器中輸入http://127.0.0.1:5000/v2/_catalog,以下圖所示,
如今咱們能夠先將咱們本地的127.0.0.1:5000/hello-world和hello-world先刪除掉,
$ sudo docker rmi hello-world $ sudo docker rmi 127.0.0.1:5000/hello-world
而後使用docker pull從咱們的私有倉庫中獲取hello-lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker pull 127.0.0.1:5000/hello-world
Using default tag: latest latest: Pulling from hello-world b901d36b6f2f: Pull complete 0a6ba66e537a: Pull complete Digest: sha256:1c7adb1ac65df0bebb40cd4a84533f787148b102684b74cb27a1982967008e4b Status: Downloaded newer image for 127.0.0.1:5000/hello-world:latest lienhua34@lienhua34-Compaq-Presario-CQ35-Notebook-PC ~ $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry 2.1.1 b91f745cd233 5 days ago 220.1 MB ubuntu 14.04 a5a467fddcb8 6 days ago 187.9 MB 127.0.0.1:5000/hello-world latest 0a6ba66e537a 2 weeks ago 960 B
須要添加的選項
vim /etc/docker/daemon.json