arrow_back

Docker 簡介

加入 登录
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Docker 簡介

Lab 1 小时 universal_currency_alt 1 积分 show_chart 入门级
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP055

Google Cloud 自修研究室標誌

總覽

Docker 開放式平台可開發、推送及執行應用程式。有了 Docker,您可以將應用程式從基礎架構中獨立出來,並將基礎架構做為代管應用程式處理。這個平台可加快推送程式碼、測試及部署作業,縮短從編寫到執行程式碼的週期。

為了實現這個目的,Docker 結合核心容器化功能,以及可協助您管理及部署應用程式的工作流程與工具。

Docker 容器可直接在 Kubernetes 中使用,能輕鬆在 Kubernetes Engine 內執行。學習 Docker 的基礎知識後,您就能開始開發 Kubernetes 與容器化應用程式。

目標

本研究室的學習內容包括:

  • 建構、執行並偵錯 Docker 容器。
  • 從 Docker Hub 和 Google Artifact Registry 提取 Docker 映像檔。
  • 將 Docker 映像檔推送至 Google Artifact Registry。

先備知識

這是入門等級的研究室,幾乎沒有 Docker 和容器的使用經驗也不成問題。建議您先熟悉 Cloud Shell 及指令列的使用方法,但這不是必要條件。

設定和需求

點選「Start Lab」按鈕前的須知事項

請詳閱以下操作說明。研究室活動會計時,而且中途無法暫停。點選「Start Lab」 後就會開始計時,讓您瞭解有多少時間可以使用 Google Cloud 資源。

您將在真正的雲端環境中完成實作研究室活動,而不是在模擬或示範環境。為達此目的,我們會提供新的暫時憑證,讓您用來在研究室活動期間登入及存取 Google Cloud。

如要完成這個研究室活動,請先確認:

  • 您可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意:請使用無痕模式或私密瀏覽視窗執行此研究室。這可以防止個人帳戶和學生帳戶之間的衝突,避免個人帳戶產生額外費用。
  • 是時候完成研究室活動了!別忘了,活動一開始將無法暫停。
注意:如果您擁有個人 Google Cloud 帳戶或專案,請勿用於本研究室,以免產生額外費用。

如何開始研究室及登入 Google Cloud 控制台

  1. 按一下「Start Lab」(開始研究室) 按鈕。如果研究室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」(研究室詳細資料) 面板會顯示下列項目:

    • 「Open Google Console」(開啟 Google 控制台) 按鈕
    • 剩餘時間
    • 必須在這個研究室中使用的暫時憑證
    • 完成這個研究室所需的其他資訊 (如有)
  2. 按一下「Open Google Console」(開啟 Google 控制台)。接著,研究室會啟動相關資源並開啟另一個分頁,當中會顯示「Sign in」(登入) 頁面。

    提示:您可以在不同的視窗中並排開啟分頁。

    注意事項:如果頁面中顯示了「Choose an account」(選擇帳戶) 對話方塊,請按一下「Use Another Account」(使用其他帳戶)
  3. 如有必要,請複製「Lab Details」(研究室詳細資料) 面板中的使用者名稱,然後貼到「Sign in」(登入) 對話方塊。按一下「Next」(下一步)

  4. 複製「Lab Details」(研究室詳細資料) 面板中的密碼,然後貼到「Welcome」(歡迎使用) 對話方塊。按一下「Next」(下一步)

    重要注意事項:請務必使用左側面板中的憑證,而非 Google Cloud 技能重點加強的憑證。 注意事項:如果使用自己的 Google Cloud 帳戶來進行這個研究室,可能會產生額外費用。
  5. 按過後續的所有頁面:

    • 接受條款及細則。
    • 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
    • 請勿申請免費試用。

Cloud 控制台稍後會在這個分頁中開啟。

注意事項:按一下畫面左上方的導覽選單,即可在選單中查看 Google Cloud 產品與服務的清單。「導覽選單」圖示

啟動 Cloud Shell

Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。

  1. 點按 Google Cloud 控制台上方的「啟用 Cloud Shell」圖示 「啟動 Cloud Shell」圖示

連線完成即代表已通過驗證,且專案已設為您的 PROJECT_ID。輸出內容中有一行宣告本工作階段 PROJECT_ID 的文字:

