https://unsplash.com/photos/dyu466BfWj8
先前筆者因完成鐵人賽,得到了參加 2023 年 MWC 的免費資格。其中特別喜歡 Docker 工作坊,因為這是自己不熟悉,但在業界卻是常見的工具。這系列的幾篇文章,是想整理出後續的學習結果來分享。
此篇內容轉載自本人在 iThome 的文章。
一、Docker 介紹
讀者是否有安裝或運行軟體時,對於準備環境感到麻煩的經驗?例如前端程式可能需要 Node.js 環境;而後端的部份則需要 Java 環境。別忘了還有資料庫(如 MySQL、MongoDB、Redis),甚至有全文檢索引擎(如 Elasticsearch)等。
在電腦上逐一安裝軟體,不論是在工程師本地的 Windows / MacOS 電腦,還是開發中測試、正式測試或生產環境的 Linux 伺服器,總令人覺得麻煩。話雖如此,但這只是當有新同事報到、更換電腦,或是增設伺服器時,所做的一次性工作,並不是常常在處理的事情。
比較令人尷尬的,是真的在做時,遇到這些軟體在 A 電腦可以跑,在 B 電腦卻不順利的情形。更糟的情況是,工程師交付的程式碼,起初測試並無問題,卻在部署到生產環境才發生因環境而導致的錯誤,那就頭大了!
使用 Docker,能簡化從下載軟體到運行起來的過程,達到輕鬆部署的效果。且每個軟體皆有自己專屬的執行環境,因此就算換到另一台電腦,只要有裝 Docker,都能正常地運行。
二、映像檔與容器介紹
(一)概念
Docker 會將軟體程式以及運行時所需要的環境,打包在一個叫「映像檔」(image)的東西裡。軟體程式就像是前端 React 的網頁專案,或是後端 Spring Boot 的 JAR 檔。而對應的環境則為 Node.js 或 Java。讀者姑且可將映像檔想像成安裝程式。
使用映像檔,可建立出「容器」(container)。容器是軟體所運行的地方,且與原本的電腦環境是隔離的。舉例來說,假設我們在電腦上安裝了 Java 8,則在容器 A 中仍可運行要求 Java 11 的軟體。當然也能在容器 B 準備 Java 17 環境,並讓它們都在同一台電腦上跑。
看到這裡,讀者或許有個想法:「那一開始便在電腦上安裝 Java 17,這樣所有軟體不就能直接在電腦上運行了嗎?」關於這問題,請假想有軟體是使用低版本的 Java 8 語言所寫成,但有些用到的 library 到了較高版本的 Java 11 或 17,已經被棄用(deprecated)甚至移除了,那麼該軟體可能是無法運行。此為容器環境彼此隔離的好處!
(二)情境舉例
讓筆者以「露營車」為例子,來比喻映像檔與容器之間的關係。映像檔就像是露營車的設計圖(定義),裡面包含現有的床鋪、瓦斯爐、桌椅等設備。當我們做行前規劃時(製作映像檔),可能還會添加自己的寢具、廚具、食物等資源。
而容器就像露營車的實體,遊客則為運行的軟體。不論是在北部還是南部、平地還是山上的場地,只要設備與資源齊全,人就能很好地住在露營車裡。且 A 遊客的露營車環境,不會影響到 B 遊客。
若 Docker 容器和裡面的軟體能正常跑,則在其他電腦,理應也能好好地運行。這項特色被稱為「Build once, run anywhere」。
三、安裝 Docker Desktop
Docker 這項工具所採用的技術,是以 Linux 為基礎。因此使用 Windows / MacOS 電腦的我們,應該先安裝「Docker Desktop」,它也會額外在電腦上安裝 Linux 系統,而容器將在這個 Linux 上運行。
請在這裡下載 Docker Desktop:
https://www.docker.com/products/docker-desktop/
安裝後,可在命令提示字元執行 docker --version,確認是否偵測到 docker 指令,以及安裝的版本。
Docker version 24.0.6, build ed223bc
以下是 Docker Desktop 的映像檔清單,筆者曾經下載過數個映像檔,畫面供讀者參考。
筆者的電腦是 Windows 系統,到這邊為止,就算是完成 Docker 的安裝。下一篇文章開始,會開始介紹映像檔與容器的操作。
留言
張貼留言