AUFS是docker最早支援的儲存引擎。 AUFS是一種Union File System,是檔案層級的儲存驅動,是Docker早期用的儲存驅動,是Docker18.06版本之前,Ubuntu14.04版本前推薦的,支援xfs、ext4檔案。
本教學操作環境:linux7.3系統、docker20版、Dell G3電腦。
AUFS是docker最早支援的儲存引擎。
Docker 的儲存引擎
#Docker 的儲存引擎設計想法是這樣,但是針對不同的檔案系統,是由不同的儲存驅動去實現的。下面我們就來聊聊 Docker 的儲存驅動程式。
Docker 主要有一下幾類儲存驅動:
overlay2:是目前版本推薦的儲存驅動,無需額外的依賴和配置即可發揮絕佳的效能。在 18.09 版本之後替換了 overlay 儲存驅動程式。支援 xfs,ext4 檔案系統。
aufs:Docker 最早使用的儲存驅動程式,是 Docker 18.06 版本之前,Ubuntu 14.04 版本前推薦的。支援 xfs,ext4 檔案系統。
devicemapper:是較早版本的 CentOS 和 RHEL 系統建議的儲存驅動,因為它們不支援 overlay2,需要 direct-lvm 的支援。
btrfs:僅用於 btrfs 檔案系統。
zfs:僅用於 zfs 檔案系統。
vfs:不依賴檔案系統,但是效能奇差,主要用來測試。
需要注意的是,overlay2,overlay,aufs 的層是基於文件的,當單文件的寫並發較高時需要大內存的支持,且讀寫層可能因為單一文件而變得很大。 devicemapper,btrfs,zfs 的層是基於區塊儲存的,因此對於單一檔案的高並發影響不大。但是 btrfs 和 zfs 非常消耗記憶體。
docker AUFS
AUFS是一種Union File System,所謂UnionFS就是把不同物理位置的目錄合併mount到同一個目錄中。 UnionFS的一個最主要的應用是,把一張CD/DVD和一個硬碟目錄給聯合mount在一起,然後,你就可以對這個只讀的CD/DVD上的檔案進行修改(當然,修改的檔案存於硬碟上的目錄裡)。
AUFS又叫Another UnionFS,後來叫Alternative UnionFS,後來可能覺得不夠霸氣,叫成Advance UnionFS。是由Junjiro Okajima(岡島順治郎)在2006年開發的,AUFS完全重寫了早期的UnionFS 1.x,主要目的是為了可靠性和性能,並且引入了一些新的功能,例如可寫分支的負載平衡。 AUFS在使用上全相容UnionFS,而且比之前的UnionFS在穩定性和效能上都好很多,後來的UnionFS 2.x開始抄AUFS中的功能。但他居然沒有進到Linux主幹裡,就是因為Linus不讓,基本上是因為程式碼量比較多,而且寫得爛(相對於只有3000行的union mount和10000行的UnionFS,以及其它平均下來只有6000行程式碼左右的VFS,AUFS居然有30000行程式碼),所以,岡島不斷地改進程式碼質量,不斷地提交,不斷地被Linus拒掉,所以,到今天AUFS都還進不了Linux主幹(今天你可以看到AUFS的程式碼其實還好了,比起OpenSSL好N倍,要嘛就是Linus對程式碼的品質要求非常高,要嘛就是Linus就是不喜歡AUFS)。
不過,好在有很多發行版都用了AUFS,例如:Ubuntu 10.04,Debian6.0, Gentoo Live CD支援AUFS,所以,也OK了。
好了,扯完這些閒話,我們還是看一個示例吧(環境:Ubuntu 14.04)
#首先,我們建上兩個目錄(水果和蔬菜),並在這兩個目錄中放上一些文件,水果中有蘋果和番茄,蔬菜有胡蘿蔔和番茄。
$ tree . ├── fruits │ ├── apple │ └── tomato └── vegetables ├── carrots └── tomato
然後,我們輸入以下命令:
# 创建一个mount目录 $ mkdir mnt # 把水果目录和蔬菜目录union mount到 ./mnt目录中 $ sudo mount -t aufs -o dirs=./fruits:./vegetables none ./mnt # 查看./mnt目录 $ tree ./mnt ./mnt ├── apple ├── carrots └── tomato
我們可以看到在./mnt目錄下有三個文件,蘋果apple、胡蘿蔔carrots和番茄tomato。水果和蔬菜的目錄被union到了./mnt目錄下了。
我們來修改一下其中的文件內容:
$ echo mnt > ./mnt/apple $ cat ./mnt/apple mnt $ cat ./fruits/apple mnt
上面的範例,我們可以看到./mnt/apple的內容改了,./fruits/apple的內容也改了。
$ echo mnt_carrots > ./mnt/carrots $ cat ./vegetables/carrots $ cat ./fruits/carrots mnt_carrots
上面的範例,我們可以看到,我們修改了./mnt/carrots的文件內容,./vegetables/carrots並沒有變化,反而是./fruits/carrots的目錄中出現了carrots文件,其內容是我們在./mnt/carrots裡的內容。
也就是說,我們在mount aufs指令中,我們沒有指它vegetables和fruits的目錄權限,預設上來說,指令列上第一個(最左邊)的目錄是可讀可寫的,後面的都是唯讀的。 (一般來說,最前面的目錄應該是可寫的,而後面的都應該是唯讀的)
所以,如果我們像下面這樣指定權限來mount aufs,你就會發現有不一樣的效果(記得先把上面./fruits/carrots的檔案刪除了):
$ sudo mount -t aufs -o dirs=./fruits=rw:./vegetables=rw none ./mnt $ echo "mnt_carrots" > ./mnt/carrots $ cat ./vegetables/carrots mnt_carrots $ cat ./fruits/carrots cat: ./fruits/carrots: No such file or directory
现在,在这情况下,如果我们要修改./mnt/tomato这个文件,那么究竟是哪个文件会被改写?
$ echo "mnt_tomato" > ./mnt/tomato $ cat ./fruits/tomato mnt_tomato $ cat ./vegetables/tomato I am a vegetable
可见,如果有重复的文件名,在mount命令行上,越往前的就优先级越高。
你可以用这个例子做一些各种各样的试验,我这里主要是给大家一个感性认识,就不展开试验下去了。
那么,这种UnionFS有什么用?
历史上,有一个叫Knoppix的Linux发行版,其主要用于Linux演示、光盘教学、系统急救,以及商业产品的演示,不需要硬盘安装,直接把CD/DVD上的image运行在一个可写的存储设备上(比如一个U盘上),其实,也就是把CD/DVD这个文件系统和USB这个可写的系统给联合mount起来,这样你对CD/DVD上的image做的任何改动都会在被应用在U盘上,于是乎,你可以对CD/DVD上的内容进行任意的修改,因为改动都在U盘上,所以你改不坏原来的东西。
我们可以再发挥一下想像力,你也可以把一个目录,比如你的源代码,作为一个只读的template,和另一个你的working directory给union在一起,然后你就可以做各种修改而不用害怕会把源代码改坏了。有点像一个ad hoc snapshot。
Docker把UnionFS的想像力发挥到了容器的镜像。你是否还记得我在介绍Linux Namespace上篇中用mount namespace和chroot山寨了一镜像。现在当你看过了这个UnionFS的技术后,你是不是就明白了,你完全可以用UnionFS这样的技术做出分层的镜像来。
下图来自Docker的官方文档Layer,其很好的展示了Docker用UnionFS搭建的分层镜像。
关于docker的分层镜像,除了aufs,docker还支持btrfs, devicemapper和vfs,你可以使用 -s 或 storage-driver= 选项来指定相关的镜像存储。在Ubuntu 14.04下,docker默认Ubuntu的 aufs(在CentOS7下,用的是devicemapper,关于devicemapper,我会以以后的文章中讲解)你可以在下面的目录中查看相关的每个层的镜像:
/var/lib/docker/aufs/diff/<id>
AUFS的一些特性
AUFS有所有Union FS的特性,把多个目录,合并成同一个目录,并可以为每个需要合并的目录指定相应的权限,实时的添加、删除、修改已经被mount好的目录。而且,他还能在多个可写的branch/dir间进行负载均衡。
上面的例子,我们已经看到AUFS的mount的示例了。下面我们来看一看被union的目录(分支)的相关权限:
rw表示可写可读read-write。
ro表示read-only,如果你不指权限,那么除了第一个外ro是默认值,对于ro分支,其永远不会收到写操作,也不会收到查找whiteout的操作。
rr表示real-read-only,与read-only不同的是,rr标记的是天生就是只读的分支,这样,AUFS可以提高性能,比如不再设置inotify来检查文件变动通知。
推荐学习:《docker视频教程》
以上是什麼是docker最早支援的儲存引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Docker在實際項目中的應用場景包括簡化部署、管理多容器應用和性能優化。 1.Docker簡化了應用部署,如使用Dockerfile部署Node.js應用。 2.DockerCompose管理多容器應用,如微服務架構中的Web和數據庫服務。 3.性能優化使用多階段構建減小鏡像大小,並通過健康檢查監控容器狀態。

