構建、標記和釋出映象

解釋

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

  • 構建映象 - 基於 `Dockerfile` 構建映象的過程
  • 標記映象 - 為映象提供名稱的過程,該名稱也決定了映象可以在哪裡分發
  • 釋出映象 - 使用容器登錄檔分發或共享新建立的映象的過程

構建映象

大多數情況下,映象是使用 Dockerfile 構建的。最基本的 `docker build` 命令可能如下所示

docker build .

命令中的最後一個 `.` 提供了指向 構建上下文 的路徑或 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`,其中名稱空間是使用者的或組織的名稱。如果沒有指定名稱空間,則使用 `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 容器登錄檔、`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

幾秒鐘內,您的映象的所有層都會被推送到登錄檔。

需要身份驗證

在您能夠將映象推送到儲存庫之前,您需要進行身份驗證。為此,只需使用 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 構建快取來加速構建過程了。