建置、標記並發佈映像檔

說明

在本指南中,您將學習以下內容:

  • 建置映像檔 - 根據 Dockerfile 建置映像檔的過程
  • 標記映像檔 - 為映像檔命名的過程,這同時也決定了映像檔可分發的位置
  • 發佈映像檔 - 使用容器登錄庫 (container registry) 分發或分享剛建立的映像檔的過程

建置映像檔

映像檔通常是使用 Dockerfile 建置的。最基礎的 docker build 指令可能如下所示:

docker build .

指令結尾的 . 提供了建置上下文 (build context) 的路徑或 URL。在此位置,建置器將會找到 Dockerfile 以及其他參考檔案。

當您執行建置時,建置器會在需要時提取基礎映像檔,然後執行 Dockerfile 中指定的指令。

使用前述指令時,映像檔將沒有名稱,但輸出內容會提供該映像檔的識別碼 (ID)。例如,前述指令可能會產生如下輸出:

$ docker build .
[+] Building 3.5s (11/11) FINISHED                                              docker:desktop-linux
 => [internal] load build definition from Dockerfile                                            0.0s
 => => transferring dockerfile: 308B                                                            0.0s
 => [internal] load metadata for docker.io/library/python:3.12                                  0.0s
 => [internal] load .dockerignore                                                               0.0s
 => => transferring context: 2B                                                                 0.0s
 => [1/6] FROM docker.io/library/python:3.12                                                    0.0s
 => [internal] load build context                                                               0.0s
 => => transferring context: 123B                                                               0.0s
 => [2/6] WORKDIR /usr/local/app                                                                0.0s
 => [3/6] RUN useradd app                                                                       0.1s
 => [4/6] COPY ./requirements.txt ./requirements.txt                                            0.0s
 => [5/6] RUN pip install --no-cache-dir --upgrade -r requirements.txt                          3.2s
 => [6/6] COPY ./app ./app                                                                      0.0s
 => exporting to image                                                                          0.1s
 => => exporting layers                                                                         0.1s
 => => writing image sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00    0.0s

根據前述輸出,您可以使用參考到的映像檔啟動容器:

docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00

該名稱顯然難以記憶,這正是「標記」功能的用處所在。

標記映像檔

標記映像檔是一種為映像檔提供易記名稱的方法。不過,映像檔名稱具有一定的結構。完整的映像檔名稱結構如下:

[HOST[:PORT_NUMBER]/]PATH[:TAG]
  • HOST:位於映像檔所在位置的可選登錄庫主機名稱。若未指定主機,預設會使用 Docker 的公開登錄庫 docker.io
  • PORT_NUMBER:若有提供主機名稱,則為登錄庫連接埠號。
  • PATH:映像檔的路徑,由斜線分隔的元件組成。對於 Docker Hub,格式遵循 [NAMESPACE/]REPOSITORY,其中 namespace 是使用者名稱或組織名稱。若未指定命名空間,則會使用 library,這是 Docker 官方映像檔的命名空間。
  • TAG:自訂且可讀性高的識別符,通常用於識別映像檔的不同版本或變體。若未指定標籤,預設會使用 latest

以下是一些映像檔名稱的範例:

  • nginx,等同於 docker.io/library/nginx:latest:這會從 docker.io 登錄庫、library 命名空間、nginx 映像檔儲存庫以及 latest 標籤提取映像檔。
  • docker/welcome-to-docker,等同於 docker.io/docker/welcome-to-docker:latest:這會從 docker.io 登錄庫、docker 命名空間、welcome-to-docker 映像檔儲存庫以及 latest 標籤提取映像檔。
  • ghcr.io/dockersamples/example-voting-app-vote:pr-311:這會從 GitHub Container Registry、dockersamples 命名空間、example-voting-app-vote 映像檔儲存庫以及 pr-311 標籤提取映像檔。

若要在建置時標記映像檔,請加上 -t--tag 旗標:

docker build -t my-username/my-image .

如果您已經建置好映像檔,可以使用 docker image tag 指令為該映像檔新增另一個標籤。

docker image tag my-username/my-image another-username/another-image:v1

發佈映像檔