在小型項目或開發環境中選擇Docker,在大型項目或生產環境中選擇Kubernetes。 1.Docker適合快速迭代和測試,2.Kubernetes提供強大的容器編排能力,適合管理和擴展大型應用。

Docker在Linux上重要,因為Linux是其原生平台,提供了豐富的工具和社區支持。 1.安裝Docker:使用sudoapt-getupdate和sudoapt-getinstalldocker-cedocker-ce-clicontainerd.io。 2.創建和管理容器:使用dockerrun命令,如dockerrun-d--namemynginx-p80:80nginx。 3.編寫Dockerfile:優化鏡像大小,使用多階段構建。 4.優化和調試:使用dockerlogs和dockerex

Docker是容器化工具,Kubernetes是容器編排工具。 1.Docker打包應用及其依賴成容器,可在任何支持Docker的環境中運行。 2.Kubernetes管理這些容器,實現自動化部署、擴展和管理,使應用高效運行。

Docker的目的是簡化應用部署,通過容器化技術確保應用在不同環境中一致運行。 1)Docker通過將應用和依賴打包到容器中,解決了環境差異問題。 2)使用Dockerfile創建鏡像,確保應用在任何地方一致運行。 3)Docker的工作原理基於鏡像和容器,利用Linux內核的命名空間和控制組實現隔離和資源管理。 4)基本用法包括從DockerHub拉取並運行鏡像,高級用法涉及使用DockerCompose管理多容器應用。 5)常見錯誤如鏡像構建失敗和容器無法啟動,可通過日誌和網絡配置調試。 6)性能優化建

