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.mzph.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"…