久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Docker存儲驅動中AUFS有什么用

212次閱讀
沒有評論

共計 3897 個字符,預計需要花費 10 分鐘才能閱讀完成。

這篇文章給大家分享的是有關 Docker 存儲驅動中 AUFS 有什么用的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。

簡介

AUFS 曾是 Docker 默認的首選存儲驅動。它非常穩定、有很多真實場景的部署、很強的社區支持。它有以下主要優點:
極短的容器啟動時間。
有效的存儲利用率。
有效的內存利用率。
雖然如此,但由于它沒有包含在 Linux 內核主線中,所有很多 Linux 發行版并不支持 AUFS。

特性鏡像分層和部署

AUFS 是一種聯合文件系統。它使用同一個 Linux host 上的多個目錄,逐個堆疊起來,對外呈現出一個統一的文件系統。AUFS 使用該特性,實現了 Docker 鏡像的分層。下圖展示出 ubuntu:latest 的鏡像的分層。

注意:在 Docker1.10 之前,layer 的 ID 對應著其在 /var/lib/docker 下的目錄名稱,但在 Docker1.10 之后,不再有這種直接的對應關系。
對于一個容器來說,只有頂層的容器 layer 是可讀寫的,而下面的 layer 都是只讀的。

讀寫文件

Docker 使用 AUFS 的 CoW(Copy-on-Write)技術來實現鏡像共享和最小化磁盤空間的使用。AUFS 作用于文件層,也就是說 AUFS CoW 拷貝整個文件——即使文件只修改了一點點的內容。所以,它對容器的性能影響很明顯,尤其拷貝多層鏡像下的大文件,或者是在一個深層次的目錄樹中進行搜索。
不過,在給定的容器中,這種拷貝到頂層 layer 的操作,每個文件只會做一次。隨后,對該文件的讀寫操作,都只針對容器頂層可讀寫 layer 的拷貝文件。

刪除文件

通過上面的介紹,很容易想到。如果要在容器中刪除一個非頂層 layer 的文件,肯定不會在下層 layer 中直接刪除,因為下層 layer 對于容器來說都是只讀的。AUFS 存儲驅動要刪除一個文件,是通過在容器頂層 layer 增加一個 whiteout 文件來實現的。這個 whiteout 文件可以隱藏下層只讀 layer 中文件的存在,容器感知不到只讀層 layer 中文的存在。事實上,無論該文件在下層只讀 layer 中是否還存在,容器都認為這個文件被刪除了。

重命名目錄

AUFS 未能完美的支持 rename(2) 重命名操作,會返回 EXDEV[“cross-device link not permitted”],即使源路徑和目的路徑都在同一個 AUFS 層。因此,你的應用需要能處理 EXDEV,可以用“拷貝再刪除”的策略來替代 rename 操作。
我在這里做了一個測試,寫了一個簡單地 C 程序,該程序將目錄 test 重命名為目錄 gaga,并打印出 rename 的結果。該程序在普通服務器上完美運行,那么在容器中呢?開始做測試吧。

創建 docker build 目錄,進入該目錄。并在該目錄下創建子目錄 test。

$ mkdir build-rename
$ cd build-rename
$ mkdir test

創建文件 test.c

$ vim test.c
#include stdio.h 
#include  fcntl.h 
int main(void)
 char oldname[100] =  test , newname[100]= gaga 
 int ret = rename(oldname, newname);
 if (ret == 0)
 printf( rename ok.\n 
 else
 printf(ret = %d\n , ret);
 return 0;
}

編譯該程序,生成可執行文件 a.out。

$ gcc test.c

創建 Dockerfile

