检查点
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 Console」(開啟 Google 控制台) 按鈕
- 剩餘時間
- 必須在這個研究室中使用的暫時憑證
- 完成這個研究室所需的其他資訊 (如有)
-
按一下「Open Google Console」(開啟 Google 控制台)。接著,研究室會啟動相關資源並開啟另一個分頁,當中會顯示「Sign in」(登入) 頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意事項:如果頁面中顯示了「Choose an account」(選擇帳戶) 對話方塊,請按一下「Use Another Account」(使用其他帳戶)。 -
如有必要,請複製「Lab Details」(研究室詳細資料) 面板中的使用者名稱,然後貼到「Sign in」(登入) 對話方塊。按一下「Next」(下一步)。
-
複製「Lab Details」(研究室詳細資料) 面板中的密碼,然後貼到「Welcome」(歡迎使用) 對話方塊。按一下「Next」(下一步)。
重要注意事項:請務必使用左側面板中的憑證,而非 Google Cloud 技能重點加強的憑證。 注意事項:如果使用自己的 Google Cloud 帳戶來進行這個研究室,可能會產生額外費用。 -
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
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 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 存放區
- 執行下列指令來建立 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 指令。
curl http://localhost:4000
(指令輸出)
測試已完成的工作
點選「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 年 1 月 26 日
研究室上次測試日期:2024 年 1 月 26 日
Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。