Docker 數據管理介紹

默認容器的數據是保存在容器的可讀寫層,當容器被刪除時其上的數據也會丟失,所以為了實現數據的持久性則需要選擇一種數據持久技術來保存數據。官方提供了三種存儲方式:Volumes、Bind mounts和tmpfs。前面還介紹了:Docker 服務終端 UI 管理工具

數據存儲方式

從現在開始,我們學習?Docker 容器的數據存儲方式,你也可以先了解一下Docker 數據持久化的三種方案。

Bind mount 會覆蓋容器中的文件,而 volume mount 則不會。即如果容器中已有文件,則會將文件同步到主機的目錄上。此方式與 Linux 系統的 mount 方式很相似,即是會覆蓋容器內已存在的目錄或文件,但并不會改變容器內原有的文件,當 umount 后容器內原有的文件就會還原。

圖片

數據卷(Volumes)

  • 由docker創建和管理,且與主機的核心功能隔離

  • 無論是命名還是匿名數據卷,都存儲在/var/lib/docker/volumes/下面

  • 定義的數據卷可以在多個容器中同時使用,且不會自動刪除

  • 允許容器將內容保存到遠端、云服務提供商、加密內容等等

掛在主機目錄(Bind mounts)

  • 與數據卷相比,掛在主機目錄具有有限的功能

  • 應用的文件或者目錄事先不需要存在,用時會自動創建

  • 該方式允許訪問容器的敏感文件,可能會產生安全隱患

內存映射(tmpfs)

  • 僅存儲在容器的內存中,永遠不會寫入文件系統

  • swarm服務使用tmpfs掛載將敏感信息掛載到容器中

數據卷 - volumes

數據卷是存儲在?Docker 容器的特定目錄下面

優勢說明

Docker Volumes 機制通常用來給 Docker 容器保存持久化數據,使用 Volumes 有很多優勢:

  • 更容易進行備份和數據遷移

  • 使用 Docker CLI 命令或者 Docker API 來管理

  • 可以在 Linux 和 Windows 操作系統上使用

  • 可以更安全得在多個容器中共享

  • Volume drivers 允許容器將內容保存到遠端、云服務提供商、加密 volume 內容

  • 新 Volume 的內容可以被容器預先填充

Volumes 通常也優于容器的可寫層,使用 Volumes 不會增加容器的體積,并且 Volumes 的內容存儲在外部獨立于容器的生命周期。如果容器不產生持久化數據,可以考慮使用 tmpfs 內存映射(只保存在容器的內存中)的方式來避免數據存儲在其他可能的地方,避免增加容器的體積。

使用說明

最開始的時候 -v 或者 --volume 選項是給單獨容器使用,而 --mount 選項是給集群服務使用。但是從 Docker 17.06 開始,也可以在單獨容器上使用 --mount。通常來講 --mount 選項也更加具體和詳細。-v 選項將所有選項集中到一個值,而 --mount 選項將可選項分開。如果需要指定 volume driver 選項,那么必須使用 --mount 選項。

#?創建一個數據卷
$?docker?volume?create?my-vol#?查看所有的數據卷
$?docker?volume?ls#?查看指定數據卷的信息
$?docker?volume?inspect?my-vol
[{"Driver":?"local","Labels":?{},"Mountpoint":?"/var/lib/docker/volumes/my-vol/_data","Name":?"my-vol","Options":?{},"Scope":?"local"}
]#?移除指定數據卷的
$?docker?volume?rm?my-vol#?清除無主的數據卷
$?docker?volume?prune
#?啟動一個掛載數據卷的容器
$?docker?run?-d?-P?--name?web?\-v?my-vol:/wepapp?\training/webapp?python?app.py$?docker?run?-d?-P?--name?web?\--mount?source=my-vol,target=/webapp?\training/webapp?python?app.py#?啟動一個掛載數據卷的服務
$?docker?service?create?-d?--name?devtest-service?\--mount?source=myvol2,target=/app?\nginx:latest
#?掛載為只讀模式
$?docker?run?-d?--name=nginxtest?\-v?nginx-vol:/usr/share/nginx/html:ro?\nginx:latest#?type可以分為bind、volume、tmpfs,?默認為volume
#?source用于設置數據卷的名稱,匿名數據卷可以省略
#?target表示需要掛載到容器里面的地方
#?readonly表示掛載的內容為只讀模式,可選
#?volume-opt表示可以使用多次,可選
$?docker?run?-d?--name=nginxtest?\--mount?source=nginx-vol,destination=/usr/share/nginx/html,readonly?\nginx:latest
[3]?掛載遠程數據卷
#?插件sshfs允許您輕松地在容器中掛載遠程文件夾#?下載該插件
$?docker?plugin?install?--grant-all-permissions?vieux/sshfs#?使用該驅動創建ssh數據卷
$?docker?volume?create?--driver?vieux/sshfs?\-o?sshcmd=test@node2:/home/test?\-o?password=testpassword?\-o?port=3336?\sshvolume#?啟動該驅動程序創建卷創建容器
#?如果兩個容器配置了可信關系,就不需要設置volume-opt密碼了
$?docker?run?-d?\--name?sshfs-container?\--volume-driver?vieux/sshfs?\--mount?src=sshvolume,target=/app,?\volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword?\nginx:latest