您在本工作階段中的 Cloud Platform 專案會設為「YOUR_PROJECT_ID」

gcloud 是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。

  1. (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
  1. 點按「授權」

  2. 輸出畫面應如下所示:

輸出內容:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project

輸出內容:

[core] project = <project_ID>

輸出內容範例:

[core] project = qwiklabs-gcp-44776a13dea667a6 附註:如需有關 gcloud 的完整說明,請前往 Google Cloud 並參閱「gcloud CLI overview guide」(gcloud CLI 總覽指南)。

工作 1:Hello world

  1. 在 Cloud Shell 中輸入下列指令,從執行「hello world」容器著手:
docker run hello-world

(指令輸出)

Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

這個簡易容器會將 Hello from Docker! 訊息傳回到螢幕畫面。雖然指令很簡單,但請留意輸出內容中系統執行的步驟數。Docker Daemon 搜尋了「hello-world」映像檔,但沒有在本機找到該映像檔,接著從公開登錄檔 Docker Hub 中提取該映像檔,從映像檔建立容器並執行。

  1. 執行下列指令,查看 Docker Daemon 從 Docker Hub 提取的容器映像檔:
docker images

(指令輸出)

REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 14 months ago 13.3kB

這是從公開登錄檔 Docker Hub 提取的映像檔。Image ID (映像檔 ID) 為 SHA256 雜湊格式,這個欄位會指定已佈建的 Docker 映像檔。如果 Docker Daemon 在本機找不到映像檔,系統預設會在公開登錄檔中搜尋映像檔。

  1. 再次執行容器:
docker run hello-world

(指令輸出)

Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: ...

請注意,當您第二次執行這個容器時,Docker Daemon 會在本機登錄檔中尋找映像檔,從該映像檔執行容器,不必從 Docker Hub 提取映像檔。

  1. 最後執行下列指令,查看執行中的容器:
docker ps

(指令輸出)

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

沒有執行中的容器。您已退出先前執行的「hello-world」容器。

  1. 如要查看所有容器,包括已執行完畢的容器,請執行 docker ps -a
docker ps -a

(指令輸出)

CONTAINER ID IMAGE COMMAND ... NAMES 6027ecba1c39 hello-world "/hello" ... elated_knuth 358d709b8341 hello-world "/hello" ... epic_lewin

這個指令會顯示 Container ID (容器 ID,此為 Docker 產生的 UUID,用來識別容器),以及有關本次執行作業的更多中繼資料。容器的 Names (名稱) 也是隨機產生,但能使用 docker run --name [container-name] hello-world 指定。

工作 2:建構

在本節中,您將根據簡易的節點應用程式,建構 Docker 映像檔。

  1. 執行下列指令,建立資料夾 test,並切換至該資料夾。
mkdir test && cd test
  1. 建立 Dockerfile
cat > Dockerfile <<EOF # Use an official Node runtime as the parent image FROM node:lts # Set the working directory in the container to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Make the container's port 80 available to the outside world EXPOSE 80 # Run app.js using node when the container launches CMD ["node", "app.js"] EOF

這個檔案會指示 Docker Daemon 該如何建構映像檔。

  • 第一行指定了基本父項映像檔,在本例中為官方 Docker 節點映像檔的長期支援版 (LTS)。
  • 第二行設定了容器當前的工作目錄。
  • 第三行將當前目錄的內容 (使用 「.」 指定) 新增到容器。
  • 接著公開容器的通訊埠,以接受通訊埠的連線,最後執行節點指令啟動應用程式。
注意:請花點時間查看 Dockerfile 指令參考文件,瞭解 Dockerfile 中每一行的含義。

現在請編寫節點應用程式,之後將建構映像檔。

  1. 執行下列指令,建立節點應用程式:
cat > app.js << EOF; const http = require("http"); const hostname = "0.0.0.0"; const port = 80; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader("Content-Type", "text/plain"); res.end("Hello World\n"); }); server.listen(port, hostname, () => { console.log("Server running at http://%s:%s/", hostname, port); }); process.on("SIGINT", function () { console.log("Caught interrupt signal and will exit"); process.exit(); }); EOF

這是簡易的 HTTP 伺服器,會監聽通訊埠 80 並傳回「Hello World」。

