Docker應用
TL;DRDocker 三大元素:映像檔(Image) 是 半成品冷凍食品 / 容器(Container) 是 成品熱食 / 倉庫(Repository) 是 Image 的 npm registry。Windows 安裝走 WSL 2 + Docker Desktop。VS Code 配 Docker extension + Dev Containers 是黃金組合。容器原理見 虛擬化技術介紹。
什麼是 Dockerhttps://philipzheng.gitbook.io/docker_practice/introduction/what
Docker 介紹
Docker 是一個應用容器開發和發布的開源平臺。它允許您將應用程式與其所需的環境(如作業系統、程式庫和其他依賴項)打包在一個單獨的容器中,並在不同的平臺上進行部署和執行。這樣,您就可以確保您的應用程式在不同的環境中都能夠適當地執行。
通常,您可以使用 Docker 執行以下步驟:
-
安裝 Docker 客戶端:您需要先安裝 Docker 的客戶端,以使用 Docker 的命令列工具。
-
執行 Docker 容器:您可以使用 Docker 的命令列工具執行容器,如 docker run。
-
部署應用程式:您可以將您的應用程式打包在 Docker 容器中,然後在容器中部署它。
-
管理容器:您可以使用 Docker 的命令列工具管理容器,如檢視容器的狀態、停止容器等。
Docker可以做甚麼
Docker 可以做什麼?
-
一致性的釋出環境讓開發和釋出有統一的標準環境,這有利於持續性整合與釋出continuous integration and continuous delivery (CI/CD) 工作流程。開發者撰寫程式碼,並執行在開發者的電腦的容器中,而其它部門也使用容器執行他們的應用程式。當所有的應用程式協同運作、測試都沒問題後,就可以釋出在同樣讓容器執行的正式環境中。若在測試中有任何容器內的程式有錯誤,只要修正部分程式碼,又可以快速的重新整合後釋出。
-
**可攜性釋出和按需式縮放(scaling)**容器可以容易地執行在不同的環境,像是開發者電腦、虛擬機器、雲端環境或是雲端和本地的混合環境。因為容器的可攜性和輕量級地執行,我們可以輕易的按照商業需求擴張和縮小應用程式的實體數量。
-
在同一臺機器執行更多的工作容器提供輕量級的沙盒環境,在同一臺機器可以執行多個容器共享硬體資源,不像虛擬機器需要模擬整個主機,它所需要的資源更多。
-
基礎設施即程式碼(Infrastructure as Code)及軟體定義網路Docker 的架構中提供 REST API 和客戶端 Docker CLI 來控制 Docker 物件,像是:images、containers、networks和 volumes。因此,各個容器的協同運作、網路、檔案系統都是可以被軟體定義、控制,像是用 Docker Compose File 和 Swarm。舉個實務上常常看到的例子:
-
程式碼修改網頁伺服器應用程式所監聽的 port 和掛載它所需的資料。
-
程式碼控制應用程式副本的縮放。
-
因為程式碼控制基礎設施,所以程式碼可以儲存基礎設施的設定也可以進行版本控制。
Docker的三大元素- 映像檔Image、容器Container、倉庫Repository。
映像檔 Image
Docker 映像檔是一個模板,用來重複產生容器實體。例如:一個映像檔裡可以包含一個完整的 MySQL 服務、一個 Golang 的編譯環境、或是一個 Ubuntu 作業系統。
透過 Docker 映像檔,我們可以快速的產生可以執行應用程式的容器。而 Docker 映像檔可以透過撰寫由命令列構成的 Dockerfile 輕鬆建立,或甚至可以從公開的地方下載已經做好的映像檔來使用。
舉例來說,如果我今天想要一個 node.js 的執行環境跑我寫好的程式,我可以直接到上 DockerHub 找到相對應的 node.js 映像檔 ,而不需要自己想辦法打包一個執行環境。
容器 Container
就像是用蛋糕模具烤出來的蛋糕本體,容器是用映像檔建立出來的執行例項。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離、保證安全的平臺。
可以把容器看做是一個執行的應用程式加上執行它的簡易版 Linux 環境(包括 root 使用者許可權、程式空間、使用者空間和網路空間等)。
另外要注意的是,Docker 映像檔是唯讀(read-only)的,而容器在啟動的時候會建立一層可以被修改的可寫層作為最上層,讓容器的功能可以再擴充。這點在下面的例項會有更多補充。
倉庫 Repository
倉庫(Repository)是集中存放映像檔檔案的場所,也可以想像成存放蛋糕模具的大本營。倉庫註冊伺服器(Registry)上則存放著多個倉庫。
最大的公開倉庫註冊伺服器是上面提到過的 Docker Hub,存放了數量龐大的映像檔供使用者下載,我們可以輕鬆在上面找到各式各樣現成實用的映像檔。
而 Docker 倉庫註冊伺服器的概念就跟 Github 類似,你可以在上面建立多個倉庫,然後透過 push、pull 的方式上傳、存取。
Window系統安裝Docker
Manual installation steps for older versions of WSLFor simplicity, we generally recommend using the wsl --install to install Windows Subsystem for Linux, but if you're running an older build of Windows, that may not be supported. https://learn.microsoft.com/en-us/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
遇到問題 Manual installation steps for older versions of WSL 舊版 WSL 的手動安裝步驟
什麼是 Windows 子系統 Linux 版?
適用於 Linux 的 Windows 子系統可讓開發人員執行 GNU/Linux 環境 (包括大部分的命令列工具、公用程式和應用程式),直接在 Windows 上執行,不需進行修改,不會造成傳統虛擬機器或 dualboot 設定的額外負荷。
關於Windows 子系統 Linux 版的常見問題Windows 子系統 Linux 版 (WSL) 是 Windows 作業系統的功能,可讓您執行 Linux 檔案系統,以及直接在 Windows 上執行 Linux 命令列工具和 GUI 應用程式,以及傳統的 Windows 桌面和應用程式。 如需詳細資訊,請參閱 關於頁面 。 這主要是適用於開發人員的工具,特別是 Web 開發人員、處理開放原始碼專案或部署至 Linux 伺服器環境的工具。 WSL 適用於喜歡使用 Bash、一般 Linux 工具 (、 awk 等等、) 和 Linux 優先架構的 sed 任何人, (Ruby、Python 等等 ) ,但也喜歡使用 Windows 生產力工具 WSL 可讓您在 Bash 殼層中,選擇散發套件 (Ubuntu、Debian、OpenSUSE、Alpine、Alpine https://learn.microsoft.com/zh-tw/windows/wsl/faq
什麼是 WSL 2?
什麼是Windows 子系統 Linux 版適用於 Linux 的 Windows 子系統可讓開發人員執行 GNU/Linux 環境 (包括大部分的命令列工具、公用程式和應用程式),直接在 Windows 上執行,不需進行修改,不會造成傳統虛擬機器或 dualboot 設定的額外負荷。 您可以: 從 Microsoft Store 選擇您最愛的 GNU/Linux 散發套件。 執行一般的命令列工具,例如 grep、sed、awk 或其他 ELF-64 二進位檔。 執行 Bash 命令介面指令碼和 GNU/Linux 命令列應用程式,包括: 使用自己的 GNU/Linux 散發套件管理員安裝其他軟體。 使用類似 Unix 的命令列命令介面來叫用 Windows 應用程式。 在 Windows 上叫用 GNU/Linux 應用程式。 直接整合至 Windows 桌面的GNU/Linux 圖形化應用程式 使用 GPU 加速 進行機器學習、資料科學案例等等 WSL 2 是「Windows 子系統 Linux 版」架構的新版本,可讓 Windows 子系統 Linux 版在 Windows 上執行 ELF64 Linux 二進位檔。 其主要目標是 增加檔案系統效能,以及新增 完整的系統呼叫相容性 。 這個新架構會變更這些 Linux 二進位檔與 Windows 和您電腦硬體的互動方式,但仍然提供與 WSL 1 (目前廣泛可用的版本) 相同的使用者體驗。 您可以使用 WSL 1 或 WSL 2 架構來執行個別的 Linux 發行版本。 每個發行版本都可隨時升級或降級,而且您可以並存執行 WSL 1 和 WSL 2 發行版本。 WSL 2 使用全新的架構,可從執行真實的 Linux 核心中受益。 https://learn.microsoft.com/zh-tw/windows/wsl/about
WSL 2 是「Windows 子系統 Linux 版」架構的新版本,可讓 Windows 子系統 Linux 版在 Windows 上執行 ELF64 Linux 二進位檔。 其主要目標是增加檔案系統效能,以及新增完整的系統呼叫相容性。
這個新架構會變更這些 Linux 二進位檔與 Windows 和您電腦硬體的互動方式,但仍然提供與 WSL 1 (目前廣泛可用的版本) 相同的使用者體驗。
您可以使用 WSL 1 或 WSL 2 架構來執行個別的 Linux 發行版本。 每個發行版本都可隨時升級或降級,而且您可以並存執行 WSL 1 和 WSL 2 發行版本。 WSL 2 使用全新的架構,可從執行真實的 Linux 核心中受益。
取代Hyper - V
跟上一個版本相比,WSL 2 有了重大的改進。WSL 1 使用了一個轉譯層(translation layer)來轉換 Linux 與 Windows 底層的系統呼叫(system calls),而 WSL 2 已經不再需要這個轉譯層,因為它有了自己的 Linux 核心,而這個核心是執行於一個輕巧版本的 Hyper-V hypervisor 之上。這表示 WSL 2 無論在啟動和執行方面的速度都會比 WSL 1 快很多,而且將來我們可以直接更新 Linux,而不用等微軟的 WSL 團隊推出新版的轉譯層。
使用 Winget 安裝 PowerShell (建議) ⇒ 更新PowerShell版本到7.0
要我們使用power shell去更新WSL 2
結果還遇到power shell版本要先更新問題
在 Windows 上安裝 PowerShell - PowerShell有多種方法可以在 Windows 中安裝 PowerShell。 每個安裝方法的設計都支援不同的案例和工作流程。 選擇最符合您需求的方法。 Winget - 在 Windows 使用者端上安裝 PowerShell 的建議方式 MSI 套件 - Windows Server 和企業部署案例的最佳選擇 ZIP 套件 - 最簡單的「側載」或安裝多個版本的方式針對 Windows Nano Server、Windows IoT 和 Arm 型系統使用此方法 . https://learn.microsoft.com/zh-tw/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3
Winget 是 Windows 封裝管理員一種命令列工具,可讓使用者探索、安裝、升級、移除及設定 Windows 使用者端電腦上的應用程式。 此工具是 Windows 封裝管理員服務的使用者端介面。 winget命令列工具預設會與Windows 11和新式版本的 Windows 10 搭配使用,作為應用程式安裝程式。
注意
如需系統需求和安裝指示的清單,請參閱 winget 檔 。 Winget 目前不會在 Windows 伺服器上執行。
您可以透過下列命令使用已釋出的 winget 套件來安裝 PowerShell:
搜尋最新版的 PowerShell
winget search Microsoft.PowerShell
搜尋後的結果
Name Id Version Source
--------------------------------------------------------------
PowerShell Microsoft.PowerShell 7.3.2.0 winget
PowerShell Preview Microsoft.PowerShell.Preview 7.4.1.0 winget
使用 id 引數安裝 PowerShell 或 PowerShell Preview
winget install --id Microsoft.Powershell --source winget
winget install --id Microsoft.Powershell.Preview --source winget
注意
在使用 X86 或 X64 處理器的 Windows 系統上, winget 安裝 MSI 套件。 在使用 Arm64 處理器的系統上, winget 安裝 Microsoft Store (MSIX) 套件。 如需詳細資訊,請參閱 從 Microsoft Store 安裝。
之後就會多出來
Adminstrator: PowerShell 7
舊版 WSL 的手動安裝步驟
舊版 WSL 的手動安裝步驟為了簡單起見,我們通常會建議使用 wsl --install 來安裝Windows 子系統 Linux 版,但如果您執行較舊的Windows組建,可能不受支援。 我們已包含下列手動安裝步驟。 如果您在安裝程式期間遇到問題,請檢查 疑難排解指南的安裝區段 。 您必須先啟用「Windows 子系統 Linux 版」選用功能,然後才能在 Windows 上安裝任何 Linux 發行版本。 以系統管理員身 分開啟 PowerShell ([開始] 功能表 > PowerShell > ,以滑鼠右鍵按一下 > [以系統管理員身分執行]) ,然後輸入下列命令: dism. https://learn.microsoft.com/zh-tw/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
更新完成後,可以來更新我們的
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
之後按造文章走即可
透過 Visual Studio Code 去開發 - 推薦外掛
若要開始使用 Docker 搭配 WSL 2 開發應用程式,建議您使用 VS Code 以及 WSL、Dev Containers 和 Docker 擴充功能。
-
安裝 VS Code WSL 擴充功能。 此延伸模組可讓您開啟在 VS Code 中 WSL 上執行的 Linux 專案, (不需要擔心路徑問題、二進位相容性或其他跨作業系統挑戰) 。
-
安裝 VS Code Dev Containers 擴充功能。 此延伸模組可讓您在容器內開啟專案資料夾或存放庫,利用Visual Studio Code的完整功能集,在容器內執行開發工作。
-
安裝 VS Code Docker 擴充功能。 此延伸模組會新增功能,以從 VS Code 內部建置、管理及部署容器化應用程式。 (您需要開發容器擴充功能,才能實際使用容器作為開發環境。)
操作Docker
"docker run" 是 Docker 的命令,它用來啟動容器。
-d 引數列示在後臺執行容器。
-p 8888:80引數是將容器的 80埠對映到本地主機的 8888埠。也就是說,您可以透過本地主機的 8888埠來存取容器中的服務。
thumbororg/thumbor 是要啟動的映象名稱。
可以為容器命名。您可以在指令後面加上 "--name <containers-name>" 來為容器命名。
例如:
docker run -p 8888:80 --name thumbor minimalcompact/thumbor
當你在主機上執行 Docker 容器時,Docker 容器可以透過主機上的 IP 地址和指定的對映埠進行訪問。因此,如果你的主機有固定 IP,則外部可以使用 http://<host-ip>:<mapped-port> 的方式訪問 Docker 容器中的服務,以進行串接。
在你的例子中,對於服務 thumbor,你將 Docker 容器內的 80 埠對映到主機上的 8888 埠,因此外部可以使用 http://<host-ip>:8888 進行訪問。