溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何管理Docker數(shù)據(jù)

發(fā)布時間:2021-12-13 14:23:47 來源:億速云 閱讀:315 作者:小新 欄目:云計算

這篇文章主要介紹了如何管理Docker數(shù)據(jù),具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

管理Docker數(shù)據(jù)

在容器的可寫層可以存儲數(shù)據(jù),但是有如下缺點:

  • 容器不再運行時,數(shù)據(jù)將不會持續(xù)存在,數(shù)據(jù)很難從容器中取出。

  • 容器可寫層與容器運行的宿主緊耦合。無法在不同主機之間很好的進行數(shù)據(jù)遷移。

  • 在容器可寫層數(shù)據(jù)寫入數(shù)據(jù),需要一個storage driver來管理文件系統(tǒng)。數(shù)據(jù)寫入容器的讀寫層需要內(nèi)核提供聯(lián)合文件系統(tǒng),相比使用data volumes直接寫數(shù)據(jù)到宿主文件系統(tǒng),這種抽象會帶來開銷。

Docker提供了三種不同的管理宿主上容器數(shù)據(jù)的方式:volumes, bind mountstmpfs volumes.

如何管理Docker數(shù)據(jù)

選擇合適的mount類型

無論你選擇哪種mount 類型,在容器中看到的數(shù)據(jù)都相同。即在容器文件系統(tǒng)中以目錄或者獨立文件的形式存在。

一種比較簡單的方式區(qū)分 volumes, bind mounts 和 tmpfs mounts,是通過區(qū)分數(shù)據(jù)存放在Docker宿主的具體位置。

  • Volumes: 存放宿主文件系統(tǒng)下的 /var/lib/docker/volumes目錄,非Docker進程不能修改這部分文件系統(tǒng)。Volumes是管理Docker持久化數(shù)據(jù)最好的方式。

  • Bind mounts: 存放在宿主的任意位置,可以是重要的系統(tǒng)文件或目錄。非Docker進程和Docker容器可以隨時修改這些數(shù)據(jù)。

  • tmpfs mounts:僅存在宿主系統(tǒng)的內(nèi)存中,不會寫入到宿主機的文件系統(tǒng)。

關(guān)于Mount類型的更多細節(jié)

  • Volumes:由Docker創(chuàng)建和管理。你可以通過docker volume create命令顯式地創(chuàng)建volume,Docker也可以在創(chuàng)建容器或服務(wù)是自己創(chuàng)建volume。

當你創(chuàng)建了一個volume,它會被存放在宿主機的一個目錄下。當你將這個volume掛載到某個容器時,這個目錄就是掛載到容器的東西。這一點和bind mounts類似,除了volumes是由Docker創(chuàng)建的,和宿主機的核心(core functionality)隔離。

一個volume可以同時被掛載到幾個容器中。即使沒有正在運行的容器使用這個volume,volume依然存在,不會被自動清除??梢酝ㄟ^docker volume prune清除不再使用的volumes。

volumes也支持volume driver,可以將數(shù)據(jù)存放在另外的機器或者云上。

  • Bind mounts:Docker早期就支持這個特性。與volumes相比,Bind mounts支持的功能有限。使用bind mounts時,宿主機上的一個文件或目錄被掛載到容器上。

警告:使用Bind mounts的一個副作用是,容器中運行的程序可以修改宿主機的文件系統(tǒng),包括創(chuàng)建,修改,刪除重要的系統(tǒng)文件或目錄。這個功能可能會有安全問題。

  • tmpfs mounts:tmpfs mounts的數(shù)據(jù)不會落盤。在容器的生命周期內(nèi),它可以被用來存儲一些不需要持久化的狀態(tài)或敏感數(shù)據(jù)。例如,swarm服務(wù)通過tmpfs mounts來將secrets掛載到一個服務(wù)的容器中去。

適合Volumes的場景