在Ubuntu、CentOS和Debian上安裝和使用Docker的方法各有不同。 1)Ubuntu:使用apt包管理器,命令為sudoapt-getupdate&&sudoapt-getinstalldocker.io。 2)CentOS:使用yum包管理器,需添加Docker倉庫,命令為sudoyuminstall-yyum-utils&&sudoyum-config-manager--add-repohttps://download.docker.com/lin

在Linux上使用Docker可以提高開發效率和簡化應用部署。 1)拉取Ubuntu鏡像:dockerpullubuntu。 2)運行Ubuntu容器:dockerrun-itubuntu/bin/bash。 3)創建包含nginx的Dockerfile:FROMubuntu;RUNapt-getupdate&&apt-getinstall-ynginx;EXPOSE80。4)構建鏡像:dockerbuild-tmy-nginx.。 5)運行容器:dockerrun-d-p8080:80

Docker在Linux上可以簡化應用部署和管理。 1)Docker是容器化平台,將應用及其依賴打包進輕量、可移植容器。 2)在Linux上,Docker利用cgroups和namespaces實現容器隔離和資源管理。 3)基本用法包括拉取鏡像和運行容器,高級用法如DockerCompose可定義多容器應用。 4)調試常用dockerlogs和dockerexec命令。 5)性能優化可通過多階段構建減小鏡像大小,保持Dockerfile簡潔是最佳實踐。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境