圖片

掛載主機目錄 - bind mounts

掛載主機目錄是將主機中的特定目錄直接掛在到容器內部使用

使用說明

#?使用bind模式啟動容器
$?docker?run?-d?-it?--name?devtest?\-v?"$(pwd)"/target:/app?\nginx:latest$?docker?run?-d?-it?--name?devtest?\--mount?type=bind,source="$(pwd)"/target,target=/app?\nginx:latest#?看下對應的信息
$?docker?inspect?devtest
"Mounts":?[{"Type":?"bind","Source":?"/tmp/source/target","Destination":?"/app","Mode":?"","RW":?true,"Propagation":?"rprivate"}
],
#?掛載為只讀模式
$?docker?run?-d?-it?--name?devtest?\-v?"$(pwd)"/target:/app:ro?\nginx:latest$?docker?run?-d?-it?--name?devtest?\--mount?type=bind,source="$(pwd)"/target,target=/app,readonly?\nginx:latest

特殊屬性

圖片

$?docker?run?-d?-it?--name?devtest?\-v?"$(pwd)"/target:/app?\-v?"$(pwd)"/target:/app2:ro,rslave?\nginx:latest$?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

內存映射 - tmpfs

內存映射是將內存映射到容器內供容器內部使用

優勢說明

最開始 --tmpfs 是給單獨容器使用,而 --mount 選項是給 swarm 集群服務使用的。但是,從 Docker 17.06 開始,也可以在單獨容器上使用 --mount 了。通常說來,--mount 更明確,更冗長。最大的區別是 --tmpfs 標志不支持任何可配置選項。其中 --tmpfs 只能在容器中使用,而 swarm 集群則必須使用 --mount 來使用 tmpfs 內存映射。

使用說明

#?容器上使用
$?docker?run?-d?-it?--name?tmptest?\--tmpfs?/app?\nginx:latest$?docker?run?-d?-it?--name?tmptest?\--mount?type=tmpfs,destination=/app?\nginx:latest

日志驅動 - logs

在容器外部查看容器內部的日志輸出情況,便于排除和監控問題

可以利用 docker logs 命令,查看 Docker 容器內部應用程序運行時所產生的日志。可以免除首先進入 Docker 容器,再打開應用程序的日志文件的過程。docker logs 會監控容器中操作系統的標準輸出設備(STDOUT),一旦 STDOUT 有數據產生,就會將這些數據傳輸到另一個設備中,則被稱為日志驅動(Logging Driver)。

#?動態查看日志內容
$?docker?logs?-f?netdata
Docker 是怎樣做到的呢?我們使用 docker info 命令,可以看到 Docker 容器的相關信息,其中有一項 Logging Driver 的字段。
#?當前所設置的日志驅動類型
$?docker?info?|?grep?'Logging?Driver'
Logging?Driver:?json-file

圖片

我們可以在 docker run 命令中通過 --log-driver 參數來設置具體的 Docker 日志驅動,也可以通過 --log-opt 參數來指定對應日志驅動的相關選項。

docker?run?-d?-p?80:80?--name?nginx?\--log-driver?json-file?\?#?設置日志驅動--log-opt?max-size=10m?\?#?表示JSON文件最大為10MB,超過則生成新的文件--log-opt?max-file=3?\???#?表示JSON文件最多保存3個,超過則刪除多余文件nginx
#?當然,可以在配置文件中添加,全局生效
$?cat?/etc/docker/daemon.json
{"log-driver":?"syslog"
}#?修改配置之后重啟服務
$?sudo?systemctl?restart?docker

額外,需要注意的是,默認情況下,Docker 將日志存儲到一個日志文件。

#?檢查日志文件路徑
$?docker?inspect?--format='{{.LogPath}}'?netdata
/var/lib/docker/containers/556553bcb5xxx13cbc588a4-json.log#?查看實時日志信息
$?tail?-f?`docker?inspect?--format='{{.LogPath}}'?netdata`

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535426.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker 數據持久化的三種方案

容器中的數據可以存儲在容器層。但是將數據存放在容器層存在以下問題: 數據不是持久化。意思是如果容器刪除了,這些數據也就沒了 主機上的其它進程不方便訪問這些數據 對這些數據的I/O會經過存儲驅動,然后到達主機,引入了一層間…

Git 存儲原理及相關實現

Git 是目前最流行的版本控制系統,從本地開發到生產部署,我們每天都在使用 Git 進行我們的版本控制,除了日常使用的命令之外,如果想要對 Git 有更深一步的了解,那么研究下 Git 的底層存儲原理將會對理解 Git 及其使用非…

Git內部原理

Git有什么特點? fast,scalable,distributed revision control system(快速,可擴展的分布式版本控制系統) 幾乎所有操作都是本地執行 每一個clone都是整個生命周期的完整副本 the stupid content tracker&a…