現在來建構映像檔。

  1. 再次提醒,「.」表示當下的目錄,您需要在有 Dockerfile 的目錄中執行這個指令:
docker build -t node-app:0.1 .

這個指令會在幾分鐘內執行完畢。輸出內容應該會類似下列示例:

+] Building 0.7s (8/8) FINISHED docker:default => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 397B 0.0s => [internal] load metadata for docker.io/library/node:lts

-t 旗標是用來使用 name:tag 語法命名及標記映像檔。映像檔名為 node-app,而 tag0.1。強烈建議您在建構 Docker 映像檔時使用這個標記。如未指定標記,標記預設會設為 latest,您會較難分辨新舊映像檔。另外,也請您在建構映像檔時,留意前述的 Dockerfile 中,各行如何產生中間容器層。

  1. 接著執行下列指令,查看您建構的映像檔:
docker images

輸出內容應該會類似下列示例:

REPOSITORY TAG IMAGE ID CREATED SIZE node-app 0.1 f166cd2a9f10 25 seconds ago 656.2 MB node lts 5a767079e3df 15 hours ago 656.2 MB hello-world latest 1815c82652c0 6 days ago 1.84 kB

請注意,node 是基本映像檔,node-app 則是您建構的映像檔。如要移除 node,必須先移除 node-app。比起 VM,映像檔相對較小。其他版本的節點映像檔 (例如 node:slimnode:alpine) 甚至更小,可攜性更高。在我們的「進階主題」中,進一步說明了如何縮減容器大小。您可以在 node 中的官方存放區查看所有版本。

工作 3:執行

  1. 使用這個指令,根據您建構的映像檔執行容器:
docker run -p 4000:80 --name my-app node-app:0.1

(指令輸出)

Server running at http://0.0.0.0:80/

--name 旗標可讓您視需要為容器命名。-p 旗標會指示 Docker,將主機的通訊埠 4000 對應至容器的通訊埠 80。現在您可以透過 http://localhost:4000 連至伺服器了。如未對應通訊埠,就無法連接 localhost 上的容器。

  1. 開啟另一個終端機 (在 Cloud Shell 中點選 + 圖示),測試伺服器:
curl http://localhost:4000

(指令輸出)

Hello World

只要初始終端機正在執行中,容器就會執行。如果您希望容器在背景執行 (不受終端機的工作階段限制),則需指定 -d 旗標。

  1. 關閉初始終端機,執行下列指令,停止並移除容器:
docker stop my-app && docker rm my-app
  1. 接著執行下列指令,在背景啟動容器:
docker run -p 4000:80 --name my-app -d node-app:0.1 docker ps

(指令輸出)

CONTAINER ID IMAGE COMMAND CREATED ... NAMES xxxxxxxxxxxx node-app:0.1 "node app.js" 16 seconds ago ... my-app
  1. 請注意,docker ps 的輸出內容顯示容器正在執行中。您可以執行 docker logs [container_id] 查看記錄檔。
注意:如果容器 ID 開頭前幾個字元能明確識別該容器,就不需要輸入完整 ID。舉例來說,如果容器 ID 是 17bcaca6f....,則只需執行 docker logs 17b docker logs [container_id]

(指令輸出)

Server running at http://0.0.0.0:80/

接著修改應用程式。

  1. 在 Cloud Shell 中,開啟先前在研究室中建立的測試目錄:
cd test
  1. 使用您選擇的文字編輯器 (例如 nano 或 vim) 編輯 app.js,用其他字串取代「Hello World」:
.... const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Welcome to Cloud\n'); }); ....
  1. 建構這個新映像檔,並加上 0.2 標記:
docker build -t node-app:0.2 .

(指令輸出)

[+] Building 0.7s (8/8) FINISHED docker:default => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 397B 0.0s => [internal] load metadata for docker.io/library/node:lts 0.5s

請注意,在步驟 2 中,您使用的是現有的快取資料層。從步驟 3 開始,您修改了 app.js 中的內容,因此也會修改資料層。

  1. 使用新版映像檔執行另一個容器。請注意,這次我們對應的主機通訊埠是 8080,而非 80。您無法使用主機通訊埠 4000,因為該通訊埠已在使用中。
