[](https://hackmd.io/IkpxqvUGQEOyrkl4WQFcYQ)
###### tags: `教學` `Docker` `container`
# **Docker and Container** 000 - 準備
---
[TOC]
---
## 1. 虛擬機器與容器化 virtual machine & container
### 1.1. 虛擬化
- [**What is Virtualization?**- 從裸機到VM,到容器](https://medium.com/techmormo/what-is-virtualization-bare-metal-vs-virtual-machines-vs-containers-f3d8be22ad34)
- 是**一種資源管理技術**,是將電腦的各種[實體資源](https://zh.wikipedia.org/wiki/%E8%B3%87%E6%BA%90_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8) "資源 (計算機科學)")([CPU](https://zh.wikipedia.org/wiki/CPU "CPU")、[記憶體](https://zh.wikipedia.org/wiki/%E5%86%85%E5%AD%98 "記憶體")、[磁碟空間](https://zh.wikipedia.org/wiki/%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4 "磁碟空間")、[網路適配器](https://zh.wikipedia.org/wiki/%E7%B6%B2%E8%B7%AF%E9%81%A9%E9%85%8D%E5%99%A8 "網路適配器")等),予以抽象、轉換後呈現出來並可供分割、組合為一個或多個電腦組態環境。由此,打破實體結構間的不可切割的障礙,讓使用者可以比原本的組態更好的方式來應用這些電腦硬體資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的**虛擬化資源包括計算能力和資料儲存**。
:::info
**延伸閱讀**
- [何為虛擬化(zh)](https://www.redhat.com/zh/topics/virtualization/what-is-virtualization?dynamic404=zh)
- [新一代虛擬化簡易指南(en)](https://adarit.com/wp-content/uploads/2021/05/Next-Gen_Virtualization_FD_VMware_Special_Edition.pdf)
- [Simple Explanation of Virtualization](https://youtu.be/GeXwR32GCOw)
:::
---
### 1.2. 虛擬機器 Virtual Machine
- [虛擬機管理器(hypervisor)](https://zh.wikipedia.org/wiki/Hypervisor):作業系統藉此提供虛擬化技術,用來建立與執行虛擬機器的軟體、韌體或硬體。
---
### 1.3. 容器 Contianer
#### 不同的container
- OS container(LXC) 與 app container(Docker) 比較圖
- 
- OS Container:其實是一種概念
- App Container:(通常)一個container只會包一個應用程式或一個伺服器
- [參考來源](https://hiskio.com/courses/521/lectures/25589)
:::info
**延伸閱讀**
- [作業系統層虛擬化(en)](http://www.teimouri.net/operating-system-level-virtualization/#.WKIVR7YrJTZ)
:::
---
#### [LXC(Linux Containers)](https://zh.wikipedia.org/wiki/LXC):
- 一種[作業系統層虛擬化](https://zh.wikipedia.org/wiki/%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1%E5%B1%A4%E8%99%9B%E6%93%AC%E5%8C%96 "作業系統層虛擬化")(Operating system–level virtualization)技術,為[Linux核心](https://zh.wikipedia.org/wiki/Linux%E5%86%85%E6%A0%B8 "Linux核心")容器功能的一個[使用者空間](https://zh.wikipedia.org/wiki/%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4 "使用者空間")[介面](https://zh.wikipedia.org/wiki/%E4%BB%8B%E9%9D%A2_(%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88) "介面 (程式設計)")。
- 以namespace和cgroup來實現:namespace為資源的區別與隔離(讓 `namespace` 內部與 `host` 本身互相使用該資源卻不衝突),cgroup為資源的取用與限制。
- 它將應用軟體系統打包成一個軟體容器(Container),內含應用軟體本身的程式碼,以及所需要的作業系統核心和函式庫。
:::info
**延伸閱讀**
- [Introduction to Linux containers technology](https://github.com/osinstom/containers-impl-c)
:::
#### OCI (Open Container Initiative)
- Linux Foundation 所提出的計畫,主要是希望能夠**針對 Linux Container (容器) 制定一個基於作業系統層級的虛擬化開放標準**。[^first]
[^first]: [OCI (Open Container Initiative)](https://blog.tienyulin.com/open-container-initiative-oci/)
##### OCI的兩個主要規範
1. [Runtime Specification(運行標準)](https://github.com/opencontainers/runtime-spec):規範如何控制所謂的 `Container`, 包含了 `Container` 生命週期的操作(如`create/delete/start/stop` )或者是運行時期的互動(如 `attach/exec`),相關的參數都規範在裡面。
- 把應用程式和其所依賴的所有套件、檔案或設定一起封裝成可以獨立運作及移動到其他環境的格式。而封裝起來的檔案可以在任何一個符合此種格式檔案執行的環境下執行且不需要依賴額外的套件或檔案,也不在乎執行此檔案的機器和檔案內容。
2. [Image Specification(容器映像檔案標準)](https://github.com/opencontainers/image-spec)
:主要是在規範如何建立 Image(格式),詳見[^first]。
##### Container 的五大原則[^first]
1. 擁有**標準運作流程**:標準的 Container 要制定一組運作的流程,Container 可以被建立、啟動、停止;也可以被複製、備份;還要可以被下載、上傳。
2. **不管內容**是什麼都可以使用:Container 的內容不論是什麼,對於標準運作流程來說,執行的方式都是一樣的。
3. **不管機器的基礎架構**是什麼都可以運作:不論是伺服器、桌上型電腦、筆記型電腦等,只要機器上有支援 OCI 就可以運作。
4. 為了**自動化**而設計:因為有標準的運作流程,也不管內容和基礎架構是什麼,所以非常適合以自動化的方式來運作。
5. 工業級別的交付:藉由上述所提到的優點,標準的 Container 可以讓開發者們簡化流程並且自動化的交付開發完成的應用程式。
:::info
**延伸閱讀**
- [What are container runtimes?(en)](https://opensource.com/article/21/9/container-runtimes)
:::
---
### 1.4 (app)container容器
- 容器裡面有什麼?
- 
> (軟體)**容器是軟體部署的標準單位**,可包含不同的程式碼和相依性。 以此方式容器化軟體可讓開發人員和 IT 專業人員只需要一點修改或不需要任何修改,就能跨環境進行部署。
---
- Container容器
1. container是什麼?
* 包含應用程式、相依物件、函式庫、執行環境(code, runtime, libraries, packages, etc.)
* container技術是應用namespace和control groups(cgroups)的實現
* docker應用的是linux的container技術
1. 與vm的差異
* 容器是將[作業系統層虛擬化](https://zh.wikipedia.org/wiki/%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1%E5%B1%A4%E8%99%9B%E6%93%AC%E5%8C%96 "作業系統層虛擬化"),虛擬機器則是虛擬化硬體,因此容器更具有可攜式性、高效地利用伺服器。
---
## 2. Docker
>- Build and Ship any Application Anywhere
### 什麼是Docker
- **Docker 是一個 `Container` 的解決方案。是一個用於開發、傳送和運行應用程式的開放平台**。
- Docker 能夠將應用程式與基礎設施分開,以便可以快速交付軟體。使用 Docker可以像管理應用程式一樣管理基礎設施。通過利用 Docker 的快速交付、測試和部署代碼的方法,可以顯著減少編寫程式碼和在生產環境中執行程式碼之間的延遲。
- Docker 提供了在容器的鬆散隔離環境中打包和執行應用程式的能力。隔離和安全性允許在給定的主機上同時運行多個容器。
- 容器是輕量級的,包含執行應用程式所需的一切,因此無需依賴主機上當前安裝的內容。可以輕鬆共享容器,並確保共享的每個人都獲得以相同方式工作的相同容器。
- **Docker 提供工具和平台來管理容器的生命週期**:
- 使用容器開發您的應用程序及其支持組件(lib)。
- 容器成為分發和測試應用程式的單元。
- 準備就緒後,將應用程式作為容器或編排服務部署到生產環境中(無論是本地、雲端還是混合,都是一樣的。)
- 使用Docker這套方法/工具,可以讓我們很快速的應用相應的容器(container),佈建相應的程式。
##### 延伸閱讀
- [Docker簡介(AWS)](https://aws.amazon.com/tw/docker/)
- [Docker overview](https://docs.docker.com/get-started/overview/)
- [What is Docker?](https://medium.com/techmormo/what-is-docker-docker-made-easy-part-1-8cd5a0a26907)
---
### 部署類型
>- 從本機、虛擬機到容器
>- 不同類型的部署與差異

#### 在linux下的docker運作模式圖

---
---
## 3. 環境安裝
>- 由於docker中主要的容器技術來自linux(LXC),所以對於linux的
支援度最高,以下階以linux為使用場景。
>- windows和mac請參照官網[docker desktop](https://www.docker.com/get-started)
[新版指南](https://docs.docker.com/desktop/windows/)
### 0. 確認linux的版本
- 由於Docker只支援kernel版本3.10以上的Linux,可用 `$ uname -a` 檢查一下是x64且3.10以上,或是使用 `$ cat /etc/os-release`,查看目前linux版本 (如有必要)
### 1. [在Linux(centos)安裝docker](https://docs.docker.com/engine/install/centos/)
1. 卸載舊版本
```linux=
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
```
> The contents of `/var/lib/docker/`, including images, containers, volumes, and networks, are preserved. The Docker Engine package is now called `docker-ce`
---
2. 準備相關套件
```linux=
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
```
---
3. 安裝docker引擎
```linux=
$ sudo yum install docker-ce docker-ce-cli containerd.io
$ yum list docker-ce --showduplicates | sort -r,查看各個版本
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
ex:<VERSION_STRING> = 18.09.1
```

---
4. 啟動docker
```linux=
$ sudo systemctl start docker 或 $ service docker start
$ systemctl enable docker.service,設定開機自動啟動
--
$ sudo service docker stop,關掉docker engine
```
---
5. 確認狀況
```linux=
$ docker --version,查看dokcer版本
$ docker info,查看dokcer詳細內容
```
---
### 2. 第一個Docker image
```linux=
$ sudo docker images,查看現有的image
$ sudo docker pull hello-world,抓取hello-world這個image下來
$ sudo docker run hello-world,執行hello-world這個image
```
---

---
#### 卸載 Docker Engine
```linux=
1. 卸載 Docker Engine、CLI 和 容器化套件:
$ sudo yum remove docker-ce docker-ce-cli containerd.io
2. 刪除所有鏡像、容器和卷:
$ sudo rm -rf /var/lib/docker
$ sudo rm -rf /var/lib/containerd
```
---
## 4. 相關工具與資源
> 讓操作更方便
### 1. 工具
1. [VScode](https://code.visualstudio.com/)
- 可同時有終端機、資料夾檢視、拖拉檔案、各式檔案編輯等功能
- 建議安裝擴充功能:live share(分享別人的畫面), live server(分享畫面給別人), remote(可SSH)
- [使用VSCode Remote透過 SSH 進行遠端開發](https://hackmd.io/@brick9450/vscode-remote)
2. HackMD(筆記服務)
- [HackMD 快速入門教學](https://hackmd.io/s/quick-start-tw)
- [HackMD 開發故事](https://medium.com/starrocket/hackmd-product-story-1e332f83d343)
3. 其他
- [putty](https://www.putty.org/)
- [pietty](https://sites.google.com/view/pietty-project):改良後的putty
- [PieTTY:免費的SSH及Telnet client](http://claire-chang.com/2019/09/17/putty-%e5%85%8d%e8%b2%bb%e7%9a%84ssh%e5%8f%8atelnet-client/)
- [winSCP](https://zh.wikipedia.org/wiki/WinSCP)
### 2. 學習資源
- 線上討論區
- [討論區(discord)](https://discord.gg/TFFTQdk79D)
- 資源收集區(東西放在哪?)
- 完稿文件以hackmd為主
- 各種收集的訊息以discord為主
- repo或是其他檔案則放在github
- 其他資源
- google, youtube, stackoverflow
- 各家大廠(VMware, RedHat, ...)
- 討論區、媒體
- [iT 邦幫忙](https://ithelp.ithome.com.tw/)
- [網管人](https://www.netadmin.com.tw/netadmin/search.aspx?q=container&page=5)
---
### 3. 其他資源
* [鳥哥的 Linux 私房菜](http://linux.vbird.org/)
* [Linux Control Group 介紹](http://guildwar23.blogspot.com/2013/01/linux-control-group.html)
* [Red Hat Enterprise Linux Technical Overview](https://www.redhat.com/en/services/training/rh024-red-hat-linux-technical-overview?section=Skills+path)(免費的linux課程)
* [2021 年暑期「Linux 核心」課程](https://hackmd.io/@sysprog/linux2021-summer)
- [影片連結(youtube)](https://www.youtube.com/watch?v=aFHhkaZvo1o&ab_channel=.GUTS)
* [What is a Container?](https://www.docker.com/resources/what-container)
* [Linux常用指令](https://hackmd.io/@Hualiteq/HJBa_9TqO)
#### 附錄:各個單位/組織簡介
* [The Linux Foundation](https://www.linuxfoundation.org/)
* [Linux Professional Institute](https://www.lpi.org/)
* 提供Linux認證的機構
* [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/)
* Linux Foundation的一個項目,成立於2015年,旨在幫助推進容器技術並使技術行業圍繞其發展方向進行調整。
* [Red Hat(IBM)](https://www.redhat.com/):開發、販售Linux套件並提供技術服務
### 4. Docker認證
#### 1. DCA
- [Introducing the Docker Global Professional Certification Program(2017)](https://www.docker.com/blog/introducing-docker-global-professional-certification-program/)
- [Docker Certification](https://training.mirantis.com/dca-certification-exam/)
- [10 Best Docker Certifications in 2021 [Updated]](https://hackr.io/blog/best-docker-certification)
- [Docker Certified Associate Exam Preparation Guide (v1.5 October 2020)](https://github.com/Evalle/DCA)
#### 2. [Docker Captain](https://www.docker.com/community/captains)
>- 熱衷分享的docker專家:寫文章、出書、演講、舉辦研討會、創建課程、參與論壇、組織以及當地活動
>- 類似[微軟的MVP](https://zh.wikipedia.org/wiki/%E5%BE%AE%E8%BD%AF%E6%9C%80%E6%9C%89%E4%BB%B7%E5%80%BC%E4%B8%93%E5%AE%B6):具備一種或多種微軟技術專業知識,在微軟相關技術社群中貢獻突出的專家
>- 類似[Google的GDE](https://developers.google.com/community/experts):認可開發人員在某一個專業領域所鑽研的深度,以及他願意把這項專業透過各種方式分享或推廣給其它開發人員的熱情
- [Bret Fisher(youtube)](https://www.youtube.com/BretFisherDockerandDevOps)
---
#### kubernetes認證
:::info
1. CKA, The Certified Kubernetes Administrator
2. CKAD, The Certified Kubernetes Application Developer
3. CKS, The Certified Kubernetes Security Specialist
:::
<details>
1. CKA側重於K8S管理,CKAD側重於K8S開發 <br>
2. CKA一共180分鐘,25道題;CKAD一共120分鐘,20道題。<br>
3. 考試的網頁一半是試題,一半是 GateOne 的終端介面。<br>
4. 結束後,36個小時之內,CNCF會寄信告知成績。CKA分數大於74%則通過考試,CKAD分數大於66%則為通過考試,並且附件包含證書。<br>
5. 如果考試不通過,考生賬號上就會有一次一年內Free Retake的機會
6. CSK前必須已通過了CKA認證
</details>
- [How to Prepare for the CKA Exam](https://kube.academy/courses/how-to-prepare-for-the-cka-exam)
- [官網資源](https://kubernetes.io/zh/training/)
- [CKA/CKAD Information Collation](https://medium.com/@kcih4518/cka-ckad-information-collation-db45d264b8bd)
---
## 回顧
### Container
- [ ] 什麼是container?特點是什麼?
- [ ] 與VM的差異
- [ ] Docker的價值
---
## 課後複習/測驗
### Q3:容器的網路運作和虛擬機的網路運作有何不同?
面試官提出這樣問題的動機是,點出虛擬機網路與容器網路比較後所帶出的複雜性,對於具備虛擬化技術背景的人來說,了解如何使用Docker容器下的Port來開通服務,以及如何將靜態IP位址分配給容器,能夠區分容器與VM的使用方式是非常重要。表3條列出容器與虛擬機在網路運作方面的差異。
* 表3 容器與虛擬機網路運作的差異比較

**
### Q5:Docker是否可以在Linux、macOS和Windows上執行?
面試官之所以會提出這個問題,目的是找出面試者是否已在所有平台上使用過Docker。
最適當的回答是,可以在Docker容器中運行Linux和Windows程式的可執行檔,可原生執行在Linux(支援x86-64、ARM和其他CPU硬體架構)和Windows(x86-64)的Docker平台主機上(註三),Docker公司所推出的產品可讓使用者在Linux、Windows和macOS上建置並執行容器。舉例來說:
1. 若想在Linux上執行Docker,例如Ubuntu或Debian,可利用CLI指令來安裝:
* `$ curl -sSL https://get.docker. com / | sh`=> 針對穩定版本
* `$ curl -sSL https://test.docker. com/ | sh`=> 針對技術預覽版
2. 如果要在RHEL或CentOS上安裝Docker,可能需要先設定軟體儲存庫,然後下載必要的Docker執行程式。
3. 如果要在Windows 10上安裝Docker,則需要依照Docker for Windows網頁的安裝步驟。
4. 如果要安裝Docker for Mac,亦可選擇安裝Edge或Stable版本
```
---
YAML metas
---
```
註三:Windows版的Docker,可執行Windows Container和Linux Container(透過Hyper-V),而Linux和macOS(透過HyperKit)則是執行Linux Container,原則上無法跨架構平台混用,Linux無法執行Windows Container,詳細說明可參考官方網頁說明([https://docs.docker.com/install/)。](https://docs.docker.com/install/%EF%BC%89%E3%80%82)
---
:::info
LXC裡面的CGroups可控制各式資源,--memory-swap是其中一種,可在docker create或docker run時使用
:::
### Q33:何謂--memory-swap參數?
`--memory-swap`是一個修改用的參數,只有在同時設置了--memory時才會有作用,使用swap允許容器在容器耗盡所有可用的RAM時,將額外記憶體的需求寫入磁碟,對於經常要將記憶體交換到磁碟的應用程式,其執行效能會受到影響。
---
- [回到目錄](https://hackmd.io/@Hualiteq/r1lye3M3d)