容器為什麼很重要?

已完成

在本單元中,您將遵循 Tailspin 小組,討論其 DevOps 程式所需的一些改進。 在此案例中,小組會使用 Docker,將 Web 應用程式容器化, 然後再更新 CI/CD 管線為其提供支援。

這個狀況持續了幾星期

Tailspin 過去幾週過得很辛苦, 由於許多原因,Teams 難以滿足期限,而且公司生產力一直備受關注。 Andy 召集了 Space Game 網站小組的一些重要專案關係人,並收集了意見反應,向管理部門提出簡報。

Andy:謝謝大家撥冗出席, 我知道過去幾個星期大家都很辛苦,但我有一些好消息要宣布。 管理部門明天將舉辦一場異地會議,徵集大家對改變現況以提高效能的建議。 他們邀請我就成功的 DevOps 個案研究提出簡報,並表示對我們可能提出的任何其他想法都抱持開放態度。 我希望我們能利用這場會議集思廣益。 誰想先發言?

大家看著 Amita。 她最近受到的打擊特別嚴重。

Amita:我先。 如您所知,我測試多個小組,而且可能會很困難,因為每個小組都使用自己的技術堆疊。 即使它們使用相同的基礎平臺,例如 .NET 或 Java,它們通常也會以不同的版本為目標。 我覺得我有時候花了大半天的工夫,就只是為了弄出一個能讓要測試的程式碼可以執行的測試環境。 有問題出現時,都很難分辨究竟是程式碼有錯誤,還是我不小心把版本設成 4.2.3 而不是 4.3.2。

Andy 在白板上寫下「QA 的相依性版本控制困難」。

Tim:我想針對這個問題再補充作業問題。 我們有幾個小組有獨特的版本需求,所以必須在自己的虛擬機器上發佈應用程式,以確保版本和元件需求不會和其他應用程式發生衝突。 除了維護額外 VM 集所需的額外負荷之外,若這些應用程式可以並存執行,還會花費更多成本。

Andy 在白板上寫下「因使用 VM 解決應用程式隔離引致的額外負荷」。

Mara:我有一些關於開發端的問題。 幾個星期前,我在自己的電腦上處理點對點更新系統,本來一切都很順利。 但部署之後,卻不能在生產環境中運作。 我忘了要在服務中開啟連接埠 315。 我們花了一天的時間疑難排解,才找出問題。 在生產環境開啟該連接埠後,一切就如預期運作了。

Andy 在白板上寫下「部署階段間的設定不一致」。

Andy:我覺得這次的討論是很好的開端。 我會好好研究這些問題,看看可以怎麼處理。 以下是我聽到的問題:

  • QA 的相依性版本控制困難
  • 因使用 VM 解決應用程式隔離引致的額外負荷
  • 部署階段間的設定不一致

所有項目放在一起 (放在一個容器中)

隔天早上,Andy 召開會議向小組提出新的想法。

Andy:我昨天和一些同仁討論了現在面臨的挑戰,他們提出了一些有趣的建議。 我覺得可以試試 Docker。 這是一種將所有應用程式封裝為容器的技術。

Amita:容器是什麼? 和 .zip 檔案一樣嗎?

Andy:不完全一樣。 比較像是輕量型虛擬機器,專門設計用於直接在主機作業系統上執行。 在建置專案時,輸出就是包含軟體及其相依性的容器。 但卻不是完整的虛擬化系統,所以啟動時間低於一秒。

Tim:容器如何處理安全性和隔離?

Andy:安全性和隔離是由主機作業系統處理。 當容器在主機處理序中執行時,容器會與同一部主機電腦上的其他處理序隔離。 隔離之後,無論其他容器在執行什麼工作,容器都能載入所需的任何元件版本。 這也表示我們可以在同一部主機中,同時輕鬆執行多個容器。

Amita:聽起來很適合在生產環境使用,但能解決管線前期遇到的挑戰嗎?

Andy:當然可以! 雖然不能傳送原始程式碼或一組二進位檔,但整個容器會成為成品。 這表示 Mara 可以一邊執行開發作業,一邊在本機對裝載在電腦上的容器執行偵錯工作階段。 當 Amita 進行測試時,可以對相同容器的複本進行測試,而該複本已包含所有必要的相依性版本。 當 Tim 管理我們的生產環境時,他監視的容器就是由 Mara 開發且經 Amita 測試的同一個容器獨立複本。

Mara:開發容器應用程式有多困難? 現有的程式碼必須進行重大變更嗎?

Andy:容器更接近封裝和部署技術。 對我們撰寫的基本軟體沒有影響。 我們只要在建置結束時,指示工具產生 Docker 容器就可以了。 然後,當我們偵錯時,應用程式會用完該本機容器,而不是本機 Web 伺服器。 事實上,像 Visual Studio 之類的工具,可讓我們在 Docker 和 IIS Express 這類的偵錯環境中切換,獲得我們所需要的彈性。 我昨晚建立了網站專案的分支並加以轉換,建置成 Docker 容器測試流程。 我只需要新增一些基本的容器設定,不需要變更任何現有的程式碼。

Mara:這真是個好消息。 我猜,我們甚至可以從你的分支用 Azure Pipelines 更新發行管線,建置和部署 Docker 版本。

Andy:我就是這個打算。

什麼是 Docker?

Docker 這項技術可以自動化可攜式自助容器的封裝和部署流程。 Docker 容器可以在找到 Docker 主機的任何位置執行,無論是在開發機器、部門伺服器、企業數據中心或雲端上。 Azure 提供多種方式來執行容器型應用程式,包括在 App Service 中,或作為使用協調流程技術 (例如 Kubernetes) 管理的叢集一部分。

Tailspin 小組為此案例選取了 Docker 容器,因為這符合其所有需求:

  • QA 的相依性版本控制挑戰:應用程式會封裝為容器,以為其帶來正確版本的相依性。

  • 因使用 VM 解決應用程式隔離所造成的額外負荷:許多隔離的容器可以在相同的主機上執行,並具有虛擬機的優點,包括更快的啟動時間,以提升資源效率。

  • DevOps 階段之間的設定不一致:容器隨附的指令清單會自動化設定需求,例如需要公開哪些埠。

採用 Docker 容器是邁向微服務架構的關鍵步驟。 我們稍後會進一步討論這一點。

檢定您的知識

1.

下列哪一個選項不是使用 Docker 的好理由?

2.

容器與虛擬機器有何相似之處?

3.

移轉現有 .NET Core 應用程式,以使用 Docker 容器,會增加多少額外負荷?