構建、標記和釋出映象
解釋
在本指南中,您將學習以下內容
- 構建映象 - 基於
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
,其中 namespace 是使用者或組織的名稱。如果未指定 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
幾秒鐘內,您映象的所有層都將被推送到註冊中心。
需要身份驗證
在您能夠將映象推送到倉庫之前,您需要進行身份驗證。為此,只需使用 docker login 命令即可。
試一試
在這個實踐指南中,您將使用提供的 Dockerfile 構建一個簡單的映象,並將其推送到 Docker Hub。
設定
獲取示例應用程式。
如果您有 Git,可以克隆示例應用程式的倉庫。否則,您可以下載示例應用程式。選擇以下選項之一。
在終端中使用以下命令克隆示例應用程式倉庫。
$ git clone https://github.com/docker/getting-started-todo-app
下載原始碼並解壓。
下載並安裝 Docker Desktop。
如果您還沒有 Docker 帳戶,現在建立一個。完成後,使用該帳戶登入 Docker Desktop。
構建映象
現在您在 Docker Hub 上有了一個倉庫,是時候構建一個映象並將其推送到該倉庫了。
在示例應用程式倉庫的根目錄下的終端中,執行以下命令。將
YOUR_DOCKER_USERNAME
替換為您的 Docker Hub 使用者名稱$ docker build -t <YOUR_DOCKER_USERNAME>/concepts-build-image-demo .
例如,如果您的使用者名稱是
mobywhale
,您將執行以下命令$ docker build -t mobywhale/concepts-build-image-demo .
構建完成後,您可以使用以下命令檢視映象
$ docker image ls
該命令將產生類似於以下的輸出
REPOSITORY TAG IMAGE ID CREATED SIZE mobywhale/concepts-build-image-demo latest 746c7e06537f 24 seconds ago 354MB
您實際上可以使用 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
此輸出顯示了映象的各層,突出顯示了您新增的層和從基礎映象繼承的層。
推送映象
現在您已經構建了映象,是時候將映象推送到註冊中心了。
使用 docker push 命令推送映象
$ docker push <YOUR_DOCKER_USERNAME>/concepts-build-image-demo
如果您收到
requested access to the resource is denied
(對資源的請求訪問被拒絕)的錯誤,請確保您已登入,並且您在映象標籤中的 Docker 使用者名稱是正確的。稍等片刻,您的映象應該會被推送到 Docker Hub。
其他資源
要了解有關構建、標記和釋出映象的更多資訊,請訪問以下資源
後續步驟
現在您已經瞭解瞭如何構建和釋出映象,是時候學習如何使用 Docker 構建快取來加速構建過程了。
使用構建快取