1. 程式人生 > 實用技巧 >容器(六)Docker 的兩類儲存資源【33】

容器(六)Docker 的兩類儲存資源【33】

六、儲存

(一)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:

  1. 新資料會直接存放在最上面的容器層。

  2. 修改現有資料會先從映象層將資料複製到容器層,修改後的資料直接儲存在容器層中,映象層保持不變。

  3. 如果多個層中有命名相同的檔案,使用者只能看到最上面那層中的檔案。

分層結構使映象和容器的建立、共享以及分發變得非常高效,而這些都要歸功於 Docker storage driver。正是 storage driver 實現了多層資料的堆疊併為使用者提供一個單一的合併之後的統一檢視。

Docker 支援多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現分層的架構,同時又有各自的特性。

對於 Docker 使用者來說,具體選擇使用哪個 storage driver 是一個難題,因為:

  1. 沒有哪個 driver 能夠適應所有的場景。
  2. 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 之類的命令,不需要儲存資料供以後使用,使用完直接退出,容器刪除時存放在容器層中的工作資料也一起被刪除,這沒問題,下次再啟動新容器即可。

但對於另一類應用這種方式就不合適了,它們有持久化資料的需求,容器啟動時需要載入已有的資料,容器銷燬時希望保留產生的新資料,也就是說,這類容器是有狀態的。