我們已經學會構建自己的鏡像了。接下來的問題是如何在多個 Docker Host 上使用鏡像。
這里有幾種可用的方法:
-
用相同的 Dockerfile 在其他 host 構建鏡像。
-
將鏡像上傳到公共 Registry(比如 Docker Hub),Host 直接下載使用。
-
搭建私有的 Registry 供本地 Host 使用。
第一種方法沒什么特別的,前面已經討論很多了。我們將討論如何使用公共和私有 Registry 分發鏡像。
為鏡像命名
無論采用何種方式保存和分發鏡像,首先都得給鏡像命名。
當我們執行 docker build
命令時已經為鏡像取了個名字,例如前面:
docker build -t ubuntu-with-vi
這里的 ubuntu-with-vi
就是鏡像的名字。通過 dock images 可以查看鏡像的信息。
這里注意到 ubuntu-with-vi
對應的是 REPOSITORY
,而且還有一個叫 latest
的 TAG
。
實際上一個特定鏡像的名字由兩部分組成:repository 和 tag。
[image name] = [repository]:[tag]
如果執行 docker build 時沒有指定 tag,會使用默認值 latest。其效果相當於:
docker build -t ubuntu-with-vi:latest
tag 常用於描述鏡像的版本信息,比如 httpd 鏡像:
當然 tag 可以是任意字符串,比如 ubuntu 鏡像:
小心 latest tag
千萬別被 latest tag 給誤導了。latest 其實並沒有什么特殊的含義。當沒指明鏡像 tag 時,Docker 會使用默認值 latest,僅此而已。
雖然 Docker Hub 上很多 repository 將 latest 作為最新穩定版本的別名,但這只是一種約定,而不是強制規定。
所以我們在使用鏡像時最好還是避免使用 latest,明確指定某個 tag,比如 httpd:2.3,ubuntu:xenial。
tag 使用最佳實踐
借鑒軟件版本命名方式能夠讓用戶很好地使用鏡像。
一個高效的版本命名方案可以讓用戶清楚地知道當前使用的是哪個鏡像,同時還可以保持足夠的靈活性。
每個 repository 可以有多個 tag,而多個 tag 可能對應的是同一個鏡像。下面通過例子為大家介紹 Docker 社區普遍使用的 tag 方案。
假設我們現在發布了一個鏡像 myimage,版本為 v1.9.1。那么我們可以給鏡像打上四個 tag:1.9.1、1.9、1 和 latest。
我們可以通過 docker tag 命令方便地給鏡像打 tag。
docker tag myimage-v1.9.1 myimage:1
docker tag myimage-v1.9.1 myimage:1.9
docker tag myimage-v1.9.1 myimage:1.9.1
docker tag myimage-v1.9.1 myimage:latest
過了一段時間,我們發布了 v1.9.2。這時可以打上 1.9.2 的 tag,並將 1.9、1 和 latest 從 v1.9.1 移到 v1.9.2。
命令為:
docker tag myimage-v1.9.2 myimage:1
docker tag myimage-v1.9.2 myimage:1.9
docker tag myimage-v1.9.2 myimage:1.9.2
docker tag myimage-v1.9.2 myimage:latest
之后,v2.0.0 發布了。這時可以打上 2.0.0、2.0 和 2 的 tag,並將 latest 移到 v2.0.0。
命令為:
docker tag myimage-v2.0.0 myimage:2
docker tag myimage-v2.0.0 myimage:2.0
docker tag myimage-v2.0.0 myimage:2.0.0
docker tag myimage-v2.0.0 myimage:latest
這種 tag 方案使鏡像的版本很直觀,用戶在選擇非常靈活:
-
myimage:1 始終指向 1 這個分支中最新的鏡像。
-
myimage:1.9 始終指向 1.9.x 中最新的鏡像。
-
myimage:latest 始終指向所有版本中最新的鏡像。
-
如果想使用特定版本,可以選擇 myimage:1.9.1、myimage:1.9.2 或 myimage:2.0.0。
Docker Hub 上很多 repository 都采用這種方案,所以大家一定要熟悉。
下一節討論如何使用使用公共 Registry。