git存儲原理

四種數據類型 實際上Git基于數據類型的不同,把對象分為四種:數據對象、樹對象、提交對象、標簽對象。Git文件系統的設計思路與linux文件系統相似,即將文件的內容與文件的屬性分開存儲,文件內容以“裝滿字節的袋子”存儲在文件系統…

詳解設計模式:中介者模式

中介者模式(Mediator Pattern)也被稱為調停者模式,是在 GoF 23 種設計模式中定義了的行為型模式。 中介者模式 是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,并支…

rebase參數以及注意事項

可以根據需要將pick參數,改變為下面代表不同作用的參數;這樣就可以對節點C和D進行不同的操作了。比如: pick:默認參數,表示不對提交節點進行任何操作,直接應用原提交節點。不創建新提交; rewor…

RPC 服務 與 HTTP 服務的區別

1、什么是RPC RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信…

Docker 網絡命名空間

Docker 用戶可以通過與 CNM 的 Object 以及 API 的交互來管理對應容器的網絡,下面是一個典型的容器網絡生命周期: 1、Driver要向NetworkController注冊。內置的Driver在Libnetwork內注冊,遠程的Driver則通過Plugin mechanism注冊。每一個Driv…

緩存雪崩、擊穿、穿透解決方案

用戶的數據一般都是存儲于數據庫,數據庫的數據是落在磁盤上的,磁盤的讀寫速度可以說是計算機里最慢的硬件了。 當用戶的請求,都訪問數據庫的話,請求數量一上來,數據庫很容易就奔潰的了,所以為了避免用戶直…

Ansible中的playbook詳解

首先簡單說明一下playbook,playbook是什么呢? 根本上說playbook和shell腳本沒有任何的區別,playbook就像shell一樣,也是把一堆的命令組合起來,然后加入對應條件判斷等等,在shell腳本中是一條一條的命令&am…

【Docker】容器鏡像有哪些特性

首先解釋一下什么是Docker鏡像? Docker鏡像它其實是一個模板,擁有這個模板我們才能創建我們的Docker容器,鏡像里含有啟動 docker 容器所需的文件系統結構及其內容,因此是啟動一個 docker 容器的基礎。docker 鏡像的文件內容以及一…

nginx中的location指令

1、location 介紹 location是Nginx中的塊級指令(block directive),location指令的功能是用來匹配不同的url請求,進而對請求做不同的處理和響應,這其中較難理解的是多個location的匹配順序,本文會作為重點來解釋和說明。 開始之前…

容器底層實現技術Namespace/Cgroup

Docker容器實現原理 Docker容器在實現上是通過namespace技術來進行進程隔離,通過cgroup技術實現容器進程可用資源的限制,當docker啟動一個容器時,實際是創建了多了namespace參數的進程。 Namespace Namespace:命名空間 作用&#…

身體原因 斷更一周

由于眾所周知的原因,博主最近具有發熱、全身乏力、酸痛、干咳等癥狀,已嚴重影響日常的工作學習和博客編寫,所以斷更我將一周,由下周三(即2022年12月21日)恢復更新 更多往期內容可以參考:全網最…

異方差與多重共線性對回歸問題的影響

異方差的檢驗 1.異方差的畫圖觀察 2.異方差的假設檢驗,假設檢驗有兩種,一般用懷特檢驗使用方法在ppt中,課程中也有實驗,是一段代碼。 異方差的解決辦法 多重共線性 多重共線性可能帶來的影響: 多重共線性的檢驗 多重…

如何修改Docker的鏡像源

改或新增/etc/docker/daemon.json 文件 vi/etc/docker/daemon.json 添加需要修改的國內鏡像源鏡像源 { "registry-mirrors":["http://hub-mirror.c.163.com"] } 重啟Docker服務 Systemctl restart docker.service 方法二 修改或新增 /etc/sysconfig…

nginx 的 rewrite 模塊

ngxhttprewrite_module 模塊用來使用正則表達式(PCRE)改變請求的 URI,返回重定向,并有條件地選擇配置。 指令執行順序 首先順序執行 server 塊中的 rewrite 模塊指令,得到 rewrite 后的請求 URI 然后循環執行如下指令…

所有的Python庫

庫名稱簡介 Chardet字符編碼探測器,可以自動檢測文本、網頁、xml的編碼。 colorama主要用來給文本添加各種顏色,并且非常簡單易用。 Prettytable主要用于在終端或瀏覽器端構建格式化的輸出。 difflib,[Python]標準庫,計算文本…

Oracle行轉列語法總結大全

一、decode語法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Shell 各種符號 之 含義

#!&#xff1a;符號能夠被內核識別成是一個腳本的開始&#xff0c;這一行必須位于腳本的首行 $0&#xff1a;當前腳本的名字 $#&#xff1a;輸入<調用>參數(腳本或函數的位置參數) 的個數&#xff0c;如 NumArg$#&#xff1b;echo"\$#: $#;\$NumArg: $NumArg"…