1. Docker for Mac 是運行在 Hypervisor 上的 一個 HyperKit 實現,畢竟還是虛擬化加容器的實現方式,而不是內核級別的實現。(虛擬機) Docker for Mac不使用VirtualBox,而是使用HyperKit,一個輕量級的macOS虛擬化解決方案,它在MacOS 10.10 Yosemite及更高版本中的Hypervisor.framework中編譯。
2.docker是如何實現應用隔離的 -> docker是容器,它將所有的訪問文件和操作系統的api重新定向了,讓應用內感覺自己在一個獨立的操作系統上運行,而docker攔截了api調用,並且把那些全局的對操作系統的訪問進行了包裝,使得程序不會真的訪問它們。
3.docker是如何跨平台的 -> 在mac下運行docker實際上是先開啟了一個linux虛擬機,然后在虛擬機上運行docker。
4.宿主如果和容器系統不同的話,那不是和虛擬機一樣,一層層的調用,那么 Docker 和虛擬機還有什么差別?
要把 Windows 和 Linux 分清楚,更要把內核(kernel)和用戶空間(userland)分清楚。
容器內的進程是直接運行於宿主內核的,這點和宿主進程一致,只是容器的 userland 不同,容器的 userland 由容器鏡像提供,也就是說鏡像提供了 rootfs。
假設宿主是 Ubuntu,容器是 CentOS。CentOS 容器中的進程會直接向 Ubuntu 宿主內核發送 syscall,而不會直接或間接的使用任何 Ubuntu 的 userland 的庫。
這點和虛擬機有本質的不同,虛擬機是虛擬環境,在現有系統上虛擬一套物理設備,然后在虛擬環境內運行一個虛擬環境的操作系統內核,在內核之上再跑完整系統,並在里面調用進程。
還以上面的例子去考慮,虛擬機中,CentOS 的進程發送 syscall 內核調用,該請求會被虛擬機內的 CentOS 的內核接到,然后 CentOS 內核訪問虛擬硬件時,由虛擬機的服務軟件截獲,並使用宿主系統,也就是 Ubuntu 的內核及 userland 的庫去執行。
而且,Linux 和 Windows 在這點上非常不同。Linux 的進程是直接發 syscall 的,而 Windows 則把 syscall 隱藏於一層層的 DLL 服務之后,因此 Windows 的任何一個進程如果要執行,不僅僅需要 Windows 內核,還需要一群服務來支撐,所以如果 Windows 要實現類似的機制,容器內將不會像 Linux 這樣輕量級,而是非常臃腫。看一下微軟移植的 Docker 就非常清楚了。
所以不要把 Docker 和虛擬機弄混,Docker 容器只是一個進程而已,只不過利用鏡像提供的 rootfs 提供了調用所需的 userland 庫支持,使得進程可以在受控環境下運行而已,它並沒有虛擬出一個機器出來。