---
# System prepended metadata

title: Docker

---

# Docker

## 目錄
* 小鯨魚的使用守則
    * Container
    * 撰寫有效率的DockerFile
    * Docker compose
    * 如何幫image瘦身
* 小鯨魚的背景故事
    * Network
    * Process
    * Control groups & Namespace

## 小鯨魚的背景故事
### Process
Container其實就是宿主機上面一種特殊的Procss，這個特殊的Process啟用多個Linux Namespace，使Container與其他環境隔離，比如創建新的PID Namespace，讓Container內部的PID是從1開始，另外這個Process所能夠使用的資源受到Cgroup所限制。

值得注意的是這代表Container其實是單進程的（後續新增的所有process都會以container的PID 1為parent process），所以你如果想在Container裡面同時執行兩個應用程式，就需要使用其他的程式來充當兩個應用程式的parent process(ex:pm2)。

>常常被問的問題：Container與虛擬機有什麼不同？

依樣畫葫蘆的回答：虛擬機上會有個名為Hypervisor的軟體去模擬Guest OS所需要的各種硬體，比如：CPU, momory, I/O等等，這樣我們在虛擬機裡面的時候看到當然也只會是他的文件與目錄。
相較之下Docker是使用Namespace來製造障眼法！


Q: Linux 是怎麼創建一個新的process?


TODO:
整理容器基礎、兩篇文章 

--> K8s Intensive \ 整理Docker使用守則\ Docker Network

--> Gogo
參考：
[DOCKER基础技术：LINUX NAMESPACE（上）](https://coolshell.cn/articles/17010.html)
