Docker 数据管理介绍
默認(rèn)容器的數(shù)據(jù)是保存在容器的可讀寫層,當(dāng)容器被刪除時其上的數(shù)據(jù)也會丟失,所以為了實現(xiàn)數(shù)據(jù)的持久性則需要選擇一種數(shù)據(jù)持久技術(shù)來保存數(shù)據(jù)。官方提供了三種存儲方式:Volumes、Bind mounts和tmpfs。前面還介紹了:Docker 服務(wù)終端 UI 管理工具
數(shù)據(jù)存儲方式
從現(xiàn)在開始,我們學(xué)習(xí)?Docker 容器的數(shù)據(jù)存儲方式,你也可以先了解一下Docker 數(shù)據(jù)持久化的三種方案。
Bind mount 會覆蓋容器中的文件,而 volume mount 則不會。即如果容器中已有文件,則會將文件同步到主機的目錄上。此方式與 Linux 系統(tǒng)的 mount 方式很相似,即是會覆蓋容器內(nèi)已存在的目錄或文件,但并不會改變?nèi)萜鲀?nèi)原有的文件,當(dāng) umount 后容器內(nèi)原有的文件就會還原。
數(shù)據(jù)卷(Volumes)
-
由docker創(chuàng)建和管理,且與主機的核心功能隔離
-
無論是命名還是匿名數(shù)據(jù)卷,都存儲在/var/lib/docker/volumes/下面
-
定義的數(shù)據(jù)卷可以在多個容器中同時使用,且不會自動刪除
-
允許容器將內(nèi)容保存到遠(yuǎn)端、云服務(wù)提供商、加密內(nèi)容等等
掛在主機目錄(Bind mounts)
-
與數(shù)據(jù)卷相比,掛在主機目錄具有有限的功能
-
應(yīng)用的文件或者目錄事先不需要存在,用時會自動創(chuàng)建
-
該方式允許訪問容器的敏感文件,可能會產(chǎn)生安全隱患
內(nèi)存映射(tmpfs)
-
僅存儲在容器的內(nèi)存中,永遠(yuǎn)不會寫入文件系統(tǒng)
-
swarm服務(wù)使用tmpfs掛載將敏感信息掛載到容器中
數(shù)據(jù)卷 - volumes
數(shù)據(jù)卷是存儲在?Docker 容器的特定目錄下面
優(yōu)勢說明
Docker Volumes 機制通常用來給 Docker 容器保存持久化數(shù)據(jù),使用 Volumes 有很多優(yōu)勢:
-
更容易進(jìn)行備份和數(shù)據(jù)遷移
-
使用 Docker CLI 命令或者 Docker API 來管理
-
可以在 Linux 和 Windows 操作系統(tǒng)上使用
-
可以更安全得在多個容器中共享
-
Volume drivers 允許容器將內(nèi)容保存到遠(yuǎn)端、云服務(wù)提供商、加密 volume 內(nèi)容
-
新 Volume 的內(nèi)容可以被容器預(yù)先填充
Volumes 通常也優(yōu)于容器的可寫層,使用 Volumes 不會增加容器的體積,并且 Volumes 的內(nèi)容存儲在外部獨立于容器的生命周期。如果容器不產(chǎn)生持久化數(shù)據(jù),可以考慮使用 tmpfs 內(nèi)存映射(只保存在容器的內(nèi)存中)的方式來避免數(shù)據(jù)存儲在其他可能的地方,避免增加容器的體積。
使用說明
最開始的時候 -v 或者 --volume 選項是給單獨容器使用,而 --mount 選項是給集群服務(wù)使用。但是從 Docker 17.06 開始,也可以在單獨容器上使用 --mount。通常來講 --mount 選項也更加具體和詳細(xì)。-v 選項將所有選項集中到一個值,而 --mount 選項將可選項分開。如果需要指定 volume driver 選項,那么必須使用 --mount 選項。
#?創(chuàng)建一個數(shù)據(jù)卷 $?docker?volume?create?my-vol#?查看所有的數(shù)據(jù)卷 $?docker?volume?ls#?查看指定數(shù)據(jù)卷的信息 $?docker?volume?inspect?my-vol [{"Driver":?"local","Labels":?{},"Mountpoint":?"/var/lib/docker/volumes/my-vol/_data","Name":?"my-vol","Options":?{},"Scope":?"local"} ]#?移除指定數(shù)據(jù)卷的 $?docker?volume?rm?my-vol#?清除無主的數(shù)據(jù)卷 $?docker?volume?prune #?啟動一個掛載數(shù)據(jù)卷的容器 $?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#?啟動一個掛載數(shù)據(jù)卷的服務(wù) $?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,?默認(rèn)為volume #?source用于設(shè)置數(shù)據(jù)卷的名稱,匿名數(shù)據(jù)卷可以省略 #?target表示需要掛載到容器里面的地方 #?readonly表示掛載的內(nèi)容為只讀模式,可選 #?volume-opt表示可以使用多次,可選 $?docker?run?-d?--name=nginxtest?\--mount?source=nginx-vol,destination=/usr/share/nginx/html,readonly?\nginx:latest [3]?掛載遠(yuǎn)程數(shù)據(jù)卷 #?插件sshfs允許您輕松地在容器中掛載遠(yuǎn)程文件夾#?下載該插件 $?docker?plugin?install?--grant-all-permissions?vieux/sshfs#?使用該驅(qū)動創(chuàng)建ssh數(shù)據(jù)卷 $?docker?volume?create?--driver?vieux/sshfs?\-o?sshcmd=test@node2:/home/test?\-o?password=testpassword?\-o?port=3336?\sshvolume#?啟動該驅(qū)動程序創(chuàng)建卷創(chuàng)建容器 #?如果兩個容器配置了可信關(guān)系,就不需要設(shè)置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
掛載主機目錄是將主機中的特定目錄直接掛在到容器內(nèi)部使用
使用說明
#?使用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#?看下對應(yīng)的信息 $?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內(nèi)存映射 - tmpfs
內(nèi)存映射是將內(nèi)存映射到容器內(nèi)供容器內(nèi)部使用
優(yōu)勢說明
最開始 --tmpfs 是給單獨容器使用,而 --mount 選項是給 swarm 集群服務(wù)使用的。但是,從 Docker 17.06 開始,也可以在單獨容器上使用 --mount 了。通常說來,--mount 更明確,更冗長。最大的區(qū)別是 --tmpfs 標(biāo)志不支持任何可配置選項。其中 --tmpfs 只能在容器中使用,而 swarm 集群則必須使用 --mount 來使用 tmpfs 內(nèi)存映射。
使用說明
#?容器上使用 $?docker?run?-d?-it?--name?tmptest?\--tmpfs?/app?\nginx:latest$?docker?run?-d?-it?--name?tmptest?\--mount?type=tmpfs,destination=/app?\nginx:latest日志驅(qū)動 - logs
在容器外部查看容器內(nèi)部的日志輸出情況,便于排除和監(jiān)控問題
可以利用 docker logs 命令,查看 Docker 容器內(nèi)部應(yīng)用程序運行時所產(chǎn)生的日志。可以免除首先進(jìn)入 Docker 容器,再打開應(yīng)用程序的日志文件的過程。docker logs 會監(jiān)控容器中操作系統(tǒng)的標(biāo)準(zhǔn)輸出設(shè)備(STDOUT),一旦 STDOUT 有數(shù)據(jù)產(chǎn)生,就會將這些數(shù)據(jù)傳輸?shù)搅硪粋€設(shè)備中,則被稱為日志驅(qū)動(Logging Driver)。
#?動態(tài)查看日志內(nèi)容 $?docker?logs?-f?netdata Docker 是怎樣做到的呢?我們使用 docker info 命令,可以看到 Docker 容器的相關(guān)信息,其中有一項 Logging Driver 的字段。 #?當(dāng)前所設(shè)置的日志驅(qū)動類型 $?docker?info?|?grep?'Logging?Driver' Logging?Driver:?json-file我們可以在 docker run 命令中通過 --log-driver 參數(shù)來設(shè)置具體的 Docker 日志驅(qū)動,也可以通過 --log-opt 參數(shù)來指定對應(yīng)日志驅(qū)動的相關(guān)選項。
docker?run?-d?-p?80:80?--name?nginx?\--log-driver?json-file?\?#?設(shè)置日志驅(qū)動--log-opt?max-size=10m?\?#?表示JSON文件最大為10MB,超過則生成新的文件--log-opt?max-file=3?\???#?表示JSON文件最多保存3個,超過則刪除多余文件nginx #?當(dāng)然,可以在配置文件中添加,全局生效 $?cat?/etc/docker/daemon.json {"log-driver":?"syslog" }#?修改配置之后重啟服務(wù) $?sudo?systemctl?restart?docker額外,需要注意的是,默認(rèn)情況下,Docker 將日志存儲到一個日志文件。
#?檢查日志文件路徑 $?docker?inspect?--format='{{.LogPath}}'?netdata /var/lib/docker/containers/556553bcb5xxx13cbc588a4-json.log#?查看實時日志信息 $?tail?-f?`docker?inspect?--format='{{.LogPath}}'?netdata`總結(jié)
以上是生活随笔為你收集整理的Docker 数据管理介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis(四):String字符串数据
- 下一篇: Docker原理之UnionFS