docker run -p 8080:80 --name my-app-2 -d node-app:0.2 docker ps

(指令輸出)

CONTAINER ID IMAGE COMMAND CREATED xxxxxxxxxxxx node-app:0.2 "node app.js" 53 seconds ago ... xxxxxxxxxxxx node-app:0.1 "node app.js" About an hour ago ...
  1. 測試容器:
curl http://localhost:8080

(指令輸出)

Welcome to Cloud
  1. 現在測試您建立的第一個容器:
curl http://localhost:4000

(指令輸出)

Hello World

工作 4:偵錯

您已熟悉如何建構及執行容器,接著來瞭解一些偵錯做法。

  1. 您可以使用 docker logs [container_id] 指令查看容器的記錄檔。如要在容器執行時追蹤記錄檔的輸出內容,請使用 -f 選項。
docker logs -f [container_id]

(指令輸出)

Server running at http://0.0.0.0:80/

有時候,您可能會想在執行中的容器內,啟動互動式 Bath 工作階段:

  1. 這時可以使用 docker exec。請開啟另一個終端機 (在 Cloud Shell 中點選「+」圖示),輸入下列指令:
docker exec -it [container_id] bash

-it 旗標可分配虛擬 TTY、使 stdin 保持開啟狀態,讓您與容器互動。請注意,Bash 是在 Dockerfile 中指定的 WORKDIR 目錄 (/app) 內執行。您要在這裡對容器中的互動式殼層工作階段偵錯。

(指令輸出)

root@xxxxxxxxxxxx:/app#
  1. 查看目錄
ls

(指令輸出)

Dockerfile app.js
  1. 退出 Bash 工作階段:
exit
  1. 您可以使用 Docker inspect 指令,檢查 Docker 中的容器中繼資料:
docker inspect [container_id]

(指令輸出)

