如果容器沒有來賓作業系統,為什麼我們要使用帶有 Docker 的作業系統基礎映像?
我剛剛開始學習 Docker,有些事情讓我很困惑。正如我在 Docker 網站上所讀到的,容器與虛擬機不同。據我了解,容器只是一個沙箱,在其中執行整個隔離的文件系統。
我還讀到容器沒有安裝來賓作業系統。相反,它依賴於底層作業系統核心。
這一切都很好。我感到困惑的是,有一些以作業系統命名的 Docker 鏡像。我們看到 Ubuntu、Debian、Fedora、CentOS 等鏡像。
我的觀點是:這些圖像是什麼,真的嗎?基於 Debian 映像創建容器與創建虛擬機並安裝 Debian 有何不同?
我認為容器沒有安裝來賓作業系統,但是當我們創建圖像時,我們將它們基於以某個作業系統命名的某個圖像。
此外,在我看到的範例中
docker run ubuntu echo "hello world"
,似乎我們正在使用 Ubuntu 啟動 VM 並使其執行命令echo "hello world"
。以同樣的方式,我們
docker run -it ubuntu /bin/bash
似乎正在使用 Ubuntu 啟動虛擬機並使用命令行訪問它。無論如何,那些以作業系統命名的圖像是什麼?使用其中一個映像執行容器並使用相應的來賓作業系統啟動 VM 有何不同?
是不是我們只是與主機作業系統共享核心(因此我們可以訪問底層機器硬體資源,而不需要虛擬化硬體),但仍然按順序使用容器上每個不同系統的文件和二進製文件支持我們想要執行的任何應用程序?
由於所有 Linux 發行版都執行相同的(是的,它有點簡化)Linux 核心並且僅在使用者態軟體上有所不同,因此很容易模擬不同的發行版環境——只需安裝該使用者態軟體並假裝它是另一個發行版。具體來說,在 Ubuntu OS 中安裝 CentOS 容器意味著您將從 CentOS 獲得使用者空間,同時仍然執行相同的核心,甚至不會執行另一個核心實例。
所以輕量級虛擬化就像在同一個作業系統中擁有獨立的隔間。相反,真正的虛擬化是在主機作業系統中擁有另一個成熟的作業系統。這就是為什麼 docker 不能在 Linux 中執行 FreeBSD 或 Windows 的原因。
如果這樣更容易,您可以認為 docker 是一種非常複雜和高級的 chroot 環境。