$ vim Dockerfile
FROM ubuntu
WORKDIR /usr/src/app
COPY ./* /usr/src/app/
CMD /usr/src/app/a.out

生成鏡像。

$ docker build -t rename:v1.0 ./

運行容器

$ docker run --rm rename:v1.0
ret = -1

該容器啟動后會執行可執行文件 a.out,重命名一個目錄。可見結果,rename 重命名一個目錄的確是返回了失敗。

配置 AUFS 準備

只有在 OS 安裝了 AUFS 的情況下才能使用 AUFS 存儲驅動,一般來說,Debian/Ubuntu 都支持 AUFS,而 Redhat/CentOS 都不支持 AUFS。所以,你需要先查看下你的系統是否安裝了 AUFS。

$ grep aufs /proc/filesystems
nodev aufs

如果以上命令有輸出則表示支持 AUFS,否則就說明還未安裝 AUFS。可執行以下步驟:
a. 升級你系統的 kernel 版本到 3.13 或者更高,另外建議安裝 kernel headers;
b. 對于 Ubuntu/Debian:安裝 linux-image-extra-* 包:

$ apt-get install linux-image-extra-$(uname -r) \
 linux-image-extra-virtual

配置

如果上述操作無誤,就可以使用 AUFS 來作為你 Docker Daemon 的存儲驅動了。

$ dockerd --storage-driver=aufs 

如果想持久化這個配置,可以編輯你的 Docker 配置文件(如 /etc/default/docker,雖然官方已經不建議使用該文件了),并加入 –storage-driver=aufs 選項到 DOCKER_OPTS 中。

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS= --storage-driver=aufs

重啟 docker daemon(systemctl restart docker.service)后,確認默認存儲驅動是否配置成功:

$ docker info | grep  Storage Driver 
Storage Driver: aufs

本地存儲和 AUFS

當 dockerd 使用 AUFS 驅動時,驅動把鏡像和容器存儲在 Docker host 的本地存儲下:/var/lib/docker/aufs。

鏡像

鏡像層存儲在 /var/lib/docker/aufs/diff 里。Docker 1.10 之后,鏡像對應的目錄名稱不再和鏡像 ID 意義對應了。
/var/lib/docker/aufs/layers/ 目錄保存了元數據信息,這些元數據顯示了 image 層是如何疊加的。該目錄下的每個文件,對應了一個層,而這個文件的內容就是該層之下的層。如:

$ cat /var/lib/docker/aufs/layers/91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c
d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82
c22013c8472965aa5b62559f2b540cd440716ef149756e7b958a1b2aba421e87
d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391

由于 base layer 之下不再有其它層,所有 base layer 對應的文件內容是空的。

容器

運行中的容器映射在 /var/lib/docker/aufs/mnt/ container-id 下,這就是 AUFS 給容器和它下層 layer 的一個 mount point。如果容器沒有運行了,依然還有這個目錄,但卻是個空目錄,因為 AUFS 只在容器運行是才映射。Docker 1.10 之上的版本,目錄名同樣不和容器 ID 對應。
容器元數據和多種配置文件存放在該目錄下。

$ ls /var/lib/docker/aufs/mnt/670e0053b2ba02ab33dc24daca293e200aa98e871cefec016a5cbf9d41b7cfbf
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

容器的可寫層存儲在目錄 /var/lib/docker/aufs/diff/,即使容器停止了,容器對應的目錄依然存在。只有刪除容器時,對應的目錄才會刪除。

AUFS 在 Docker 中的性能

對于 PaaS 層來說,AUFS 存儲驅動是一個很好的選擇。因為 AUFS 有效地在多個運行容器中共享鏡像,加速了容器啟動時間,減少了容器使用的磁盤空間。
AUFS 在多個鏡像層和容器間分享文件所使用的底層機制,高效地使用了系統的頁緩存。
同時,AUFS 存儲驅動也帶來了一些容器寫性能上的隱患。這是因為,容器第一次對任何文件的修改,都需要先定位到文件的所在的鏡像層次,并拷貝到容器最頂層的讀寫層。尤其當這些文件存在于很底層,或者文件本身非常大時,性能問題尤其嚴重。

AUFS 是 Docker 在 Ubuntu/Debian 中的默認存儲驅動,雖然后面可能會被替換掉。但暫時來說,它完美地契合 Docker 的特性。并且,如何合理使用,其性能非常優異。另外,需要注意的是,AUFS 對目錄的重命名支持得不好,在編寫程序時需要注意這點。

感謝各位的閱讀!關于“Docker 存儲驅動中 AUFS 有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計3897字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 郑州市| 浦东新区| 道孚县| 安吉县| 阜新| 石柱| 隆安县| 垣曲县| 土默特左旗| 唐海县| 兴仁县| 广昌县| 双柏县| 宁陕县| 敦煌市| 安顺市| 如皋市| 蓝田县| 黄大仙区| 水城县| 吴堡县| 定襄县| 利津县| 阳春市| 罗江县| 榆树市| 东平县| 天津市| 古交市| 巴林左旗| 六盘水市| 桐庐县| 大姚县| 灵璧县| 乳源| 四川省| 阳新县| 阳高县| 沂水县| 嵩明县| 屯门区|