一旦您建置並標記好映像檔,就可以將其推送至登錄庫。請使用 docker push 指令執行此操作:

docker push my-username/my-image

幾秒鐘內,映像檔的所有層 (layers) 都會被推送至登錄庫。

需要驗證

在將映像檔推送至儲存庫之前,您需要通過驗證。請使用 docker login 指令進行登入。

試試看

在本實作指南中,您將使用提供的 Dockerfile 建置一個簡單的映像檔,並將其推送至 Docker Hub。

設定

  1. 取得範例應用程式。

    如果您有 Git,可以複製範例應用程式的儲存庫。否則,您可以下載範例應用程式。請選擇以下其中一種方式:

    在終端機中使用以下指令來複製範例應用程式儲存庫:

    $ git clone https://github.com/docker/getting-started-todo-app
    

    下載原始碼並解壓縮。

    下載原始碼

  2. 下載並安裝 Docker Desktop。

  3. 如果您還沒有 Docker 帳號,請立即建立一個。完成後,請使用該帳號登入 Docker Desktop。

建置映像檔

現在您在 Docker Hub 上有了儲存庫,是時候建置映像檔並將其推送至該儲存庫了。

  1. 在範例應用程式儲存庫的根目錄中使用終端機,執行以下指令。請將 YOUR_DOCKER_USERNAME 替換為您的 Docker Hub 使用者名稱:

    $ docker build -t <YOUR_DOCKER_USERNAME>/concepts-build-image-demo .
    

    舉例來說,如果您的使用者名稱是 mobywhale,您應該執行以下指令:

    $ docker build -t mobywhale/concepts-build-image-demo .
    
  2. 建置完成後,您可以使用以下指令查看映像檔:

    $ docker image ls
    

    該指令將產生類似以下的輸出:

    REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
    mobywhale/concepts-build-image-demo    latest    746c7e06537f   24 seconds ago   354MB
  3. 您實際上可以使用 docker image history 指令查看歷史紀錄(即映像檔是如何建立的):

    $ docker image history mobywhale/concepts-build-image-demo
    

    接著您會看到類似以下的輸出:

    IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
    f279389d5f01   8 seconds ago   CMD ["node" "./src/index.js"]                   0B        buildkit.dockerfile.v0
    <missing>      8 seconds ago   EXPOSE map[3000/tcp:{}]                         0B        buildkit.dockerfile.v0 
    <missing>      8 seconds ago   WORKDIR /app                                    8.19kB    buildkit.dockerfile.v0
    <missing>      4 days ago      /bin/sh -c #(nop)  CMD ["node"]                 0B
    <missing>      4 days ago      /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
    <missing>      4 days ago      /bin/sh -c #(nop) COPY file:4d192565a7220e13…   20.5kB
    <missing>      4 days ago      /bin/sh -c apk add --no-cache --virtual .bui…   7.92MB
    <missing>      4 days ago      /bin/sh -c #(nop)  ENV YARN_VERSION=1.22.19     0B
    <missing>      4 days ago      /bin/sh -c addgroup -g 1000 node     && addu…   126MB
    <missing>      4 days ago      /bin/sh -c #(nop)  ENV NODE_VERSION=20.12.0     0B
    <missing>      2 months ago    /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
    <missing>      2 months ago    /bin/sh -c #(nop) ADD file:d0764a717d1e9d0af…   8.42MB

    此輸出顯示了映像檔的層級,突顯了您新增的層以及繼承自基礎映像檔的層。

推送映像檔

現在您已經建置好了映像檔,是時候將其推送至登錄庫了。

  1. 使用 docker push 指令推送映像檔:

    $ docker push <YOUR_DOCKER_USERNAME>/concepts-build-image-demo
    

    如果您收到 requested access to the resource is denied 錯誤,請確保您已登入,並且映像檔標籤中的 Docker 使用者名稱正確無誤。

    片刻之後,您的映像檔應該就會成功推送至 Docker Hub。

其他資源

若要深入了解建置、標記和發佈映像檔的相關資訊,請參閱以下資源:

下一步

既然您已學會如何建置並發佈映像檔,接下來該學習如何使用 Docker 建置快取 (build cache) 來加速建置過程。

使用建置快取
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.