-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
整篇文章變成一個 gist 程式碼區塊 #3
Comments
我剛剛用Example試了一下是正常的耶,可以貼一下會造成錯誤的範例嗎? |
可以的, 我剛剛試圖將以下的 MD 轉到 Medium Docker 實戰入門概述Docker 是一個提供開發, 運送, 以及運行應用的開放平台。 妥善地使用 Docker, 你可以將你的應用從基礎設施分離, 並且如管理應用般的管理基礎設施。 Docker 可讓你更快速的輸送你的程式碼, 更快速的測試, 以及更快速的部署, 讓開發到運行之間的週期更加縮短。 Docker 藉由使用工作流程以及工具來融合 kernel 容器化功能, 讓你可以管理以及部署你的應用。 Docker 容器可以直接地被使用在 Kubernetes, 這讓 Docker 可以很簡單的被運行在 Kubernetes Engine, 在學習 Docker 的一些重要的核心知識後, 你將擁有可以開始開發 Kubernetes 以及容器化應用的技能組合。 學習目標在本教程中, 你將會學習到以下:
事前準備這是個入門等級的教程。 只有一點點, 或是完全沒有 Docker 相關知識也是 okay 的。 建議熟悉 Cloud Shell 以及其命令列工具, 但非必要。 如果你在尋找在一個範圍內更進階的學習素材的話, 可以參考以下的教程:
如果你已經準備好了, 往下滑開始設定教程環境吧 設定及要求在你按下 Start Lab 按鈕之前 詳讀所有的教學。 Labs 是有時間限制的, 而且你不可以停止時間倒數。 倒數計時器在你按下 Start Lab 按鈕後開始倒數, 上面顯示的時間為你還能使用 Cloud 資源的時間。 Qwiklabs 的手把手環境, 讓你可以在真實環境中來操作進行 Qwiklabs 上提供的課程, 而不是在一個模擬或是展示的環境。 我們透過提供你一個全新的、暫時的帳號密碼, 在計時器歸零之前, 你可以用來登入並存取 Google Cloud Platform。 你需要什麼? 要完成這個 lab, 你需要:
備註: 如果你已經有你自己的個人 GCP 帳號或專案,請不要使用在這一個 lab 現在你已經開始你的 如何開始你的 lab, 然後登入 Console?
tip: 開啟一個全新的視窗,然後跟原本的頁面並排
重要:必須使用之前於
稍待一些時候, GCP 控制台將會在這個視窗開啟。 啟動 Google Cloud Shell
你可以立即按下 連結並提供環境會需要一點時間。 當你連結成功, 這代表你已成功獲得授權, 且此專案已被設為你的專案ID, 例如: gcloud 是 使用這個 command, 你可以列出有效帳戶名稱:
輸出:
範例輸出:
你可以使用以下 command 來列出專案 ID
輸出:
範例輸出:
Hello World打開 Cloud Shell 並輸入以下指令來運行一個 hello world 容器 docker run hello world (輸出)
這個簡單的容器回傳 執行以下的指令檢視從 Docker Hub 拉下的 Docker 鏡像 docker images (輸出)
這是一個從 Docker Hub 公開 registry 被拉下的鏡像。 鏡像 ID 為 SHA256 加密 格式 - 這個欄位明確的指定被提供的鏡像。 當 docker daemon 無法在本地端找到鏡像, 預設會自動地從公開 registry 尋找鏡像。 讓我們再次運行容器: docker run hello-world (輸出)
注意到, 當你第二次執行這個指令, docker daemon 在本地端找到了這個鏡像並且使用這個鏡像運行容器。 不需要再從 Docker Hub 拉下鏡像。 最後, 執行以下指令來檢視運行中的容器: docker ps (輸出)
目前並沒有運行中的容器。 你之前運行的 hello-world 容器已經退出了。 如果要檢視所有的容器, 包含已經結束運行的容器, 可以執行 docker ps -a (輸出)
這會顯示 建立現在讓我們來建立一個基於 node 簡單應用的 Docker 鏡像。 執行以下指令來建立並且切換到這個名為 mkdir test && cd test 建立一個 cat > Dockerfile <<EOF
# Use an official Node runtime as the parent image
FROM node:6
# 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 該怎樣建立這個鏡像
花一些時間看一下 Dockerfile command references 來了解 現在, 你將寫入 node 應用, 且在那之後你將建立鏡像 執行以下指令來建立 node 應用 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 server, 監聽 port 80 且回傳 "Hello world." 現在讓我們來建立鏡像吧 再次注意, docker build -t node-app:0.1 . 這個指令可能會花個幾分鐘才會執行完畢。 當它執行結束, 你的輸出應會如下:
現在, 執行以下指令來檢視建立的鏡像: docker images 輸出應如下:
注意到, 運行在這個章節中, 執行這個程式碼, 使用之前建立的鏡像運行容器: docker run -p 4000:80 --name my-app node-app:0.1 (輸出)
打開另外一個終端機 (在 Cloud Shell, 點擊 curl http://localhost:4000 (輸出)
第一個終端機視窗開啟多久, 這個容器就會運行多久。 如果你想要將容器運行在背景中 (不會綁住終端機), 你需要指定 關閉第一個終端機視窗, 然後執行以下指令來停止並移除容器: docker stop my-app && docker rm my-app 現在執行以下指令來開始在背景運行另外一個容器: docker run -p 4000:80 --name my-app -d node-app:0.1
docker ps (輸出)
從 小技巧: 你不需要完整的容器 ID, 只要前幾個字是獨一無二足以代表這個容器。 舉例來說, 你可以執行 docker logs [container_id] (輸出)
現在讓我們來修改應用。 在 Cloud Shell, 打開之前建立的 test 資料夾: cd test 使用你的編輯器 (比如 namo 或 vim) 來編輯
建立這個新的鏡像, 並給予 tag docker build -t node-app:0.2 . (輸出)
注意到, 在 step 2我們使用了以存在的緩存層。 從 step 3 開始, 層被修改了因為我們在 使用新的鏡像版本啟動另外一個容器。 注意到我們是如何的映射本機端的 port 8080, 而不是 port 80, 我們不能在使用 port 4000 因為它已經在使用中了。 docker run -p 8080:80 --name my-app-2 -d node-app:0.2
docker ps (輸出)
測試容器
(輸出)
現在測試第一個容器 curl http://localhost:4000 (輸出)
Debug現在我們已經熟悉如何建立以及運行容器, 來學習一下一些 debugging 的方法。 docker logs -f [container_id] (輸出)
有時, 你可能會想要啟動一個容器內的 Bash, 你可以使用 docker exec 來做到這件事。 打開另外一個終端機 (在 Cloud Shell, 點擊 + 圖示), 然後執行以下指令: docker exec -it [container_id] bash
(輸出)
檢視資料夾 ls (輸出)
若要離開 Bash, 在 Bash 中輸入 exit: exit 你可以使用以下指令來檢視容器的元資料 docker inspect [container_id] (輸出)
使用 docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id] (輸出)
務必到以下的連結去參考更多有關 debugging 的資訊 發佈現在, 你將推送你的鏡像到 Google Container Registry (gcr)。 在那之後, 你將會將本地的容器以及鏡像都刪除來模擬一個全新的環境, 然後從遠端拉取鏡像並啟動容器。 這將是 Docker 容器可攜性的最佳示範。 要推送鏡像到你的私人 gcr 的 registry, 你需要 tag registry 的名稱到這個鏡像。 格式就像是 GCR 的格式:
你可以執行以下指令來找到你的 project ID gcloud config list project (輸出)
給予 tag docker tag node-app:0.2 gcr.io/[project-id]/node-app:0.2 docker images (輸出)
將這個鏡像推送到 gcr, 記住要將 docker push gcr.io/[project-id]/node-app:0.2 (輸出)
從瀏覽器拜訪鏡像位址來確認鏡像已存在於 gcr, 你可以從主控台到 Tools > Container Registry 或是拜訪 現在讓我們測試這個鏡像。 你可以開啟一個新的 VM, ssh 到這個 VM, 然後安裝 gcloud, 但為求簡單化, 我們將簡單的移除所有的容器以及鏡像來模擬一個全新的環境。 停止並刪除所有的容器: docker stop $(docker ps -q)
docker rm $(docker ps -aq) 在移除 node 鏡像之前, 你必須要移除它的子鏡像 ( docker rmi node-app:0.2 gcr.io/[project-id]/node-app node-app:0.1
docker rmi node:6
docker rmi $(docker images -aq) # remove remaining images
docker images (輸出)
現在你應該有一個虛擬全新的環境。 拉取並運行鏡像。 記得將 docker pull gcr.io/[project-id]/node-app:0.2
docker run -p 4000:80 -d gcr.io/[project-id]/node-app:0.2
curl http://localhost:4000 (輸出)
測試進度點擊 Check my progress 來確認目前的進度。如果你已經成功發布容器鏡像到 Container Registry, 你將獲得一個評價分數。 在這裏, 我們示範了容器的可攜帶性。 只要機器上有安裝 Docker (實機或虛擬機), 你可以從公開或私人的 registries 拉取鏡像並運行容器。 在你的機器上除了 Docker, 你不需要再安裝其他的應用相依。 恭喜你已經完成本教程 請不吝你的掌聲如果覺得本文寫得不錯, 或是有幫到你的地方, 給我點掌聲吧!
小技巧: 按著不放就可以連拍哦! |
hmm...我複製comment裡的code貼過去是正常的,但是複製DB裡的raw data貼過去是錯的。不確定是哪個部分有問題,要找時間追一下。感謝回報 💯 |
Hey Eddie 你好,
今天要使用這個服務, 發現會把整篇文章都轉成一個 gist 的程式碼連結, 是 Medium 那邊規則有變動嗎?
The text was updated successfully, but these errors were encountered: