[](https://hackmd.io/CHWfratfRWGz0Ykb1ShC6A)
###### tags: `教學` `Docker` `學習筆記` `Dockerfile`
# Docker and Container 001 - 基本介紹、指令
[TOC]
---
## 1. Docker基本介紹
- 脈絡、用途、架構(範圍/roadmap)
- Docker的特性
* Isolation:獨立性,container之間不會干擾
* Lightweight:輕量化 1. image很小。2. 運行起來很快。
* Simplicity:夠簡單
* Workflow:工作流程
* Community:社群
- Docker 是一個輕量級的虛擬化技術,屬於作業系統層虛擬化,可以讓應用程式部署在軟體容器下的工作自動化執行。Docker 的基礎是 Linux 容器(LXC)等技術。
- Docker 包括三個基本概念:
1. 映像檔(Image):Read only
1. 容器(Container):Instance from image
1. 倉庫(Registry):The same concept as Git, Store image files
2. Docker主要元素的關係 
### 特點
1. 簡化部署流程:將程式碼、環境安裝、安裝指令包成一包(程式部署包)
2. 跨平台部署:只要每個平台有docker,即可將部署包放置於其中進行部署。(藉由雲端的docker hub)
3. 建立乾淨測試環境:除了可將程式打包外,還可將資料庫打包,一起放在測試環境裡運行。


---
## 2. 官網可以幹嘛?
- [Docker官網](https://www.docker.com/get-started)
- 安裝
- 操作文件
- 說明文件QA
- [docker hub](https://hub.docker.com/)
- lab
- [docker lab](https://bday2021.play-with-docker.com/)
* [{ PHILIPZ } DOCKER LAB](https://philipz.github.io/tech/2016/07/28/welcome.html)
---
## 3. 名詞解釋
- **Layer**層: 一組唯讀的檔案或指令,呈現文件系統的變化,描述如何在容器設置底層系統。層與層之間相互堆疊。
- **Image**(鏡像、映像檔): 構成容器的基礎,為一不可變的層
- **Container**容器:將一可讀寫層加在映像檔的上方,使之成為一個可獨立執行應用程式的個體。
- **Registry**登錄檔、倉庫: 可以存放與調度映像檔的地方
- **Repository**儲存庫、專案: 可相容的映像檔集合,同一應用程式的不同版本。
- 參考資料:[Docker Commands — The Ultimate Cheat Sheet](https://medium.com/hackernoon/docker-commands-the-ultimate-cheat-sheet-994ac78e2888)
### 已廢棄
> 如果看到可注意,因為實際上應該是無法運行
- [docker-machine](https://docs.docker.com/machine/)
- [toolbox](https://docs.docker.com/toolbox/)
---
## 4. 常用指令
:::info
{%hackmd a9dxIburRI-V97Rc892gMw %}
:::
---
## 回顧
### Docker
- [ ] docker的特點
- [ ] docker可以幹嘛?
- [ ] 指令的長相
---
## 課後複習/測驗
### VM 與 Container 的比較與選擇
1. 考慮部署「線上環境」,VM 與 container 的選擇與比較,下列哪種描述「錯誤」?
- (A) Container 啟動速度比 VM 快。
- (B) Container 記憶體使用量比 VM 小。
- (C) 若過去是使用 VM,想改用 Container 就必須使用與 VM 一樣的作業系統建置,才能確保系統運作正常。
- (D) 上述 ABC 都正確。
- (E) 上述 ABC 都「錯誤」。
:::spoiler
- [題目來源](https://ithelp.ithome.com.tw/articles/10253334)
- 答案是:(C)
此題目要考慮下列兩件事:
1. 「考慮部署線上環境」,因此沒有環境一致的問題,只要考慮 VM 或 container 放到線上的選擇或比較即可。
2. 因情境是「考慮部署」與「VM 與 container 的選擇與比較」,因此是在討論 guest 而不是 host。
* A 與 B 很明顯正確,container 因為少了 OS 層,當然啟動速度與記憶體使用量,都相較 VM 來的有優勢。
* C 假設過去 VM 習慣使用 Ubuntu 或是任一種 OS,現在 container 是否必須要用相同的 OS 才能正常運行(VM 跟 Container 也可以交換反過來看)?答案當然是「非必要」的,如官方 [Redis image](https://hub.docker.com/_/redis/) 就提供了 Debian 和 Alpine 等選擇,即使作業系統不一樣,只要把程式或設定做好,系統一樣能正常運作。
* Container 用起來跟 VM 很類似,但要記得它們本質是不同的。而不管 VM 或 container 都得經過調校才能發揮最大的優勢。
:::
### Q1:列舉出Docker與虛擬主機的五個相似之處?
這是一個刁鑽的問題,大多數情況下,一開始面試官會詢問有關Docker與VM的常見問題,以逐步找出差異,但面試官可能會調整主題,以便點出VM與Docker容器相比較的類似之處。Docker與VM不盡相同,它使用Host主機的內核(Kernel),且無法啟動架構不同的作業系統。表1所示是Docker和Virtual Machine之間的五個相似之處。
* 表1 Edge Service Gateway中四種型態的大小與資源需求
:::spoiler

:::
### Q2:Docker與虛擬機之間的差異?
Docker與虛擬機的差異如圖1所示,表2所示為Docker容器與Virtual Machine之間的六個相異之處。

* ▲圖1 Docker與虛擬機之差異。
* 表2 Docker與虛擬機相異之處
:::spoiler

:::
---
### Q18:與Docker免費社群版本相比較,Docker企業版本有哪些獨特功能?
唯有在使用Docker企業版才能使用通用控制平台(Universal Control Plane,UCP)的圖形介面來管理Docker叢集和服務,且實作以下兩項功能:
- HTTP網狀式路由(Routing Mesh):
允許在多個服務之間共享相同的網路IP位址和埠號,根據客戶端的請求,UCP使用主機名稱和埠號之組合將網路流量繞送到適當的服務。
- 會話持續性(Session Stickiness):
允許在HTTP標頭中客製訊息,UCP可用於將後續請求繞送到同一服務任務,適用於需要有狀態會話的應用程式。
---
- [回到目錄](https://hackmd.io/@Hualiteq/r1lye3M3d)