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
把不要的映像檔丟掉