分發鏡像
我們已經會構建自己的鏡像了,那么如果在多個docker主機上使用鏡像那?有如下的幾種可用的方法:
- 用相同的Dockerfile在其他host上構建鏡像
- 將鏡像上傳到公共registry(比如docker hub),host直接下載使用
- 搭建私有的registry供本地的host使用
鏡像命名
無論采用何種方式保存和分發鏡像,首先都得給鏡像命名。
通過 dock images ls 可以查看鏡像的信息。
[root@ken1 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE myimage latest 7efe0600e48f 27 minutes ago 13MB centos-vim2 latest 1921b3cd4695 About an hour ago 328MB centos-vim latest 42083b89a179 About an hour ago 328MB busybox latest 3a093384ac30 3 weeks ago 1.2MB centos latest 1e1148e4cc2c 7 weeks ago 202MB
這里注意到myimage 對應的是 REPOSITORY,而且還有一個叫 latest 的 TAG。
實際上一個特定鏡像的名字由兩部分組成:repository 和 tag。
[image name] = [repository]:[tag]
如果執行 docker build 時沒有指定 tag,會使用默認值 latest。其效果相當於:
docker build -t myimage:latest
tag 常用於描述鏡像的版本信息.
小心 latest tag
千萬別被 latest tag 給誤導了。latest 其實並沒有什么特殊的含義。當沒指明鏡像 tag 時,Docker 會使用默認值 latest,僅此而已。
雖然 Docker Hub 上很多 repository 將 latest 作為最新穩定版本的別名,但這只是一種約定,而不是強制規定。
所以我們在使用鏡像時最好還是避免使用 latest,明確指定某個 tag,比如 httpd:2.3,ubuntu:xenial。
使用公共registry
保存和分發鏡像的最直接方法就是使用 Docker Hub。
Docker Hub 是 Docker 公司維護的公共 Registry。用戶可以將自己的鏡像保存到 Docker Hub 免費的 repository 中。如果不希望別人訪問自己的鏡像,也可以購買私有 repository。
除了 Docker Hub,quay.io 是另一個公共 Registry,提供與 Docker Hub 類似的服務。
下面介紹如何用 Docker Hub 存取我們的鏡像。
第一步:首先得在 Docker Hub 上注冊一個賬號。(https://cloud.docker.com/)
第二步:在 Docker Host 上登錄。
[root@ken1 ~]# docker login -u ken2019 Password: Login Succeeded
這里用的是我自己的賬號,用戶名為 ken2019,輸入密碼后登錄成功。
第三步: 修改鏡像的 repository 使之與 Docker Hub 賬號匹配。
Docker Hub 為了區分不同用戶的同名鏡像,鏡像的 registry 中要包含用戶名,完整格式為:[username]/xxx:tag
我們通過 docker tag 命令重命名鏡像。
注:Docker 官方自己維護的鏡像沒有用戶名,比如 httpd。
第四步:通過 docker push 將鏡像上傳到 Docker Hub。
[root@ken1 ~]# docker push ken2019/myimage:v1 The push refers to repository [docker.io/ken2019/myimage] cc65436a9bce: Pushed b5d564d59792: Pushed 44d9b0246bf5: Pushed 7d419408a46e: Pushed 683f499823be: Mounted from library/busybox v1: digest: sha256:e7fcb8fd9a68131317b095030f6b13353bb6e20cefe6f9871a6e0d47cdd02083 size: 1359
第五步:登錄 https://hub.docker.com,在Public Repository 中就可以看到上傳的鏡像。
如果要刪除上傳的鏡像,只能在 Docker Hub 界面上操作。
第六步:這個鏡像可被其他 Docker host 下載使用了。
[root@ken1 ~]# docker pull ken2019/myimage:v1 v1: Pulling from ken2019/myimage Digest: sha256:e7fcb8fd9a68131317b095030f6b13353bb6e20cefe6f9871a6e0d47cdd02083 Status: Downloaded newer image for ken2019/myimage:v1
搭建本地的registry
Docker Hub 雖然非常方便,但還是有些限制,比如:
- 需要 internet 連接,而且下載和上傳速度慢。
- 上傳到 Docker Hub 的鏡像任何人都能夠訪問,雖然可以用私有 repository,但不是免費的。
- 安全原因很多組織不允許將鏡像放到外網。
解決方案就是搭建本地的 Registry。
第一步:運行registry容器
Docker 已經將 Registry 開源了,同時在 Docker Hub 上也有官方的鏡像 registry。下面我們就在 Docker 中運行自己的 registry。
[root@ken1 ~]# docker run -d -p 5000:5000 -v /tes:/var/lib/registry registry:2
我們使用的鏡像是 registry:2。
-d 是后台啟動容器。
-p 將容器的 5000 端口映射到 Host 的 5000 端口。5000 是 registry 服務端口。
-v 將容器 /var/lib/registry 目錄映射到 Host 的 /test,用於存放鏡像數據。
第二步:通過 docker tag 重命名鏡像,使之與 registry 匹配。
[root@ken1 ~]# docker tag ken2019/myimage:v1 172.20.10.2:5000/ken2019/myimage:v1
我們在鏡像的前面加上了運行 registry 的主機名稱和端口。
前面已經討論了鏡像名稱由 repository 和 tag 兩部分組成。而 repository 的完整格式為:[registry-host]:[port]/[username]/xxx
只有 Docker Hub 上的鏡像可以省略 [registry-host]:[port] 。
第三步:修改damon.json文件
{
“registry-mirrors”: [“https://vf3ypopb.mirror.aliyuncs.com”],
“insecure-registries”:[“192.168.64.8:5000”]
}
用逗號分開,不加這行會報下面的錯
然后重啟docker
[root@ken1 ~]# systemctl restart docker
重啟容器
[root@ken1 ~]# docker run -d -p 5000:5000 -v /tes:/var/lib/registry registry:2
第四步:上傳鏡像
[root@ken1 ~]# docker push 172.20.10.2:5000/ken2019/myimage:v1 The push refers to repository [172.20.10.2:5000/ken2019/myimage] cc65436a9bce: Pushed b5d564d59792: Pushed 44d9b0246bf5: Pushed 7d419408a46e: Pushed 683f499823be: Pushed v1: digest: sha256:e7fcb8fd9a68131317b095030f6b13353bb6e20cefe6f9871a6e0d47cdd02083 size: 1359
第五步:從其他主機進行下載鏡像
注意:其他主機也要添加 “insecure-registries”:[“172.20.10.2:5000”] (這里的IP是registry主機的IP地址,不是該拉取鏡像的主機)