[ { "Id": "xxxxxxxxxxxx....", "Created": "2017-08-07T22:57:49.261726726Z", "Path": "node", "Args": [ "app.js" ], ...
  1. 使用 --format 指令,檢查傳回 JSON 中的特定欄位。例如:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]

(輸出內容示例)

192.168.9.3

請務必查看下列 Docker 說明文件資源,進一步瞭解偵錯方法:

工作 5:發布

現在您要將映像檔推送至 Google Artifact Registry。推送完畢後,您將移除所有容器和映像檔,以模擬全新環境,再提取及執行容器。這麼做可展示 Docker 容器的可攜性。

如要將映像檔推送至由 Artifact Registry 託管的私人登錄檔,您需要使用登錄檔名稱標記映像檔,格式為 <regional-repository>-docker.pkg.dev/my-project/my-repo/my-image

建立目標 Docker 存放區 (使用 Cloud 控制台)

您必須先建立存放區,才能向存放區推送映像檔。推送映像檔不會建立存放區,且 Cloud Build 服務帳戶並沒有建立存放區的權限。

  1. 導覽選單的「CI/CD」下方,依序前往「Artifact Registry」>「存放區」

  2. 點選存放區旁邊的「+建立存放區」圖示。

  3. 指定 my-repository 做為存放區名稱。

  4. 選擇「Docker」做為格式。

  5. 在「位置類型」下方,選取「區域」,接著選擇位置:

  6. 點選「建立」

設定驗證機制

在推送或提取映像檔前,請先設定 Docker,透過 Google Cloud CLI 驗證傳送至 Artifact Registry 的要求。

  1. 如要為 區域中的 Docker 存放區設定驗證機制,請在 Cloud Shell 中執行下列指令:
gcloud auth configure-docker {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev
  1. 在系統提示時輸入 Y

這個指令會更新 Docker 設定。您現在可以在 Google Cloud 專案中連結 Artifact Registry,以推送及提取映像檔。

注意:您也能透過 gcloud CLI 使用簡化的指令列方法。

建立 Artifact Registry 存放區 (使用 CLI)

  1. 執行下列指令來建立 Artifact Repository。
gcloud artifacts repositories create my-repository --repository-format=docker --location={{{ project_0.default_region | "REGION" }}} --description="Docker repository" 注意:在您初次透過 Cloud Shell 發出 Google Cloud API 呼叫或使用需要憑證的指令列工具 (例如 gcloud CLI、bq 或 gsutil) 時,Cloud Shell 會顯示授權 Cloud Shell 對話方塊。如要允許工具使用憑證發出呼叫,請點選「Authorize」(授權)

將容器推送至 Artifact Registry

  1. 切換至 Dockerfile 的所在目錄。
cd ~/test
  1. 執行下列指令,為映像檔加上 node-app:0.2 標記。
docker build -t {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/my-repository/node-app:0.2 .
  1. 執行下列指令,檢查您建構的 Docker 映像檔。
docker images

(指令輸出)

REPOSITORY TAG IMAGE ID CREATED node-app 0.2 76b3beef845e 22 hours {{{project_0.default_region | "REGION"}}}-....node-app:0.2 0.2 76b3beef845e 22 hours node-app 0.1 f166cd2a9f10 26 hours node lts 5a767079e3df 7 days hello-world latest 1815c82652c0 7 weeks
  1. 將這個映像檔推送至 Artifact Registry。
docker push {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id | "PROJECT_ID" }}}/my-repository/node-app:0.2

指令輸出 (可能與您的輸出內容不同):

The push refers to a repository [{{{project_0.default_region | "REGION"}}}-docker.pkg.dev/{{{project_0.project_id | "PROJECT_ID"}}}/my-repository/node-app:0.2] 057029400a4a: Pushed 342f14cb7e2b: Pushed 903087566d45: Pushed 99dac0782a63: Pushed e6695624484e: Pushed da59b99bbd3b: Pushed 5616a6292c16: Pushed f3ed6cb59ab0: Pushed 654f45ecb7e3: Pushed 2c40c66f7667: Pushed 0.2: digest: sha256:25b8ebd7820515609517ec38dbca9086e1abef3750c0d2aff7f341407c743c46 size: 2419
  1. 推送作業完成後,請在導覽選單的「CI/CD」下方,依序前往「Artifact Registry」>「存放區」

  2. 點選「my-repository」。您應該會看到已建立的 node-app Docker 容器:

Artifact Registry 的「node-app」部分

測試映像檔

您可以啟動新的 VM、透過 SSH 連至該 VM 並安裝 gcloud。為求簡單起見,只要移除所有容器和映像檔,即可模擬全新環境。

  1. 停止並移除所有容器:
docker stop $(docker ps -q) docker rm $(docker ps -aq)

您必須先移除 node:lts 的子映像檔,才能移除節點映像檔。

  1. 執行下列指令,移除所有 Docker 映像檔。
docker rmi {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id| "PROJECT_ID" }}}/my-repository/node-app:0.2 docker rmi node:lts docker rmi -f $(docker images -aq) # remove remaining images docker images

(指令輸出)

REPOSITORY TAG IMAGE ID CREATED SIZE

現在您應該會擁有虛擬全新環境。

  1. 提取並執行映像檔。
docker run -p 4000:80 -d {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/{{{ project_0.project_id| "PROJECT_ID" }}}/my-repository/node-app:0.2
  1. 對執行中的容器執行 curl 指令。
curl http://localhost:4000

(指令輸出)

Welcome to Cloud

測試已完成的工作

點選「Check my progress」,確認工作已完成。如果您成功將容器映像檔發布至 Artifact Registry,就會看到評量分數。

Publish your container image to Artifact Registry

這裡顯示了容器的可攜性。只要在主機 (不論是地端部署的主機或 VM) 上安裝 Docker,就能從公開或私人登錄檔中提取映像檔,並根據該映像檔執行容器。您只需在主機上安裝 Docker,不必安裝其他應用程式依附元件。

恭喜!

恭喜!在本研究室中,您進行了多項實作活動,包括根據 Docker Hub 中的公開映像檔來執行容器。您建構了自己的容器映像檔,成功推送至 Google Artifact Registry,也學到如何有效率地對執行中的容器偵錯。此外,您還藉由實際操作,瞭解如何根據從 Google Artifact Registry 提取的映像檔來執行容器,加深了對 Docker 概念的理解度與熟練度。

後續步驟/瞭解詳情

Google Cloud 教育訓練與認證

協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。

使用手冊上次更新日期:2024 年 2 月 29 日

研究室上次測試日期:2024 年 2 月 29 日

Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。