检查点
Publish your container image to Container Registry
/ 100
Docker 簡介
GSP055
總覽
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 控制台
-
按一下「Start Lab」(開始研究室) 按鈕。如果研究室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的暫時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,然後選取「在無痕式視窗中開啟連結」。
接著,實驗室會啟動相關資源並開啟另一個分頁,當中顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。 -
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}} 您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}} 您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。 注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。 -
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
- 點按 Google Cloud 控制台上方的「啟用 Cloud Shell」圖示 。
連線完成即代表已通過驗證,且專案已設為您的 PROJECT_ID。輸出內容中有一行宣告本工作階段 PROJECT_ID 的文字:
gcloud
是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
-
點按「授權」。
-
輸出畫面應如下所示:
輸出內容:
- (選用) 您可以使用下列指令來列出專案 ID:
輸出內容:
輸出內容範例:
gcloud
的完整說明,請前往 Google Cloud 並參閱「gcloud CLI overview guide」(gcloud CLI 總覽指南)。
工作 1:Hello world
- 在 Cloud Shell 中輸入下列指令,從執行「hello world」容器著手:
(指令輸出)
這個簡易容器會將 Hello from Docker!
訊息傳回到螢幕畫面。雖然指令很簡單,但請留意輸出內容中系統執行的步驟數。Docker Daemon 搜尋了「hello-world」映像檔,但沒有在本機找到該映像檔,接著從公開登錄檔 Docker Hub 中提取該映像檔,從映像檔建立容器並執行。
- 執行下列指令,查看 Docker Daemon 從 Docker Hub 提取的容器映像檔:
(指令輸出)
這是從公開登錄檔 Docker Hub 提取的映像檔。Image ID (映像檔 ID) 為 SHA256 雜湊格式,這個欄位會指定已佈建的 Docker 映像檔。如果 Docker Daemon 在本機找不到映像檔,系統預設會在公開登錄檔中搜尋映像檔。
- 再次執行容器:
(指令輸出)
請注意,當您第二次執行這個容器時,Docker Daemon 會在本機登錄檔中尋找映像檔,從該映像檔執行容器,不必從 Docker Hub 提取映像檔。
- 最後執行下列指令,查看執行中的容器:
(指令輸出)
沒有執行中的容器。您已退出先前執行的「hello-world」容器。
- 如要查看所有容器,包括已執行完畢的容器,請執行
docker ps -a
:
(指令輸出)
這個指令會顯示 Container ID
(容器 ID,此為 Docker 產生的 UUID,用來識別容器),以及有關本次執行作業的更多中繼資料。容器的 Names
(名稱) 也是隨機產生,但能使用 docker run --name [container-name] hello-world
指定。
工作 2:建構
在本節中,您將根據簡易的節點應用程式,建構 Docker 映像檔。
- 執行下列指令,建立資料夾
test
,並切換至該資料夾。
- 建立
Dockerfile
:
這個檔案會指示 Docker Daemon 該如何建構映像檔。
- 第一行指定了基本父項映像檔,在本例中為官方 Docker 節點映像檔的長期支援版 (LTS)。
- 第二行設定了容器當前的工作目錄。
- 第三行將當前目錄的內容 (使用
「.」
指定) 新增到容器。 - 接著公開容器的通訊埠,以接受通訊埠的連線,最後執行節點指令啟動應用程式。
Dockerfile
中每一行的含義。現在請編寫節點應用程式,之後將建構映像檔。
- 執行下列指令,建立節點應用程式:
這是簡易的 HTTP 伺服器,會監聽通訊埠 80 並傳回「Hello World」。
現在來建構映像檔。
- 再次提醒,
「.」
表示當下的目錄,您需要在有 Dockerfile 的目錄中執行這個指令:
這個指令會在幾分鐘內執行完畢。輸出內容應該會類似下列示例:
-t
旗標是用來使用 name:tag
語法命名及標記映像檔。映像檔名為 node-app
,而 tag
為 0.1
。強烈建議您在建構 Docker 映像檔時使用這個標記。如未指定標記,標記預設會設為 latest
,您會較難分辨新舊映像檔。另外,也請您在建構映像檔時,留意前述的 Dockerfile
中,各行如何產生中間容器層。
- 接著執行下列指令,查看您建構的映像檔:
輸出內容應該會類似下列示例:
請注意,node
是基本映像檔,node-app
則是您建構的映像檔。如要移除 node
,必須先移除 node-app
。比起 VM,映像檔相對較小。其他版本的節點映像檔 (例如 node:slim
和 node:alpine
) 甚至更小,可攜性更高。在我們的「進階主題」中,進一步說明了如何縮減容器大小。您可以在 node 中的官方存放區查看所有版本。
工作 3:執行
- 使用這個指令,根據您建構的映像檔執行容器:
(指令輸出)
--name
旗標可讓您視需要為容器命名。-p
旗標會指示 Docker,將主機的通訊埠 4000 對應至容器的通訊埠 80。現在您可以透過 http://localhost:4000
連至伺服器了。如未對應通訊埠,就無法連接 localhost 上的容器。
- 開啟另一個終端機 (在 Cloud Shell 中點選
+
圖示),測試伺服器:
(指令輸出)
只要初始終端機正在執行中,容器就會執行。如果您希望容器在背景執行 (不受終端機的工作階段限制),則需指定 -d
旗標。
- 關閉初始終端機,執行下列指令,停止並移除容器:
- 接著執行下列指令,在背景啟動容器:
(指令輸出)
- 請注意,
docker ps
的輸出內容顯示容器正在執行中。您可以執行docker logs [container_id]
查看記錄檔。
17bcaca6f....
,則只需執行 docker logs 17b
。(指令輸出)
接著修改應用程式。
- 在 Cloud Shell 中,開啟先前在研究室中建立的測試目錄:
- 使用您選擇的文字編輯器 (例如 nano 或 vim) 編輯
app.js
,用其他字串取代「Hello World」:
- 建構這個新映像檔,並加上
0.2
標記:
(指令輸出)
請注意,在步驟 2 中,您使用的是現有的快取資料層。從步驟 3 開始,您修改了 app.js
中的內容,因此也會修改資料層。
- 使用新版映像檔執行另一個容器。請注意,這次我們對應的主機通訊埠是 8080,而非 80。您無法使用主機通訊埠 4000,因為該通訊埠已在使用中。
(指令輸出)
- 測試容器:
(指令輸出)
- 現在測試您建立的第一個容器:
(指令輸出)
工作 4:偵錯
您已熟悉如何建構及執行容器,接著來瞭解一些偵錯做法。
- 您可以使用
docker logs [container_id]
指令查看容器的記錄檔。如要在容器執行時追蹤記錄檔的輸出內容,請使用-f
選項。
(指令輸出)
有時候,您可能會想在執行中的容器內,啟動互動式 Bath 工作階段:
- 這時可以使用
docker exec
。請開啟另一個終端機 (在 Cloud Shell 中點選「+」圖示),輸入下列指令:
-it
旗標可分配虛擬 TTY、使 stdin 保持開啟狀態,讓您與容器互動。請注意,Bash 是在 Dockerfile
中指定的 WORKDIR
目錄 (/app) 內執行。您要在這裡對容器中的互動式殼層工作階段偵錯。
(指令輸出)
- 查看目錄
(指令輸出)
- 退出 Bash 工作階段:
- 您可以使用 Docker inspect 指令,檢查 Docker 中的容器中繼資料:
(指令輸出)
- 使用
--format
指令,檢查傳回 JSON 中的特定欄位。例如:
(輸出內容示例)
請務必查看下列 Docker 說明文件資源,進一步瞭解偵錯方法:
工作 5:發布
現在您要將映像檔推送至 Google Artifact Registry。推送完畢後,您將移除所有容器和映像檔,以模擬全新環境,再提取及執行容器。這麼做可展示 Docker 容器的可攜性。
如要將映像檔推送至由 Artifact Registry 託管的私人登錄檔,您需要使用登錄檔名稱標記映像檔,格式為 <regional-repository>-docker.pkg.dev/my-project/my-repo/my-image
。
建立目標 Docker 存放區 (使用 Cloud 控制台)
您必須先建立存放區,才能向存放區推送映像檔。推送映像檔不會建立存放區,且 Cloud Build 服務帳戶並沒有建立存放區的權限。
-
在導覽選單的「CI/CD」下方,依序前往「Artifact Registry」>「存放區」。
-
點選存放區旁邊的「+建立存放區」圖示。
-
指定
my-repository
做為存放區名稱。 -
選擇「Docker」做為格式。
-
在「位置類型」下方,選取「區域」,接著選擇位置:
。 -
點選「建立」。
設定驗證機制
在推送或提取映像檔前,請先設定 Docker,透過 Google Cloud CLI 驗證傳送至 Artifact Registry 的要求。
- 如要為
區域中的 Docker 存放區設定驗證機制,請在 Cloud Shell 中執行下列指令:
- 在系統提示時輸入
Y
。
這個指令會更新 Docker 設定。您現在可以在 Google Cloud 專案中連結 Artifact Registry,以推送及提取映像檔。
建立 Artifact Registry 存放區 (使用 CLI)
- 執行下列指令來建立 Artifact Repository。
將容器推送至 Artifact Registry
- 切換至 Dockerfile 的所在目錄。
- 執行下列指令,為映像檔加上
node-app:0.2
標記。
- 執行下列指令,檢查您建構的 Docker 映像檔。
(指令輸出)
- 將這個映像檔推送至 Artifact Registry。
指令輸出 (可能與您的輸出內容不同):
-
推送作業完成後,請在導覽選單的「CI/CD」下方,依序前往「Artifact Registry」>「存放區」。
-
點選「my-repository」。您應該會看到已建立的
node-app
Docker 容器:
測試映像檔
您可以啟動新的 VM、透過 SSH 連至該 VM 並安裝 gcloud。為求簡單起見,只要移除所有容器和映像檔,即可模擬全新環境。
- 停止並移除所有容器:
您必須先移除 node:lts
的子映像檔,才能移除節點映像檔。
- 執行下列指令,移除所有 Docker 映像檔。
(指令輸出)
現在您應該會擁有虛擬全新環境。
- 提取並執行映像檔。
- 對執行中的容器執行 curl 指令。
(指令輸出)
測試已完成的工作
點選「Check my progress」,確認工作已完成。如果您成功將容器映像檔發布至 Artifact Registry,就會看到評量分數。
這裡顯示了容器的可攜性。只要在主機 (不論是地端部署的主機或 VM) 上安裝 Docker,就能從公開或私人登錄檔中提取映像檔,並根據該映像檔執行容器。您只需在主機上安裝 Docker,不必安裝其他應用程式依附元件。
恭喜!
恭喜!在本研究室中,您進行了多項實作活動,包括根據 Docker Hub 中的公開映像檔來執行容器。您建構了自己的容器映像檔,成功推送至 Google Artifact Registry,也學到如何有效率地對執行中的容器偵錯。此外,您還藉由實際操作,瞭解如何根據從 Google Artifact Registry 提取的映像檔來執行容器,加深了對 Docker 概念的理解度與熟練度。
後續步驟/瞭解詳情
- Dockerfile 參考資料
- Docker Hub
- 如要進一步瞭解 Docker,請參閱官方文件
- Artifact Registry 說明文件
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2024 年 2 月 29 日
研究室上次測試日期:2024 年 2 月 29 日
Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。