Docker 倉庫
本節(jié)介紹鏡像倉庫的使用。
目前 Docker 官方維護了一個公共倉庫 Docker Hub,這是一個用于管理公共鏡像的地方,我們可以找到各種鏡像,也可以把我們自己的鏡像推送上去。
當然,根據需要我們也可以搭建私有的鏡像倉庫,用于管理自己的鏡像。
1. 登入登出
如果沒有賬號,我們需要在 Docker Hub 上免費注冊一個 Docker 賬號。保存好賬號密碼,進入 Linux 環(huán)境,輸入:
docker login
然后輸入賬號密碼登錄。
使用 docker logout
可以登出賬號。
2. 搜索鏡像
我們可以用 docker search
這個命令搜索 Docker Hub 中的鏡像。
比如我們搜索一下redis的鏡像
docker search redis
可以看到返回了很多包含 redis
關鍵字的信息,返回的信息中從左到右依次是:
鏡像名字、描述、star關注數、是否官方創(chuàng)建、是否自動創(chuàng)建。
根據是否是官方提供,可將鏡像資源分為兩類:
-
一種是類似 centos 這樣的鏡像,被稱為基礎鏡像或根鏡像。這些基礎鏡像由 Docker 公司創(chuàng)建、驗證、支持、提供。這樣的鏡像往往使用單個單詞作為名字;
-
還有一種類型,比如 bitnami/redis鏡像,它是由 Docker 的用戶bitnami創(chuàng)建并維護的,因此帶有用戶名稱前綴。可以通過前綴 username/ 來指定使用某個用戶提供的鏡像。
通常我們更青睞官方構建的鏡像。
3. 下載鏡像
我們演示一下如何下載 redis 鏡像:
docker pull redis
默認會拉取 latest 版本,如果要指定版本,需要在鏡像后標記版本,如 dockre pull redis:3.2
運行這個命令docker pull redis
后,Docker 就會開始從鏡像倉庫中拉取我們所指定的鏡像了。
如上圖所示,redis 的鏡像已經被下載成功了。
在控制臺中,我們可以看到鏡像拉取的進度。 下載進度會分為幾行,每一行代表的就是一個鏡像層。 Docker 首先會拉取鏡像所基于的所有鏡像層,之后再單獨拉取每一個鏡像層并組合成這個鏡像。如果在本地已經存在相同的鏡像層,那么 Docker 就直接略過這個鏡像層的拉取而直接采用本地的內容。
鏡像在被拉取之后就存放到了本地,接受 Docker 管理,我們可以通過 docker images
命令看到它們。
4. 上傳鏡像
Docker hub用戶賬戶登錄后,通過 docker push
命令,把自己創(chuàng)建的鏡像上傳到倉庫中來共享.
docker push <本地鏡像名>
5. 刪除鏡像
刪除鏡像的命令是 docker image rm
,參數是鏡像的名稱或 ID
使用命令docker image rm redis:latest
可以刪除剛才拉取的 redis 鏡像,同時Docker 會自動刪掉無用、沒有依賴的鏡像層。
6. 搭建Docker 私有倉庫
執(zhí)行以下命令,使用Docker運行私有倉庫服務registry。
docker run -d -v /root/registry:/var/lib/registry -p 6000:5000 --restart=always --name registry registry
Tips:
此命令會啟動一個容器,設定本地的 /root/registry 目錄存儲上傳的鏡像。
配置/etc/docker/daemon.json
,添加一行insecure-registries
配置
{
...
"insecure-registries": ["127.0.0.1:6000"]
...
}
127.0.0.1:6000
是我們上面的自定義鏡像倉庫服務的地址端口。
測試私有鏡像倉庫
下面我們將redis:latest鏡像改個名字,傳到私有倉庫。
# 將redis:latest鏡像名稱改為127.0.0.1:6000/myredis:v1
# 127.0.0.1:6000/xxx是固定寫法,與之前的地址對應
docker tag redis:latest 127.0.0.1:6000/myredis:v1
# 上傳到私有倉庫
docker push 127.0.0.1:6000/myredis:v1
# 查看私有倉庫中的鏡像
curl http://127.0.0.1:6000/v2/_catalog
得到結果
{"repositories":["myredis"]}
說明上傳成功。
接下來,我們將本地的127.0.0.1:6000/myredis:v1
刪除,嘗試從私有倉庫中拉去
# 刪除鏡像
docker rmi 127.0.0.1:6000/myredis:v1
# 把redis鏡像也刪除掉,這樣可以清理掉相關的緩存層,使后面鏡像的下載過程和結果更清楚
docker rmi redis
# 拉取鏡像
docker pull 127.0.0.1:6000/myredis:v1
運行docker images
可以看到此鏡像已經被緩存到本地了。
7. 小結
容器鏡像的操作是增量式的,每次鏡像拉取的內容會比原本多個完整的操作系統(tǒng)的小很多,同時鏡像只要發(fā)布成功,我們就能完全復現這個鏡像的完整環(huán)境,這樣就使得基于容器鏡像的團隊協(xié)作更加便捷。