您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何管理Docker數據,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在容器的可寫層可以存儲數據,但是有如下缺點:
容器不再運行時,數據將不會持續存在,數據很難從容器中取出。
容器可寫層與容器運行的宿主緊耦合。無法在不同主機之間很好的進行數據遷移。
在容器可寫層數據寫入數據,需要一個storage driver來管理文件系統。數據寫入容器的讀寫層需要內核提供聯合文件系統,相比使用data volumes直接寫數據到宿主文件系統,這種抽象會帶來開銷。
Docker提供了三種不同的管理宿主上容器數據的方式:volumes
, bind mounts
和 tmpfs volumes
.
無論你選擇哪種mount 類型,在容器中看到的數據都相同。即在容器文件系統中以目錄或者獨立文件的形式存在。
一種比較簡單的方式區分 volumes, bind mounts 和 tmpfs mounts
,是通過區分數據存放在Docker宿主的具體位置。
Volumes: 存放宿主文件系統下的 /var/lib/docker/volumes
目錄,非Docker進程不能修改這部分文件系統。Volumes是管理Docker持久化數據最好的方式。
Bind mounts: 存放在宿主的任意位置,可以是重要的系統文件或目錄。非Docker進程和Docker容器可以隨時修改這些數據。
tmpfs mounts:僅存在宿主系統的內存中,不會寫入到宿主機的文件系統。
Volumes:由Docker創建和管理。你可以通過docker volume create命令顯式地創建volume,Docker也可以在創建容器或服務是自己創建volume。
當你創建了一個volume,它會被存放在宿主機的一個目錄下。當你將這個volume掛載到某個容器時,這個目錄就是掛載到容器的東西。這一點和bind mounts類似,除了volumes是由Docker創建的,和宿主機的核心(core functionality)隔離。
一個volume可以同時被掛載到幾個容器中。即使沒有正在運行的容器使用這個volume,volume依然存在,不會被自動清除。可以通過docker volume prune清除不再使用的volumes。
volumes也支持volume driver,可以將數據存放在另外的機器或者云上。
Bind mounts:Docker早期就支持這個特性。與volumes相比,Bind mounts支持的功能有限。使用bind mounts時,宿主機上的一個文件或目錄被掛載到容器上。
警告:使用Bind mounts的一個副作用是,容器中運行的程序可以修改宿主機的文件系統,包括創建,修改,刪除重要的系統文件或目錄。這個功能可能會有安全問題。
tmpfs mounts:tmpfs mounts的數據不會落盤。在容器的生命周期內,它可以被用來存儲一些不需要持久化的狀態或敏感數據。例如,swarm服務通過tmpfs mounts來將secrets掛載到一個服務的容器中去。
volume 方式應該是持久化數據的首選方式, 其推薦用例:
在不同的容器中共享數據。在多個容器之間共享數據,volume 在容器停止或刪除的時候依然存在,如果需要刪除需要顯示(dockr rm -v…),多個容器可以加載相同的卷。 Volumes are only removed when you explicitly remove them.
當主機不能保證有一個指定的目錄或文件結構時。Volume有助于解耦容器runtime和Docker宿主配置。
當需要把容器數據When you want to store your container’s data on a remote host or a cloud provider, rather than locally.
當你需要備份、還原或遷移數據時。停止容器,備份卷的目錄(如/var/lib/docker/volumes/<volume-name>。
通過 bind mount 方式,你可以將你主機上的任何文件或目錄(絕對路徑)掛載到容器中。
掛載的文件或目錄可以被任何進程修改,因此有時候容器中修改了該文件或目錄將會影響其他進程。
如果掛載主機的文件或目錄不存在將會自動創建。
使用該方式不能通過 docker volume 管理,推薦使用 volume 方式。
宿主機和容器共享配置文件。Docker提供的DNS解決方案就是如此,將宿主機的/etc/resolv.conf掛載到每個容器中。
開發環境需要在宿主機和容器中共享代碼。基于docker的開發就是如此,畢竟容器中一般是沒有編輯器的。
Docker宿主上的文件和目錄結構需要與容器中bind mount的目錄保持一致。
如果將空文件或目錄掛載到容器,容器中的該目錄又有文件,那么,這些文件將會被復制到主機上的目錄中。如果將非空的文件或目錄掛載到容器,容器中的該目錄也有文件,那么,容器中的文件將會被隱藏。
volume 在 docker 中被推薦為首選方式,它與 bind mount 相比,有以下優點:
與 bind mount 相比,volume 更容易備份或遷移。
可以使用 Docker CLI 命令或 Docker API 來管理。
volume 在 Linux 和 Windows 容器上都能工作。
volume 可以在多個容器之間更安全的共享。
volume 驅動程序允許你在遠程主機或云上提供存儲、加密或其他功能。
新 volume 的內容可以由容器預填充。
Propagation 的在 bind mount 和 volume 中默認為 rprivate
。它只能在 bind mount 配置,并且只能在 Linux 主機上配置。這是一個高級選項,許多用戶不需要配置它。
Propagation 是指在給定的掛載卷或命名卷中創建的掛載是否可以傳播到該掛載的副本。 考慮一個掛載點 /mnt,它被掛載在 /tmp。傳播設置控制是否掛載 /tmp/a 也可用 /mnt/a。每個 Propagation 設置都有一個遞歸對應點。在遞歸的情況下,考慮 /tmp/a 被掛載為 /foo。傳播設置控制是否 /mnt/a 或 /tmp/a 將存在。
Propagation 設置 | 描述 |
---|---|
shared | 原始mount的子mount會暴露給副本mount,并且副本mount的子mount也會傳播到原始mount。 |
slave | 類似于共享的mount,但僅在一個方向上。如果原始mount顯示一個子mount,副本mount可以看到它。但是,如果副本mount公開了子mount,則原始mount無法看到它。 |
private | 這個mount是私人的。其中的子mount不會暴露給副本mount,并且副mount的子mount不會暴露給原始mount。 |
rshared | 與共享相同,但是傳播也擴展到嵌套在任何原始或副本mount點內的掛載點。 |
rslave | 與從屬設備相同,但傳播也延伸到嵌套在任何原始或副本mount點內的掛載點。 |
rprivate | 默認。與私有相同,這意味著在原始或副本mount點內的任何位置都不會有mount點向任一方向傳播。 |
在可以在安裝點上設置綁定傳播之前,主機文件系統需要已經支持綁定傳播。有關綁定傳播的更多信息,請參閱 共享子樹 的 Linux內核文檔。
以下示例將 target/ 目錄裝載到容器中兩次,第二個裝入設置 ro 選項和 rslave 綁定傳播選項。
在 --mount 和 -v 實例有同樣的結果。
$ docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,target=/app \ --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \ nginx:latest $ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app \ -v "$(pwd)"/target:/app2:ro,rslave \ nginx:latest
現在如果你創建 /app/foo/,/app2/foo/ 也將存在。
如果使用的 selinux 話,可以添加 z 或者 Z 選項來修改正在裝入容器的主機文件或目錄的 selinux 標簽。這會影響主機本身的文件或目錄,并可能導致Docker范圍之外的后果。
該 z 選項指示綁定安裝內容在多個容器之間共享。
該 Z 選項指示綁定安裝內容是私有的和非共享的。
使用極端謹慎使用這些選項。綁定一個系統目錄,例如 /home或者 /usr 用這個 Z 選項,將會使你的主機無法工作,你可能需要手工重新標記主機文件。
重要:在使用綁定安裝服務時,selinux標簽(:Z 和 :z)以及 :ro 被忽略。有關詳細信息,請參閱 moby/moby#32579。
這個例子設置 z 選項來指定多個容器可以共享綁定掛載的內容:
使用 --mount 標志來修改selinux標簽是不可能的。
$ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app:z \ nginx:latest
Docker for Mac用于 osxfs 將從 macOS 共享的目錄和文件傳播到 Linux VM。這種傳播使這些目錄和文件可用于在 Docker for Mac 上運行的 Docker 容器。
默認情況下,這些共享是完全一致的,這意味著每次在 macOS 主機上發生寫入或通過容器中的掛載時,都會將更改刷新到磁盤,以便共享中的所有參與者都具有完全一致的視圖。在某些情況下,完全一致可能會嚴重影響性能。Docker 17.05 和更高版本引入了選項來調整一個一個,每個容器的一致性設置。以下選項可用:
consistent 或者 default:完全一致的默認設置,如上所述。
delegated:容器運行時的掛載視圖是權威的。在容器中進行的更新可能在主機上可見之前可能會有延遲。
cached:macOS主機的掛載視圖是權威的。在主機上進行的更新在容器中可見之前可能會有延遲。 這些選項在除 macOS 以外的所有主機操作系統上完全忽略。
在–mount和-v實例有同樣的結果。
$ docker run -d \ -it \ --name devtest \ --mount type=bind,source="$(pwd)"/target,destination=/app,consistency=cached \ nginx:latest $ docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app:cached \ nginx:latest
tmpfs mounts主要用在你既不想在容器內,又不想在宿主機文件系統保存數據的時候。這可能是出于安全原因,也可能是你的應用需要寫非常多的非持久化數據,tmpfs mounts這時候可以保證容器性能。
tmpfs,使用它的情況一般是,對安全比較重視以及不需要持久化數據。
--tmpfs 和 --mount 的關系與前面兩種方式的關系不用多說。那它們之間的差異是:
--tmpfs 不允許指定任何可配置選項。 --tmpfs 不能用于 swarm service,必須使用 --mount。
tmpfs
掛載不能在容器間共享。 tmpfs
只能在 Linux 容器上工作,不能在 windows 容器上工作。
$ docker run -d \ -it \ --name tmptest \ --mount type=tmpfs,destination=/app \ nginx:latest $ docker run -d \ -it \ --name tmptest \ --tmpfs /app \ nginx:latest
tmpfs 通過運行 docker container inspect tmptest 并查找 Mounts 部分來驗證安裝是掛載:
"Tmpfs": { "/app": "" },
刪除容器:
$ docker container stop tmptest $ Docker container rm tmptest
tmpfs 掛載允許兩個配置選項,這兩個都是不需要的。如果您需要指定這些選項,則必須使用該 --mount 標志,因為該 --tmpfs 標志不支持它們。
選項 | 描述 |
---|---|
tmpfs-size | tmpfs 的大小,以字節為單位。無限制默認。 |
tmpfs-mode | tmpfs 的八進制文件模式。例如,700 或者 0770。默認為 1777 或全局可寫。 |
以下示例將設置 tmpfs-mode 為 1770,以便在容器內不可全局讀取。
docker run -d \ -it \ --name tmptest \ --mount type=tmpfs,destination=/app,tmpfs-mode=1770 \ nginx:latest
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何管理Docker數據”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。