咱們從本章開始討論 Docker 存儲。Docker 爲容器提供了兩種存放數據的資源,咱們會詳細討論它們的原理和特性。linux
在前面鏡像章節咱們學習到 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
新數據會直接存放在最上面的容器層。ubuntu
修改現有數據會先從鏡像層將數據複製到容器層,修改後的數據直接保存在容器層中,鏡像層保持不變。架構
若是多個層中有命名相同的文件,用戶只能看到最上面那層中的文件。app
分層結構使鏡像和容器的建立、共享以及分發變得很是高效,而這些都要歸功於 Docker storage driver。正是 storage driver 實現了多層數據的堆疊併爲用戶提供一個單一的合併以後的統一視圖。工具
Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現分層的架構,同時又有各自的特性。學習
對於 Docker 用戶來講,具體選擇使用哪一個 storage 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 之類的命令,不須要保存數據供之後使用,使用完直接退出,容器刪除時存放在容器層中的工做數據也一塊兒被刪除,這沒問題,下次再啓動新容器便可。
但對於另外一類應用這種方式就不合適了,它們有持久化數據的需求,容器啓動時須要加載已有的數據,容器銷燬時但願保留產生的新數據,也就是說,這類容器是有狀態的。