Docker是如何實現跨平台的等問題


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 庫支持,使得進程可以在受控環境下運行而已,它並沒有虛擬出一個機器出來。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM