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

6、存儲

(一)Docker 的兩類存儲資源

​ 咱們從本章開始討論 Docker 存儲。Docker 爲容器提供了兩種存放數據的資源,咱們會詳細討論它們的原理和特性。linux

  • 由 storage driver 管理的鏡像層和容器層。
  • Data Volume。

(1)storage driver

在前面鏡像章節咱們學習到 Docker 鏡像的分層結構,簡單回顧一下。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:json

  1. 新數據會直接存放在最上面的容器層。ubuntu

  2. 修改現有數據會先從鏡像層將數據複製到容器層,修改後的數據直接保存在容器層中,鏡像層保持不變。架構

  3. 若是多個層中有命名相同的文件,用戶只能看到最上面那層中的文件。app

分層結構使鏡像和容器的建立、共享以及分發變得很是高效,而這些都要歸功於 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。ui

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 之類的命令,不須要保存數據供之後使用,使用完直接退出,容器刪除時存放在容器層中的工做數據也一塊兒被刪除,這沒問題,下次再啓動新容器便可。

但對於另外一類應用這種方式就不合適了,它們有持久化數據的需求,容器啓動時須要加載已有的數據,容器銷燬時但願保留產生的新數據,也就是說,這類容器是有狀態的。

相關文章
相關標籤/搜索