倉庫(Repository)是集中存放鏡像的地方,分公共倉庫和私有倉庫。一個容易與之混淆的概念是注冊服務器(Registry)。實際上注冊服務器是存放倉庫的具體服務器,一個注冊服務器上可以有多個倉庫,而每個倉庫下面可以有多個鏡像。從這方面來說,可將倉庫看做一個具體的項目或目錄。
例如對於倉庫地址private-docker.com/ubuntu來說,private-docker.com是注冊服務器地址,ubuntu是倉庫名。
Docker Hub公共鏡像市場
目前Docker官方維護了一個公共鏡像倉庫https://hub.docker.com,其中已經包括超過15000的鏡像。大部分鏡像需求,都可以通過在Docker Hub中直接下載鏡像來實現。
1.登錄
可以通過命令行執行docker login命令來輸入用戶名、密碼和郵箱來完成注冊和登錄。注冊成功后,本地用戶目錄的.dockercfg中將保存用戶的認證信息。
登錄成功的用戶可以上傳個人制造的鏡像。
2.基本操作
用戶無需登錄即可通過docker search命令來查找官方倉庫中的鏡像,並利用docker pull命令來將它下載到本地。
例如以centos為關鍵詞進行搜索:$ docker search centos
根據是否為官方提供,可將這些鏡像資源分為兩類。另外,在查找的時候通過-s N參數可以指定僅顯示評價為N星以上的鏡像。
一種是類似centos這樣的基礎鏡像,稱為基礎或根鏡像。這些鏡像是由Docker公司創建、驗證、支持、提供。這樣的鏡像往往使用單個單詞作為名字。
一種是比如ansible/centos7-ansible鏡像,它是由Docker用戶ansible創建並維護的,帶有用戶名稱為前綴,表明是某用戶下的某倉庫。可以通過用戶名稱前綴user_name/鏡像名來指定使用某個用戶提供的鏡像。
下載官方centos鏡像到本地,$ docker pull centos
用戶也可以在登錄后通過docker push命令來將本地鏡像推送到Docker Hub。
3.自動創建
自動創建(Automated Builds)功能對於需要經常升級鏡像內程序來說,十分方便。
有時候,用戶創建了鏡像,安裝了某個軟件,如果軟件發布新版本則需要手動更新鏡像。而自動創建允許用戶通過Docker Hub指定跟蹤一個目標網站(目前支持GitHub或BitBucket)上的項目,一旦項目發生新的提交,則自動執行創建。
要配置自動創建,包括如下的步驟:
1)創建並登錄Docker Hub,以及目標網站;*在目標網站中連接帳戶到Docker Hub;
2)在Docker Hub中配置一個“自動創建”;
3)選取一個目標網站中的項目(需要含Dockerfile)和分支;
4)指定Dockerfile的位置,並提交創建。
之后,可以在Docker Hub的“自動創建”頁面中跟蹤每次創建的狀態。
時速雲鏡像市場
國內不少雲服務商都提供了Docker鏡像市場,下面以時速雲為例(https://hub.tenxcloud.com),介紹如何使用這些市場。
1.查看鏡像
訪問https://hub.tenxcloud.com,即可看到已存在的倉庫和存儲的鏡像,包括Ubuntu、Java、Mongo、MySQL、Nginx等熱門倉庫和鏡像。時速雲官方倉庫中的鏡像會保持跟DockerHub中官方鏡像的同步。
2.下載鏡像
下載鏡像也是使用docker pull命令,但是要在鏡像名稱前添加注冊服務器的具體地址。格式為index.tenxcloud.com//:。
例如,要下載Docker官方倉庫中的node:latest鏡像,可以使用如下命令:$ docker pull index.tenxcloud.com/docker_library/node:latest
正常情況下,鏡像下載會比直接從DockerHub下載快得多。
通過docker images命令來查看下載到本地的鏡像:$ docker images
下載后,可以更新鏡像的標簽,與官方標簽保持一致,方便使用:
$ docker tag index.tenxcloud.com/docker_library/node:latest node:latest
另外,阿里雲等服務商也已經提供了Docker鏡像的下載服務,用戶可以根據服務質量自行選擇。
搭建本地私有倉庫
1.使用registry鏡像創建私有倉庫
安裝Docker后,可以通過官方提供的registry鏡像來簡單搭建一套本地私有倉庫環境:
$ docker run -d -p 5000:5000 registry
這將自動下載並啟動一個registry容器,創建本地的私有倉庫服務。
默認情況下,會將倉庫創建在容器的/tmp/registry目錄下。可以通過-v參數來將鏡像文件存放在本地的指定路徑。
例如下面的例子將上傳的鏡像放到/opt/data/registry目錄:
$ docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
此時,在本地將啟動一個私有倉庫服務,監聽端口為5000。
2.管理私有倉庫
首先查看其地址為10.0.2.2:5000。然后在虛擬機系統(Ubuntu 14.04)里測試上傳和下載鏡像。
在Ubuntu 14.04系統查看已有的鏡像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ba5877dc9bec 6 days ago 199.3 MB
使用docker tag命令將這個鏡像標記為10.0.2.2:5000/test
$ docker tag ubuntu:14.04 10.0.2.2:5000/test
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ba5877dc9bec 6 days ago 199.3 MB
10.0.2.2:5000/test latest ba5877dc9bec 6 days ago 199.3 MB
使用docker push上傳標記的鏡像:
$ docker push 10.0.2.2:5000/test
用curl查看倉庫10.0.2.2:5000中的鏡像:
$ curl http://10.0.2.2:5000/v1/search
{"num_results": 1, "query": "", "results": [{"description": "", "name": "library/test"}]}
在結果中可以看到{"description":"","name":"library/test"},表明鏡像已經成功上傳了。
現在可以到任意一台能訪問到10.0.2.2地址的機器去下載這個鏡像了。比較新的Docker版本對安全性要求較高,會要求倉庫支持SSL/TLS證書。對於內部使用的私有倉庫,可以自行配置證書或關閉對倉庫的安全性檢查。
首先,修改Docker daemon的啟動參數,添加如下參數,表示信任這個私有倉庫,不進行安全證書檢查:
DOCKER_OPTS="--insecure-registry 10.0.2.2:5000"
之后重啟Docker服務,並從私有倉庫中下載鏡像到本地:
$ sudo service docker restart
$ docker pull 10.0.2.2:5000/test
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
10.0.2.2:5000/test latest ba5877dc9bec 6 days ago 199.3 MB
下載后,還可以添加一個更通用的標簽ubuntu:14.04:
$ docker tag 10.0.2.2:5000/test ubuntu:14.04
如果要使用安全證書,用戶也可以從較知名的CA服務商(如verisign)申請公開的SSL/TLS證書,或者使用openssl等軟件來自行生成。