Docker容器数据管理(数据卷&数据卷容器)
一:前言
在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案:
1)数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境的指定文件目录之中,可以理解为容器挂载一个虚拟数据卷然后
映射到一个主机目录中
2)数据卷容器(Data Volume Containers):用专门的容器来挂载数据卷,其他容器通过挂载这个父容器来实现数据共享,这个专门挂载
数据卷的容器就是数据卷容器,简单的总结就是有一个容器来专门管理数据的持久化和容器之间数据共享
前者常用于单一容器数据持久化,后者常用于多容器之间的数据共享和数据持久化
二:数据卷(Data Volumes)
我们可以在镜像程序运行时通过"-v /主机目录文件名:/容器目录名" 命令,将容器卷指定一个主机目录,这样我们的程序运行的数据就可以持久
保存到这个映射的主机目录文件当中。
我们举一个实际的例子,此处用一个简单.Asp Core程序为例子:
我们写一个Asp Core web程序,然后请求这个程序的get()接口,这个接口会将记录日志文件保存到服务器指定的文件中,从而通过这个程序实现
Docker容器数据的持久化(记录日志到本地)
日志记录类代码
public class FileLogger
{
private static string sPath = AppContext.BaseDirectory + "filelogs";
public static void LogWrite(string Messge)
{
try
{
using (FileStream fs = new FileStream(FilePath(sPath), FileMode.Append))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
{
sw.WriteLine(DateTime.Now.ToString("【HH:mm:ss】") + Messge);
sw.Close();
fs.Close();
}
}
}
catch (Exception)
{
}
}
public static void LogError(Exception ex)
{
LogWrite($"[数据日志记录异常]\n|异常时间:{DateTime.Now.ToString()};\n|异常信息|{ex.Message};\n|异常位置|{ex.StackTrace.Trim()}");
}
private static string FilePath(string PathStr)
{
if (!Directory.Exists(PathStr))
{
Directory.CreateDirectory(PathStr);
}
return PathStr + "/" + GetFileName();
}
private static string GetFileName()
{
return DateTime.Now.ToString("yyyyMMdd") + ".txt";
}
}
接口调用代码:
[HttpGet]
public dynamic Get()
{
FileLogger.LogWrite("这条日志会被保存到/root/webapi/logs/下面");
return "ok";
}
然后我们将这个程序打包,然后通过Dockerfile构建成成镜像然后部署到Docker容器中
如果不会Linux打包部署Asp Core程序的建议先看这篇文章:传送门
Dockerfile文件如下
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /data
COPY . .
EXPOSE 8083
ENV ASPNETCORE_URLS http://+:8083
ENTRYPOINT ["dotnet", "MyLog.dll"]
然后在包含Dockerfile的项目目录下面运行命令构建镜像(不要掉了最后面那个小数点):
$ docker build -t mylog .
镜像构建完成后我们运行镜像到容器中,此时我们就可以-v 命令指定数据卷
此处/root/webapi/logs代表主机目录,/data/filelogs代表容器目录
$ docker run --name=mylog -p 8083:8083 -d -v /root/webapi/logs:/data/filelogs mylog
容器运行成功后我们我们查看容器详情
$ docker inspect 容器ID
我们可以看到"Mounts"节点下会有如图显示

最后我们测试一下,请求程序的get接口,然后在/root/webapi/logs可以看到我们记录的日志文件

三 数据卷容器
如我我们经常需要多个容器之间进行数据共享我们需要用到命令“--volumes-from”
具体实例:
1)我们从仓库拉一个centos的容器镜像
$ docker pull centos
2)然后运行这个镜像并创建一个数据卷挂载到/mydata
$ docker run -it -v /mydata --name mycentos centos
3)再运行两个容器,在这两个容器中使用--volumes-from来挂载mycentos容器中的数据卷.
$ docker run -it --volumes-from mycentos --name soncentos1 centos
$ docker run -it --volumes-from mycentos --name soncentos2 centos
此时,容器soncentos1和soncentos2都挂载同一个数据卷到相同的/mydata 目录。三个容器任何一方在该目录下的写入数据,其他容器都可以看到。
注:
可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。
使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它
的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
Docker容器数据管理(数据卷&数据卷容器)的更多相关文章
- Docker数据管理(数据卷&数据卷容器)
生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷(Data Volumes):容 ...
- 实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作
Docker内部数据管理和Docker之间的数据共享为数据卷和数据卷容器,实例解析1.将本地的文件作为容器的数据卷,2.数据卷flocker插件实现容器集群(或者Docker Swarm)的数据共享3 ...
- Docker容器学习梳理 - Volume数据卷使用
之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...
- docker挂载本地目录和数据卷容器
1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行docker run -it -v /home/dock/Downloads:/usr/Downloa ...
- docker卷挂载与容器内外互相拷贝数据
一.宿主机与容器的挂载 docker可以支持把一个宿主机上的目录挂载到镜像里.命令如下: docker run -it -v /mydownload:/download nginx:v1 /bin/b ...
- 1.docker介绍、命令、容器、镜像、数据卷、Dockerfile、常用软件安装、推送阿里云
一.docker介绍 1.docker是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各 ...
- Docker系列(20)- 数据卷容器
数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...
- docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。
一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...
- docker血一样的教训,生成容器的时候一定要设置数据卷,把数据文件目录,配置文件目录,日志文件目录都要映射到宿主机上保存啊!!!
打个比方,比如mysql,如果你想重新设置一下mysql的配置,不小心配错里,启动容器失败,已启动就停止了. 根本进不去mysql的容器里.如果之前run容器的时候,没有把数据文件,日志文件,配置文件 ...
随机推荐
- 项目(1-1)ES32获取mpu9250数据网页交互显示
教程 https://www.hackster.io/donowak/esp32-mpu9250-3d-orientation-visualisation-467dc1 项目地址 https://gi ...
- LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)
题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...
- 洛谷P2607题解
想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...
- python 类的倒入
test.pyclass sss: def ddd(self): print("hello") test2.pyfrom testone import sss
- jmeter(五十一)_性能测试中的服务器资源监控与分析
概述 性能测试过程中,对服务器资源的监控是必不可少的.这里的资源又分了两块,windows和linux linux下监控资源 访问网址http://jmeter-plugins.org/downl ...
- Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...
- centos7.6使用 supervisor 对filebeat7.3.1进程进行管理
centos7.6使用 supervisor 对filebeat7.3.1进程进行管理 Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX ...
- Redis 服务监控 redis-faina 命令查看 和 redis-live 界面查看
Redis现在在很多公司中应用已经很广泛了,但是如何监控redis,实时的观察redis的性能,下面就关于Redis的常用监控介绍一下. 一.使用redis自带的info命令和monitor命令现在常 ...
- nginx 分离配置文件 conf.d和default.conf
1. 在 nginx.conf 文件中引用 conf.d 下的所有配置文件 #在http配置节的末尾添加配置引用 http { ... #gzip on; include /etc/nginx/con ...
- Python原生调试工具pdb实践小结
使用python -m pdb xxx.py进入单步调试模式,默认会在脚本的第一行可执行命令处停止.此时,通过 b function设置之后的函数断点会提示出错,从出错异常栈中可以看出,pdb是将fu ...