虛擬化明星 深挖輕量級容器docker

2022-07-04 10:00:21 字數 2583 閱讀 2790

docker是乙個輕量級容器,屬於作業系統層面的虛擬化技術,封裝了檔案系統(aufs)以及網路互聯,程序隔離等特性。

傳統虛擬化架構:

docker虛擬化架構:

docker庫的架構: docker registry -> docker repository -> docker image

docker 

registry相當於乙個郵輪,repository則是郵輪上的貨櫃,image就是貨櫃內部的系統映象。

docker的最小單元為image,docker image是唯讀的,不支援修改,因此當你看上去修改了乙個docker image,哪怕是只改了它的名字,docker的真實操作卻是複製出來乙份列在下面,原來的仍舊被保留。同時為便於檔案管理,docker image 可以通過命令被export為tar包存在本地任何位置,也可以import tar包成為本地的image。

注意:docker只是提供了乙個環境,這個概念是獨特的,其他虛擬機器是乙個完全隔離開的封閉的就像乙個完整的物理機那樣,而docker的使用者獲得的是乙個基於通用os上面的乙個相同的環境,只要使用相同的image,docker能執行起來,那麼環境就是一致的。目前docker已經可以支援幾乎所有流行的os,它並不限制os的種類、版本,這就使docker變成了跨平台技術,避免了使用者環境變化導致的bug。

docker container 是 docker image 的例項化。

docker提供的這個環境,可以達到如乙個純淨os的效果,可對其進行具體的操作,如安裝新的包,檔案變更等。而上文提到了,docker的image是唯讀,不支援修改image本身,那麼這個環境變更真的不是對image進行操作嗎?

答:確實不是的,docker的檔案系統是aufs,當我們對image進行修改的時候,表面上是進入那個container容器內部,然後做安裝命令,檔案變更等修改,其實這些變更並不是發生在像傳統虛擬系統那樣在容器內部,而是在外部!docker container並不是乙個封閉獨立的空間。

這些變更是存在於本地檔案路徑/var/lib/docker/aufs/下,每次與原image不同的修改都會放在該目錄中。然而docker也提供了修改這個預設目錄的方式,就是在啟動容器的時候,使用-v選項設定這個本地目錄的對映引數,啟動後每一次修改都是針對對映的這個本地目錄,但是要注意以後的每次啟動都要帶著這個-v引數和這個本地目錄,否則又指向了預設的目錄相當於啟動乙個基於原始image的新container了。  

我們來深究一下上面的操作,進入docker container以後,會發現終端的使用者名稱和主機名,包括該使用者的root目錄(user@dockermachine:~/)都與進入之前不同了,好像真的進入了乙個傳統虛擬機器,這其實是linux的change root命令的效果,利用chroot命令將當前目錄對映為該使用者的root目錄。當exit的時候,又恢復為原真正的使用者root目錄,其對應的container也就被退了出來。

如果想提交這個最新的變更後的環境,讓更多同事使用,實際也是提交乙個本地的image,通常是使用commit和dockerfile的方式。commit方式每次都要提交具體的變更細節,深入docker的實現原理,它是將每次的commit的差異檔案存在aufs檔案系統的diff資料夾中,每次部署環境的時候,如果要檢查其中某次提交的檔案變更,就要捋順一遍這個commit列表,這實在是不方便。因此dockerfile的方式被廣泛應用,dockerfile會記錄以初始的基礎image為原點的每次對環境的變更,例如安裝了某個新的命令,它像乙個描述檔案有著自己的語法格式,每當以dockerfile啟動的時候,會先啟動其依賴的基礎image,然後再按照dockerfile中的命令順序一條條去執行,最終會獲得乙個變更後的統一環境。這樣,部署人員只需要維護dockerfile中的**即可。所有docker的使用者只需要本地留乙個基礎image,然後按照業務需要去get相應的dockerfile,啟動的時候就會獲得最新的環境,與同組其他同事獲得的能夠保持一致。

補充:上面多次提到了docker的aufs檔案系統,它非常強大,對應的路徑是在/var/lib/docker/aufs,它可以分塊(blob)儲存乙個image,由於image是唯讀的,分塊儲存可加快地讀取。如果不做-v修改本地對映卷的話,它還可以儲存使用者在container中修改的變更檔案。還可以儲存commit時與基礎image的差異檔案。

提到分塊儲存image的特性,就要說一下linux的mount命令,它可以將兩個具體路徑對映成乙個目錄,合併包含兩個具體路徑下的內部檔案。例如,mount -t aufs -o dirs="/tmp/a;/tmp/b" none /mnt。執行以後,原/tmp/a和/tmp/b中的內容都會出現在/mnt中。

registry建立也非常簡單。registry服務本身在docker hub中仍舊是以乙個image的形式存在的,所以直接在伺服器上docker run registry就ok了。

客戶端container可以指定服務端的ip加埠去pull image,也可以將本地的image tag成服務端的ip加埠下的image,然後push到服務端去。

Docker 輕量級虛擬化容器技術

一 docker 安裝 ubuntu 14.04 及以上版本自帶舊版本 docker 包,可通過安裝 apt transport https,並新增 docker 官方源,再安裝最新版 docker。sudo apt get install y ixc docker二 docker 核心 映象容器 ...

Docker學習筆記 輕量級虛擬化

學習筆記,工作需要學習一下docker,學習內容有 建房子軟體帶環境安裝 在一片空地上建房子 在乙個作業系統上配環境 依賴,各種庫,程式 搬家了在另一台機子上配環境 房子映象 裝房子的揹包 倉庫 拿出揹包裡的房子再複製乙個房子 容器 直接拎包入住,不會出現 在我的機器上可以跑,在你的機器上不能跑。解...

輕量級kali虛擬機器

將kali虛擬機器設定為開機使用命令列介面,並且將虛擬機器掛載到後台執行 在windows系統上ssh連線kali虛擬機器 設定為開機使用命令列介面init 3 使用命令列介面 init 5 使用圖形化介面 開機至字元介面 sudo systemctl set default multi user....