六、存盤
(一)Docker 的兩類存盤資源
? 我們從本章開始討論 Docker 存盤,Docker 為容器提供了兩種存放資料的資源,我們會詳細討論它們的原理和特性,
- 由 storage driver 管理的鏡像層和容器層,
- Data Volume,
(1)storage driver
在前面鏡像章節我們學習到 Docker 鏡像的分層結構,簡單回顧一下,
| Thin R/R layer | container layer |
|---|---|
| 898ef2d48c22 COPY | image layers(R/O) |
| b75528ee6f18 RUN | image layers(R/O) |
| d70eaf7277ea ubuntu | image layers(R/O) |
| ubuntu-with-dockerfile2 | image layers(R/O) |
? 容器由最上面一個可寫的容器層,以及若干只讀的鏡像層組成,容器的資料就存放在這些層中,這樣的分層結構最大的特性是 Copy-on-Write:
-
新資料會直接存放在最上面的容器層,
-
修改現有資料會先從鏡像層將資料復制到容器層,修改后的資料直接保存在容器層中,鏡像層保持不變,
-
如果多個層中有命名相同的檔案,用戶只能看到最上面那層中的檔案,
分層結構使鏡像和容器的創建、共享以及分發變得非常高效,而這些都要歸功于 Docker storage driver,正是 storage driver 實作了多層資料的堆疊并為用戶提供一個單一的合并之后的統一視圖,
Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS,它們都能實作分層的架構,同時又有各自的特性,
對于 Docker 用戶來說,具體選擇使用哪個 storage driver 是一個難題,因為:
- 沒有哪個 driver 能夠適應所有的場景,
- driver 本身在快速發展和迭代,
不過 Docker 官方給出了一個簡單的答案:優先使用 Linux 發行版默認的 storage driver,
Docker 安裝時會根據當前系統的配置選擇默認的 driver,默認 driver 具有最好的穩定性,因為默認 driver 在發行版上經過了嚴格的測驗,
運行docker info查看 Ubuntu 的默認 driver:
root@cuiyongchao:~# docker info
Client:
Debug Mode: false
Server:
Containers: 33
Running: 11
Paused: 0
Stopped: 22
Images: 19
Server Version: 19.03.13
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-121-generic
Operating System: Ubuntu 18.04.5 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.83GiB
Name: cuiyongchao
ID: NQEO:T2OZ:4HKT:AE6I:4KXT:7MPH:G6LS:UWS6:HGNC:LJFQ:WQLD:R47D
Docker Root Dir: /var/lib/docker
Debug Mode: false
Username: cuiyongchao007
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
10.0.0.20:5000
127.0.0.0/8
Registry Mirrors:
http://f1361db2.m.daocloud.io/
Live Restore Enabled: false
WARNING: No swap limit support
root@cuiyongchao:~#
Ubuntu 用的 AUFS,底層檔案系統是 extfs,各層資料存放在 /var/lib/docker/aufs,Redhat/CentOS 的默認 driver 是 Device Mapper,SUSE 則是 Btrfs,
對于某些容器,直接將資料放在由 storage driver 維護的層中是很好的選擇,比如那些無狀態的應用,無狀態意味著容器沒有需要持久化的資料,隨時可以從鏡像直接創建,
比如 busybox,它是一個工具箱,我們啟動 busybox 是為了執行諸如 wget,ping 之類的命令,不需要保存資料供以后使用,使用完直接退出,容器洗掉時存放在容器層中的作業資料也一起被洗掉,這沒問題,下次再啟動新容器即可,
但對于另一類應用這種方式就不合適了,它們有持久化資料的需求,容器啟動時需要加載已有的資料,容器銷毀時希望保留產生的新資料,也就是說,這類容器是有狀態的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227322.html
標籤:其他
