1. 程式人生 > >Docker公共&本地鏡像倉庫(七)--技術流ken

Docker公共&本地鏡像倉庫(七)--技術流ken

主機名稱 font code port 外網 json str tor 私有

分發鏡像

我們已經會構建自己的鏡像了,那麽如果在多個docker主機上使用鏡像那?有如下的幾種可用的方法:

  1. 用相同的Dockerfile在其他host上構建鏡像
  2. 將鏡像上傳到公共registry(比如docker hub),host直接下載使用
  3. 搭建私有的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.3ubuntu: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 雖然非常方便,但還是有些限制,比如:

  1. 需要 internet 連接,而且下載和上傳速度慢。

  2. 上傳到 Docker Hub 的鏡像任何人都能夠訪問,雖然可以用私有 repository,但不是免費的。

  3. 安全原因很多組織不允許將鏡像放到外網。

解決方案就是搭建本地的 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文件

技術分享圖片

用逗號分開,不加這行會報下面的錯

技術分享圖片

然後重啟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地址,不是該拉取鏡像的主機)

技術分享圖片

Docker公共&本地鏡像倉庫(七)--技術流ken