379 views
 owned this note
--- disqus: ncumcl --- Docker === ###### tags: `MCL Notebook` `Docker` `虛擬化` ## 用處 docker 是一個微型虛擬化的技術,現在對於這類技術有個專有名詞 **容器 (Container)** ### 虛擬化目的 常見的虛擬化目的有: - 獨立的環境 - 部分軟體一個系統只能有一個 - 硬體環境需求 - 只有一台電腦,想要做到多個功能,如: NAT、防火牆、私有網域 ### 傳統解決方式 (虛擬機)的限制 為了達到這些目的,過去都用虛擬機 (VM)的方式來提供,但花費的**資源過於龐大**,導致有些限制 - 使用者感受不好 - 回饋速度慢 - 啟動時間過長 - 執行效率低落 - 操作的介面不便 (當初的選擇) - 腳本化的快速部署困難 - 不易分享 - 硬體效能不夠 - 限制一台主機中可以虛擬化的最大上限 - 需要過於高級的硬體,成本過高 - 侷限於完全與一台真實機器相同的操作 - 為了解決當初的問題,卻也限制了發展 ### 現今的解決方式 (容器)的優勢 現在回來講我們的主題,容器的方式基本上解決了過去的那些限制,也因此現在才會這麼受歡迎,因此你可以當那些缺點,全都是容器的優點 - 使用者感受 - 資源 - **毫秒等級**的啟動時間 - 趨近於**原主機的執行效能** - 只有服務本身的記憶體花費 (不額外花費 kernel 所需的記憶體) - **MB 等級**的映象檔 (存放服務的地方) - 腳本設定即可配置網路拓譜 (**毫秒等級**的配置、全是虛擬化來的,**不需硬體花費**) - 資源使用改變方面造成的影響 - 普通的電腦可以配置**上千個**容器 - 方便分享 - 大型服務(多個服務交互溝通)虛擬化環境**快速部署**的可能 - 便於分享 - **安裝流程**、**啟動流程**、**啟動後的操作**,都可以用**腳本**的方式記錄 - 也就是你可以什麼都不會,只要有腳本,就**等於擁有服務** - 因為是虛擬出來的環境,所以**不會有安裝失敗**之類的問題要解決 (也就是建立了獨立的環境) - 腳本超級小 (byte 等級)、映像檔也很小 (MB等級) - Docker 官方還有做**分享平台** ## 相關知識 ### 背景知識 - 基本 Linux 指令 - Bash Script ### 建議背景知識 - 作業系統 - 如果想要知道原理 - Namespace、安全議題 - 如果想要進階操作 - 虛擬化 ### 其他議題 `LXC` `LXD` `CoreOS Rkt` `ClearContinaer` `HyperContainer` `(KataContainer)` ### 延伸議題 - 底層相關 - Docker 相關的 - `runc` `docker-shim` `containerd` - 推薦連結 - [簡單介紹各個之間的關係](https://www.cnblogs.com/sparkdev/p/9129334.html),建議先看這篇,再看下面那篇 - [帶領看 runc, docker-shim, containered, dockered 之間的溝通](https://ops.tips/blog/run-docker-with-forked-runc/) - 作業系統相關 - `Namespace` `AppArmor VS SELinux` `Seccomp` `Capability` `cgroups` - 虛擬機相關 - `runv` - gvisor - nvidia-docker - 相關工具 - `docker-compose` `docker-machine` `docker swarm` `Kubernetes (K8S)` `pipework` `OPNFV` ### 名詞解釋 #### 服務相關 - LXC - 容器介面的始祖,介面不好用 - LXD - 以容器的方式,做到虛擬機的使用 - CoreOS Rkt - Docker 的競爭對手,更注重容器是 APP 的理念設計 - ClearContinaer - 以 x86 晶片的特性,加強容器的安全性 - HyperContainer - 以虛擬機的方式,做到容器的使用 - (KataContainer) - 2017/12 Linux 基金會宣稱要做 - runc 與 runv 的整合系統 #### 系統層級工具 - docker-compose - 處理多個容器啟動很好用 - nvidia-docker - 如果要在容器中使用 GPU 需要使用這個 - docker-machine - 管理多台 docker 好用 - docker swarm - docker 原生的 Orchestrator - 多台 docker 整合成更大的 docker 服務 - Kubernetes (K8S) - 也是種 Orchestrator - Google 做的 - 目前比較推這個 - OPNFV - 拿 K8S 做 Network Function Virtualization Tools #### 底層工具 - pipework - 可以針對容器更改 / 新增網路介面 - runc - docker 底層中實際提供虛擬化的單元 - docker-shim - docker 底層中負責監控資源使用狀態 - containerd #### 系統層級 - Namespace - 系統中資源分割的功能 - AppArmor VS SELinux - 提升安全的工具 - Seccomp - 系統呼叫的檢查工具 - Kernel 提供 - Capability - 新種的權限配置 - Kernel 提供 - cgroups - 對於一個 Proecess 配置系統資源限制、系統資源監控 - Kernel Module 提供 # 教學正文 其實有許多[教學](https://philipzheng.gitbooks.io/docker_practice/content/basic_concept/image.html)教得很清楚,這邊重點提一下 ```graphviz digraph hierarchy { image [label="映像檔", fontcolor="red"] container [label="容器", fontcolor="red"] ter [label="沒運行的容器"] dockerfile [label="Dockerfile", fontcolor="red"] registry [label="倉庫", fontcolor="red"] null [label="丟棄"] image -> container [label="run", fontcolor="red"] dockerfile -> image [label="build", fontcolor="red"] container -> ter [label="stop"] ter -> container [label="start"] registry -> image [label="pull"] image -> null [label="rmi", fontcolor="red"] container -> null [label="rm", fontcolor="red"] } ``` 基本上重要的就圖上紅色的幾個功能與指令 ## 功能 ### 映像檔 (Image) 就當作一個安裝好系統的硬碟,裡面可以安裝需要的軟體,意思是需要什麼軟體,只需要有映像檔就啟動成容器使用 ### 容器 (Container) 就當一個虛擬機,只是用的是容器技術啟動,映像檔啟動後,就可以使用映像檔中裝好的軟體來使用 ### Dockerfile 安裝出映像檔的流程,可以給 docker 看,他就會幫我們自動化的安裝,出來的成品就是映像檔 ### 倉庫 (Registry) 存放映像檔的地方,可以放含有各種軟體的映像檔,需要什麼軟體,就只需要下載就好 ## 指令 ### build 由 Dockerfile 定義的流程安裝出需要的映像檔 ### run 把映像檔啟動,就當把拿個硬碟,其中含有我們需要的軟體,用這個硬碟開機,如果在系統中沒有找到這個硬碟,會去官方的倉庫問,有的話先抓回來 #### volume 使用 run 的時候,可以代 -v 的參數,表示把主機的某個資料夾,給容器當作資料夾用,原因在於 docker 在移除的時候,會把映像檔上其他檔案都刪除,所以要把主機的資料夾放上去,才不會被丟掉 ### rm 把不要的容器關機,並且移除 ### rmi 把不要的映像檔丟掉