volume 方式應(yīng)該是持久化數(shù)據(jù)的首選方式, 其推薦用例:

  • 在不同的容器中共享數(shù)據(jù)。在多個容器之間共享數(shù)據(jù),volume 在容器停止或刪除的時候依然存在,如果需要刪除需要顯示(dockr rm -v…),多個容器可以加載相同的卷。 Volumes are only removed when you explicitly remove them.

  • 當主機不能保證有一個指定的目錄或文件結(jié)構(gòu)時。Volume有助于解耦容器runtime和Docker宿主配置。

  • 當需要把容器數(shù)據(jù)When you want to store your container’s data on a remote host or a cloud provider, rather than locally.

  • 當你需要備份、還原或遷移數(shù)據(jù)時。停止容器,備份卷的目錄(如/var/lib/docker/volumes/<volume-name>。

適合bind mounts的場景

通過 bind mount 方式,你可以將你主機上的任何文件或目錄(絕對路徑)掛載到容器中。

  • 掛載的文件或目錄可以被任何進程修改,因此有時候容器中修改了該文件或目錄將會影響其他進程。

  • 如果掛載主機的文件或目錄不存在將會自動創(chuàng)建。

  • 使用該方式不能通過 docker volume 管理,推薦使用 volume 方式。

  • 宿主機和容器共享配置文件。Docker提供的DNS解決方案就是如此,將宿主機的/etc/resolv.conf掛載到每個容器中。

  • 開發(fā)環(huán)境需要在宿主機和容器中共享代碼?;赿ocker的開發(fā)就是如此,畢竟容器中一般是沒有編輯器的。

  • Docker宿主上的文件和目錄結(jié)構(gòu)需要與容器中bind mount的目錄保持一致。

如果將空文件或目錄掛載到容器,容器中的該目錄又有文件,那么,這些文件將會被復制到主機上的目錄中。如果將非空的文件或目錄掛載到容器,容器中的該目錄也有文件,那么,容器中的文件將會被隱藏。

Volume VS. Bind mount

volume 在 docker 中被推薦為首選方式,它與 bind mount 相比,有以下優(yōu)點:

  • 與 bind mount 相比,volume 更容易備份或遷移。

  • 可以使用 Docker CLI 命令或 Docker API 來管理。

  • volume 在 Linux 和 Windows 容器上都能工作。

  • volume 可以在多個容器之間更安全的共享。

  • volume 驅(qū)動程序允許你在遠程主機或云上提供存儲、加密或其他功能。

  • 新 volume 的內(nèi)容可以由容器預填充。

配置 Propagation

Propagation 的在 bind mount 和 volume 中默認為 rprivate。它只能在 bind mount 配置,并且只能在 Linux 主機上配置。這是一個高級選項,許多用戶不需要配置它。

Propagation 是指在給定的掛載卷或命名卷中創(chuàng)建的掛載是否可以傳播到該掛載的副本。 考慮一個掛載點 /mnt,它被掛載在 /tmp。傳播設(shè)置控制是否掛載 /tmp/a 也可用 /mnt/a。每個 Propagation 設(shè)置都有一個遞歸對應(yīng)點。在遞歸的情況下,考慮 /tmp/a 被掛載為 /foo。傳播設(shè)置控制是否 /mnt/a 或 /tmp/a 將存在。

Propagation 設(shè)置描述
shared原始mount的子mount會暴露給副本mount,并且副本mount的子mount也會傳播到原始mount。
slave類似于共享的mount,但僅在一個方向上。如果原始mount顯示一個子mount,副本mount可以看到它。但是,如果副本mount公開了子mount,則原始mount無法看到它。
private這個mount是私人的。其中的子mount不會暴露給副本mount,并且副mount的子mount不會暴露給原始mount。
rshared與共享相同,但是傳播也擴展到嵌套在任何原始或副本mount點內(nèi)的掛載點。
rslave與從屬設(shè)備相同,但傳播也延伸到嵌套在任何原始或副本mount點內(nèi)的掛載點。
rprivate默認。與私有相同,這意味著在原始或副本mount點內(nèi)的任何位置都不會有mount點向任一方向傳播。

在可以在安裝點上設(shè)置綁定傳播之前,主機文件系統(tǒng)需要已經(jīng)支持綁定傳播。有關(guān)綁定傳播的更多信息,請參閱 共享子樹 的 Linux內(nèi)核文檔。

以下示例將 target/ 目錄裝載到容器中兩次,第二個裝入設(shè)置 ro 選項和 rslave 綁定傳播選項。

在 --mount 和 -v 實例有同樣的結(jié)果。

$ 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

現(xiàn)在如果你創(chuàng)建 /app/foo/,/app2/foo/ 也將存在。

配置selinux標簽

如果使用的 selinux 話,可以添加 z 或者 Z 選項來修改正在裝入容器的主機文件或目錄的 selinux 標簽。這會影響主機本身的文件或目錄,并可能導致Docker范圍之外的后果。

  • 該 z 選項指示綁定安裝內(nèi)容在多個容器之間共享。

  • 該 Z 選項指示綁定安裝內(nèi)容是私有的和非共享的。

使用極端謹慎使用這些選項。綁定一個系統(tǒng)目錄,例如 /home或者 /usr 用這個 Z 選項,將會使你的主機無法工作,你可能需要手工重新標記主機文件。

重要:在使用綁定安裝服務(wù)時,selinux標簽(:Z 和 :z)以及 :ro 被忽略。有關(guān)詳細信息,請參閱 moby/moby#32579。

這個例子設(shè)置 z 選項來指定多個容器可以共享綁定掛載的內(nèi)容:

使用 --mount 標志來修改selinux標簽是不可能的。

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:z \
  nginx:latest

配置macOS的安裝一致性

Docker for Mac用于 osxfs 將從 macOS 共享的目錄和文件傳播到 Linux VM。這種傳播使這些目錄和文件可用于在 Docker for Mac 上運行的 Docker 容器。

默認情況下,這些共享是完全一致的,這意味著每次在 macOS 主機上發(fā)生寫入或通過容器中的掛載時,都會將更改刷新到磁盤,以便共享中的所有參與者都具有完全一致的視圖。在某些情況下,完全一致可能會嚴重影響性能。Docker 17.05 和更高版本引入了選項來調(diào)整一個一個,每個容器的一致性設(shè)置。以下選項可用:

  • consistent 或者 default:完全一致的默認設(shè)置,如上所述。

  • delegated:容器運行時的掛載視圖是權(quán)威的。在容器中進行的更新可能在主機上可見之前可能會有延遲。

  • cached:macOS主機的掛載視圖是權(quán)威的。在主機上進行的更新在容器中可見之前可能會有延遲。 這些選項在除 macOS 以外的所有主機操作系統(tǒng)上完全忽略。

在–mount和-v實例有同樣的結(jié)果。

$ 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主要用在你既不想在容器內(nèi),又不想在宿主機文件系統(tǒng)保存數(shù)據(jù)的時候。這可能是出于安全原因,也可能是你的應(yīng)用需要寫非常多的非持久化數(shù)據(jù),tmpfs mounts這時候可以保證容器性能。

相關(guān)用例

tmpfs,使用它的情況一般是,對安全比較重視以及不需要持久化數(shù)據(jù)。

使用方式

--tmpfs 和 --mount 的關(guān)系與前面兩種方式的關(guān)系不用多說。那它們之間的差異是:

--tmpfs 不允許指定任何可配置選項。
--tmpfs 不能用于 swarm service,必須使用 --mount。

tmpfs 容器的限制

tmpfs 掛載不能在容器間共享。 tmpfs 只能在 Linux 容器上工作,不能在 windows 容器上工作。

容器中使用 tmpfs

$ 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 選項

tmpfs 掛載允許兩個配置選項,這兩個都是不需要的。如果您需要指定這些選項,則必須使用該 --mount 標志,因為該 --tmpfs 標志不支持它們。

選項描述
tmpfs-sizetmpfs 的大小,以字節(jié)為單位。無限制默認。
tmpfs-modetmpfs 的八進制文件模式。例如,700 或者 0770。默認為 1777 或全局可寫。

以下示例將設(shè)置 tmpfs-mode 為 1770,以便在容器內(nèi)不可全局讀取。

docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app,tmpfs-mode=1770 \
  nginx:latest

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何管理Docker數(shù)據(jù)”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI