0x00 概述
對於開發來說,Windows 和 macOS 是更為常見和常用的系統,所以也很有必要了解在 Windows 和 macOS 中使用 Docker 的方法。很幸運的是,Docker 的官方對這兩個系統提供了強有力的支持,我們可以很輕松的在這兩個系統中運行 Docker。在這一小節中,我們就來了解一下 Docker 在 Windows 和 macOS 中安裝的方式以及運行的原理。
0x01 Docker Desktop
在大多數情況下,我們的開發工作是在 Windows 或 macOS 這兩個操作系統中進行的,既然 Docker 是我們用來解決開發、測試到運維整條產品線的工具,自然支持這兩個系統是不可或缺的功能。
如同封裝 Docker 為我們提供了輕松的虛擬化運行環境一樣,Docker 在 Windows 和 macOS 中的安裝也是極易完成的。Docker 官方為 Windows 和 macOS 系統單獨開辟了一條產品線,名為 Docker Desktop,其定位是快速為開發者提供在 Windows 和 macOS 中運行 Docker 環境的工具。
Docker Desktop 實現容器化與 Docker Engine 是一致的,這就保證了我們在 Windows 和 macOS 中開發所使用的環境可以很輕松的轉移到其他的 Docker 實例中,不論這個 Docker 實例是運行在 Windows、macOS 亦或是 Linux。
Docker Desktop 產品線包含兩個軟件,也就是針對 Windows 系統的 Docker for Windows 和針對 macOS 的 Docker for Mac。
0x02 安裝 Docker Desktop
在安裝 Docker for Windows 和 Docker for Mac 之前,我們依然要了解一下兩款軟件對操作系統及軟硬件的要求,只有達到了這些要求,我們才能順利的安裝上 Docker for Windows 和 Docker for Mac。
對於 Windows 系統來說,安裝 Docker for Windows 需要符合以下條件:
- 必須使用 Windows 10 Pro ( 專業版 )
- 必須使用 64 bit 版本的 Windows
對於 macOS 系統來說,安裝 Docker for Mac 需要符合以下條件:
- Mac 硬件必須為 2010 年以后的型號
- 必須使用 macOS El Capitan 10.11 及以后的版本
另外,虛擬機軟件 VirtualBox 與 Docker Desktop 兼容性不佳,建議在安裝 Docker for Windows 和 Docker for Mac 之前先卸載 VirtualBox。
在確認系統能夠支持 Docker Desktop 之后,我們就從 Docker 官方網站下載這兩個軟件的安裝程序,這里直接附上 Docker Store 的下載鏈接,供大家直接下載:
- Docker for Windows ( store.docker.com/editions/co… )
- Docker for Mac ( store.docker.com/editions/co… )
安裝 Docker for Windows 和 Docker for Mac 的方法十分簡單,按 Windows 或 macOS 常見的軟件安裝方式安裝即可。
0x03 啟動 Docker
像 Linux 中一樣,我們要在 Windows 和 macOS 中使用 Docker 前,我們需要先將 Docker 服務啟動起來。在這兩個系統中,我們需要啟動的就是剛才我們安裝的 Docker for Windows 和 Docker for Mac 了。
啟動兩個軟件的方式很簡單,我們只需要通過操作系統的快捷訪問功能查找到 Docker for Windows 或 Docker for Mac 並啟動即可。
打開軟件之后,我們會在 Windows 的任務欄或者 macOS 的狀態欄中看到 Docker 的大鯨魚圖標。
Docker for Windows 或 Docker for Mac 在啟動時,這只大鯨魚上的集裝箱會一直閃動,這說明 Docker 程序正在部署 docker daemon 所需要的一些環境並執行 docker daemon 的啟動。當集裝箱不再閃動,就說明 Docker 服務已經准備就緒,我們就可以在 Windows 和 macOS 中使用 Docker 了。
Docker Desktop 為我們在 Windows 和 macOS 中使用 Docker 提供了與 Linux 中幾乎一致的方法,我們只需要打開 Windows 中的 PowerShell 獲得 macOS 中的 Terminal,亦或者 Git Bash、Cmder、iTerm 等控制台類軟件,輸入 docker
命令即可。
使用 docker version
能夠看到 Docker 客戶端的信息,我們可以在這里發現程序運行的平台:
$ docker version Client: ## ...... OS/Arch: windows/amd64 ## ......
0x04 Docker Desktop 的實現原理
通過之前小節的介紹,我們知道 Docker 的核心功能,也就是容器實現,是基於 Linux 內核中 Namespaces、CGroups 等功能的。那么大體上可以說,Docker 是依賴於 Linux 而存在的。那么問題來了,Docker Desktop 是如何實現讓我們在 Windows 和 macOS 中如此順暢的使用 Docker 的呢?
其實 Docker Desktop 的實現邏輯很簡單:既然 Windows 和 macOS 中沒有 Docker 能夠利用的 Linux 環境,那么我們生造一個 Linux 環境就行啦!Docker for Windows 和 Docker for Mac 正是這么實現的。
由於虛擬化在雲計算時代的廣泛使用,Windows 和 MacOS 也將虛擬化引入到了系統本身的實現中,這其中就包含了之前我們所提到的通過 Hypervisor 實現虛擬化的功能。在 Windows 中,我們可以通過 Hyper-V 實現虛擬化,而在 macOS 中,我們可以通過 HyperKit 實現虛擬化。
Docker for Windows 和 Docker for Mac 這里利用了這兩個操作系統提供的功能來搭建一個虛擬 Linux 系統,並在其之上安裝和運行 docker daemon。
除了搭建 Linux 系統並運行 docker daemon 之外,Docker Desktop 系列最突出的一項功能就是我們能夠直接通過 PowerShell、Terminal 這類的控制台軟件在 Windows 和 macOS 中直接操作虛擬 Linux 系統中運行的 docker daemon。
實現這個功能得益於 docker daemon 對外提供的操作過程並不是復雜且領域性強的 IPC 等方式,而是通用的 RESTful Api 的形式。也就是說,Docker Desktop 只要實現 Windows 和 macOS 中的客戶端,就能夠直接利用 Hypervisor 的網絡支持與虛擬 Linux 系統中的 docker daemon 進行通訊,並對它進行控制。
這其實就是我們之前所提到 docker daemon 使用 RESTful Api 作為控制方式的優勢體現了。
0x05 主機文件掛載
控制能夠直接在主機操作系統中進行,給我們使用 Docker Desktop 系列軟件提供了極大的方便。除此之外,文件的掛載也是 Docker Desktop 所提供的大幅簡化我們工作效率且簡化使用的功能之一。
之前我們談到了,Docker 容器中能夠通過數據卷的方式掛載宿主操作系統中的文件或目錄,宿主操作系統在 Windows 和 macOS 環境下的 Docker Desktop 中,指的是虛擬的 Linux 系統。
當然,如果只能從虛擬的 Linux 系統中進行掛載,顯然不足以達到我們的期望,因為最方便的方式必然是直接從 Windows 和 macOS 里掛載文件了。
要實現我們所期望的效果,也就是 Docker 容器直接掛載主機系統的目錄,我們可以先將目錄掛載到虛擬 Linux 系統上,再利用 Docker 掛載到容器之中。這個過程被集成在了 Docker Desktop 系列軟件中,我們不需要人工進行任何操作,整個過程已經實現了自動化。
Docker Desktop 對 Windows 和 macOS 到虛擬 Linux 系統,再到 Docker 容器中的掛載進行了實現,我們只需要直接選擇能夠被掛載的主機目錄 ( 這個過程更多也是為了安全所考慮 ),剩下的過程全部由 Docker Desktop 代替我們完成。這相比於普通虛擬機軟件進行掛載的過程來說,完全不能用百倍效率來比較了。
0x06 配置 Docker Desktop
在我們使用 Docker Desktop 系列之前,我們還會簡單修改其的一些配置,以便更好的合理搭配操作系統與 Docker Desktop 系列軟件。
我們可以通過 Docker for Windows 或 Docker for Mac 的大鯨魚圖標打開配置頁面:在大鯨魚彈出的菜單中選擇 Settings ( Windows ) 或 Preferences ( macOS )。
打開 Docker for Windows 和 Docker for Mac 的配置頁面后,我們可以發現幾個配置頁面。這里我不逐一把每個頁面進行截圖了,大家可以自己動手查看頁面每個頁面的內容。
Docker for Windows 和 Docker for Mac 的配置項目較 Docker Engine 來說要多上許多,這主要是因為 Docker Desktop 是 Docker Engine 的超集,所以其不僅包含了 Docker Engine 的配置內容,還要包含諸如虛擬機實現等其他配置。
我這里抽出幾個與 Docker 相關的關鍵配置,分別簡單說明它們的作用:
6.1 文件系統掛載配置
在 Docker for Windows 的 Shared Drivers 面板,以及在 Docker for Mac 中的 File Sharing 面板中,包含了我們之前提到的將本機目錄掛載到 Hypervisor 里 Linux 系統中的配置。
6.2 資源控制配置
在 Advanced 面板中,我們可以調整 Docker 最大占用的本機資源。當然,更准確的說我們是在調整虛擬 Linux 環境所能占用的資源,是通過這個方式影響 Docker 所能占用的最大資源。
6.3 網絡配置
在 Docker for Windows 的 Network 面板,以及在 Docker for Mac 中的 Advanced 面板中,我們可以配置 Docker 內部默認網絡的子網等內容。這個網絡的作用以及更詳細的內容,我們會在之第 9 節中進行講解。
6.4 docker daemon 配置
在 Daemon 面板里,我們可以直接配置對 docker daemon 的運行配置進行調整。默認情況下,在 Daemon 面板里只有 Insecure registries 和 Registry mirrors 兩個配置,分別用來定義未認證鏡像倉庫地址和鏡像源地址。
我們可以點擊切換按鈕切換到 Advanced 模式,在這個模式下,我們可以直接編輯 docker daemon 的 daemon.json 配置文件,實現更具體、完整的配置 docker daemon 的目的。
0x07 低系統版本解決方案
Docker Desktop 系列為我們在 Windows 和 macOS 中使用 Docker 提供了巨大的便利,幾乎讓我們可以在數分鍾內搭建 Windows 和 macOS 中 Docker 的運行環境,並得到像 Linux 中使用 Docker 一樣的體驗。但 Docker Desktop 依然存在一定的局限性,其中最大的莫過於其對 Windows 和 macOS 的苛刻要求。雖然我們提倡保持操作系統的更新換代,以得到最新的功能以及更好的安全保障,但依然有很多情況下我們不得不使用低版本的 Windows 和 macOS。對於這種情況,Docker 官方也提供了相應的解決方案。
首先,讓我們來聊聊為什么 Docker for Windows 和 Docker for Mac 會對操作系統有如此嚴苛的要求。其實原因很簡單,剛才我們談到了,Docker for Windows 和 Docker for Mac 的實現分別依靠了 Windows 中的 Hyper-V 和 macOS 中的 HyperKit,而這兩個虛擬化工具只在高版本的 Windows 和 macOS 系統中才提供出來。
既然知道了原因,解決方案自然也就有了,既然我們不能利用 Hyper-V 或 HyperKit 來創建虛擬的 Linux 系統,那就找一個能夠替代它們的工具,用其創建虛擬 Linux 系統即可。
0x08 Docker Toolbox
Docker 官方為我們找到了用於搭建虛擬 Linux 系統的軟件,即 Oracle 的 VirtualBox,並以此封裝了另一個集成的 Docker 運行環境軟件:Docker Toolbox。
安裝 Docker Toolbox 的過程也十分簡單,下載安裝包並按常規軟件一樣安裝即可。這里直接我直接提供給大家 Docker Toolbox 安裝包的連接,方便大家下載。
- Docker Toolbox for Windows ( download.docker.com/win/stable/… )
- Docker Toolbox for Mac ( download.docker.com/mac/stable/… )
安裝完 Docker Toolbox 后,我們有幾項與 Docker for Windows 和 Docker for Mac 不同的使用方法需要注意。
由於不能很好的與系統以及 VirtualBox 互通結合,我們啟動、關閉、重啟 Docker 服務不能完全實現自動化,所以這里 Docker 為我們提供了 Docker QuickStart Terminal 這個工具來處理這些過程。換個方式說,我們必須通過它來啟動和操作 Docker,而不能再直接使用 PowerShell、Terminal 這類軟件了。
另外一個不便之處就是文件系統的掛載,由於 Docker Toolbox 無法直接操作 VirtualBox 實現掛載,所以這個過程需要我們人工來進行。整個掛載的方式與我們之前談到的一樣,區別只是需要我們手動操作。將本機目錄掛載到虛擬 Linux 系統中的配置在 VirtualBox 的 Settings 中,我們將本機需要掛載的目錄配置進去並保存即可。