Container並不是輕量的VM,Container正確的來說是作業系統(OS)的"特殊進程",我們用GCP開台Ubuntu 16.04安裝Docker-CE來看看
sudo apt-get update
sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
接著用 ps -A | grep -n docker 看一下這台VM,只有dockerd就是docker的守護進程docker daemon,docker daemon負責通過Docker Server模塊接受Docker Client的請求,並在Engine中處理請求,然後根據請求類型,創建出指定的container
接著我們開一台容器 ubuntu:16.04
sudo docker run -it ubuntu:16.04 bash
這時再回VM看一下一樣使用 ps -A | grep -n docker
這時多了個進程名叫docker他的PID是5270,接著再進去ubuntu的docker容器看他有沒有省去OS
圖中可以看出來OS的file與lib都是在的,容器是有OS的file與lib,它所沒有的是OS的Kernel process,為了證明這件事我們在容器裡下ps -A
會發現只有兩個進程一個是ps一個是我們在前面docker run中下的bash,並沒系統進程在其中,我們回到VM下ps -A | wc -l計算進程數目
你會發現VM執行了110個進程,因為它是VM需要跑OS Kernel process,而Docker不用,有些喜歡追根究底的朋友可能會問docker沒有跑OS Kernel process也能Run進程那我裝OS要幹嘛?事實上底層還是有OS的假如你的Docker安裝在VM上Docker就是跑VM的Guest OS,裝在物理機上Docker就是跑物理機的Host OS,這裡來了個問題?我們能在Windows底下Run Linux VM那能不能在Windows底下Run Linux Container?不能!因為底層的OS Kernel是Windows Kernel process,同理我們也沒法在ubuntu 8.04上跑ubuntu 20.04的Container因為核心版本太舊了。