"什麼是 Docker ?",網上有非常多的答案。
比較多的回答都會提到 "Docker" 借鑑了 "貨櫃" 思想。是說,沒有貨櫃的年代,碼頭貨運的物品經常會相互影響,比如食品和有毒物品裝一起,會導致食品受汙染。而 "貨櫃" 可以很好地實現貨物間隔離。
其實我們也可以說是借鑑了 "房地產" 思想。早期的智人,都是山洞裡群居,現在大家肯定無法接受,因為毫無隱私可言。
所以,"Docker" 的本質也可以說是解決了應用服務的 "隱私" 問題,實現進程、內存、文件、網絡之間相互隔離。
不過,對於 FE 同學而言,可以簡單把 Docker 理解成一種虛擬機就可以啦,很多應用服務可以像桌面軟體那樣一鍵安裝,免部署和環境配置啦。
1.1. FE 同學為什麼需要使用 Docker ?我覺得有這麼幾個點,對 FE 同學比較受益
對於 Full Stack 工程師。Docker 可以提供一種簡單輕便的伺服器編程環境,而且可以隨用隨刪、降低環境配置成本。
很多 FE 日常工作中需要跟 Nginx、MongoDB、MySQL 等伺服器應用打交道。用 Docker 可以很容易部署一個測試環境,學習和倒騰.
四叔說:不懂運維的攝影師不是個好前端。
1.2. Docker 的安裝各個平臺的 Docker 安裝可以參考官方文檔 https://docs.docker.com/v17.12/docker-for-mac/install/
簡單說下Mac 下的安裝,主要有兩個文件
2. 用前端思維分析 Docker與 Git 的相關資料類似,Docker 的很多資料和文檔都是講解大片大片的命令行,非常乏味枯燥。
但是問題來了,要是大家都用命令行,那還要前端工程師幹神馬?
所以,本文主要還是 GUI 工具來操作,體驗一下 Docker 的基本功能。
2.1. Docker GUI 工具Docker 官方提供的 Kitematic-Mac , 其實是基於 Electron + React 開發的,具備基本的操作功能,但是體驗比較一般。
今天我們主要使用 jetBrains 家的 IDE 中的 Docker 插件,簡單而又非常實用。
2.2. 使用 jetBrains Docker Plugin 安裝 Node首先,需要啟動 Docker
然後,使用 Docker Plugin 連接 Docker,安裝 Node
添加 "Node Image"
添加兩個 "Node Container"
實際上剛剛是這樣一個流程
這個流程很像 npm 安裝包的操作
從 "Registry" 上下載 "Node Image",官方的 "Registry" 就是 "Docker Hub"。跟 NPM 一樣,也可以使用第三方 "Registry" 或 鏡像
Node 的 Image 會在本地存儲一份緩存,以便重複利用。實際上 "yarn" 也是採用了類似的機制緩存安裝包。
使用 "Node Image" 創建了 2個 "Node Container",這兩個 "Container" 之間互相隔離互不影響
2.3. 理解 Docker 的三個基本概念在 Docker 中有三個概念
Container - 容器
Image - 鏡像
Registry - 倉庫
可以像下面這張圖來類比
"Container" 就是實際運行的應用服務,使用 "Image" 來描述依賴,而 "Registry" 上有大量公開的 "Image" 可以使用。
真的很像 NPM。
"Container" 和 "Image" 的依賴像下面這樣
2.4. 理解 Docker 的 CS 架構Docker 其實是一個 Client / Server 架構,常用的 Docker Client,就是 Docker CLI,通過命令行與 "Docker Daemon" 交互,對 "Container" 和 "Image" 進行操作。
因為 Docker 本身也提供了 RESTful API,所以也可以通過數據接口與 "Docker Daemon"操作,所以也可以按照接口實現不同的客戶端。
3. Docker 的常用操作Docker 提供了大量的接口可以操作 "Image"、"Container",很多功能其實並不常用,我們還是結合 GUI 工具,來看一些常見操作。
3.1 Container 的操作3.1.1. 創建一個 Container上面是創建一個容器的基本信息,最主要的當然是確定使用的 "Image"。
等效的命令是
docker run --name node1 node:latest
其他幾個比較重要的信息
Command : 決定 Container 啟動後運行的命令
Bind Ports : 用於綁定 Container 和宿主機器的埠映射。因為默認 Container 與外部是網絡隔離的,需要映射埠,外部才能訪問到 Container 中的服務
Bind Mounts : Container 中的讀寫層無法實現持久化,有點類似前端裡面的 SessionStorage, 想要持久化,要麼映射到宿主的文件系統,要麼需要映射到 卷(這是另外一個重要概念)
3.1.2. 埠映射上面的操作實現了
host:8080 => container:80
這樣通過宿主機的 8080 埠即可訪問到容器中的服務
3.1.3. Container 的其他操作其中,我們經常需要使用 Exec 進入容器進行交互操作。
3.2 Image 的操作我們主要是通過 Docker Hub 或其他 Registry 來下載 Image, 當然,我們也可以製作自己的 Image 發布到 Registry 中。不過自己製作 Image 超出了本文的分享範圍。簡單列一下幾個 GUI工具上的常見操作
4 Docker 實戰演示使用 ghost 搭建一個博客
參考 ghost docker 的配置說明,https://hub.docker.com/_/ghost/
將埠映射為 8080 上, ghost docker 默認是 2368
第一步:pull 鏡像
第二步:選擇鏡像
第三步:創建容器
訪問 http://localhost:8080/
當然,如果你會命令行就更好啦,其實只需要一句(😂)
docker run -p 8080:2368 --name ghost ghost:latest
5. 參考《Docker — 從入門到實踐》 - https://docker_practice.gitee.io/
《docker-cheat-sheet》 - https://github.com/wsargent/docker-cheat-sheet/tree/master/zh-cn
《Docker開發指南》(Using Docker Developing and Deploying Software with Containers)- 英 Adrian Mouat 著 - 人民郵電出版社
《Docker Engine API文檔》 - https://docs.docker.com/engine/api/v1.39/#