docker共享存儲
❶ 雲計算核心技術Docker教程:Docker存儲寫入時復制(CoW)策略
【點擊右上角加'關注',全國產經信息不錯過】
寫時復制是一種共享和復制文件的策略,可最大程度地提高效率。如果文件或目錄位於映像的較低層中,而另一層(包括可寫層)需要對其進行讀取訪問,則它僅使用現有文件。另一層第一次需要修改文件時(在構建映像或運行容器時),將文件復制到該層並進行修改。這樣可以將I / O和每個後續層的大小最小化。這些優點將在下面更深入地說明。
共享可以提升較小的圖像
當您用於docker pull從存儲庫中下拉映像時,或者當您從本地尚不存在的映像中創建容器時,每個層都會被分別下拉,並存儲在Docker的本地存儲區域中,該區域通常/var/lib/docker/在Linux主機上。在此示例中,您可以看到這些層被拉出:
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
f476d66f5408: Pull complete
8882c27f669e: Pull complete
d9af21273955: Pull complete
f5029279ec12: Pull complete
Digest: sha256:
Status: Downloaded newer image for ubuntu:18.04
這些層中的每一層都存儲在Docker主機的本地存儲區域內的自己的目錄中。要檢查文件系統上的各層,請列出的內容/var/lib/docker/。本示例使用overlay2 存儲驅動程序:
$ ls /var/lib/docker/overlay2
l
目錄名稱與層ID不對應(自Docker 1.10開始就是如此)。
現在,假設您有兩個不同的Dockerfile。您使用第一個創建名為的圖像acme/my-base-image:1.0。
# syntax=docker/dockerfile:1
FROM ubuntu:18.04
COPY . /app
第二acme/my-base-image:1.0層基於,但具有一些附加層:
# syntax=docker/dockerfile:1
FROM acme/my-base-image:1.0
CMD /app/hello.sh
第二個圖像包含第一個圖像的所有層,再加上帶有CMD指令的新層,以及一個可讀寫容器層。Docker已經具有第一個映像中的所有層,因此不需要再次將其拉出。這兩個圖像共享它們共有的任何圖層。
如果從兩個Dockerfile構建映像,則可以使用docker image ls和 docker history命令來驗證共享層的密碼ID是否相同。
1.創建一個新目錄cow-test/並更改到該目錄中。
2.在中cow-test/,創建一個hello.sh具有以下內容的新文件:
#!/bin/sh
echo "Hello world"
保存文件,並使其可執行:
chmod +x hello.sh
3.將上面第一個Dockerfile的內容復制到一個名為的新文件中 Dockerfile.base。
4.將上面第二個Dockerfile的內容復制到一個名為的新文件中 Dockerfile。
5.在cow-test/目錄中,構建第一個映像。不要忘記.在命令中包含final 。設置了PATH,它告訴Docker在哪裡尋找需要添加到映像中的任何文件。
$docker build -t acme/my-base-image:1.0 -f Dockerfile.base .
6.建立第二張鏡像。
$docker build -t acme/my-final-image:1.0 -f Dockerfile .
7.檢查鏡像的大小:
$docker image ls
8.檢出構成每個鏡像的圖層:
$docker history bd09118bcef6
請注意,除了第二個圖像的頂層以外,所有層都是相同的。所有其他層在兩個圖像之間共享,並且僅在中存儲一次/var/lib/docker/。實際上,新層根本不佔用任何空間,因為它不更改任何文件,而僅運行命令。
全國產經平台聯系電話:010-65367702,郵箱:[email protected],地址:北京市朝陽區金台西路2號人民日報社