一:前言

 在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容器数据管理(数据卷&数据卷容器)的更多相关文章

  1. Docker数据管理(数据卷&数据卷容器)

    生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷(Data Volumes):容 ...

  2. 实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作

    Docker内部数据管理和Docker之间的数据共享为数据卷和数据卷容器,实例解析1.将本地的文件作为容器的数据卷,2.数据卷flocker插件实现容器集群(或者Docker Swarm)的数据共享3 ...

  3. Docker容器学习梳理 - Volume数据卷使用

    之前部署了Docker容器学习梳理--基础环境安装,接下来看看Docker Volume的使用. Docker volume使用 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker ...

  4. docker挂载本地目录和数据卷容器

    1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行docker run -it -v /home/dock/Downloads:/usr/Downloa ...

  5. docker卷挂载与容器内外互相拷贝数据

    一.宿主机与容器的挂载 docker可以支持把一个宿主机上的目录挂载到镜像里.命令如下: docker run -it -v /mydownload:/download nginx:v1 /bin/b ...

  6. 1.docker介绍、命令、容器、镜像、数据卷、Dockerfile、常用软件安装、推送阿里云

    一.docker介绍 1.docker是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各 ...

  7. Docker系列(20)- 数据卷容器

    数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...

  8. docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。

    一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...

  9. docker血一样的教训,生成容器的时候一定要设置数据卷,把数据文件目录,配置文件目录,日志文件目录都要映射到宿主机上保存啊!!!

    打个比方,比如mysql,如果你想重新设置一下mysql的配置,不小心配错里,启动容器失败,已启动就停止了. 根本进不去mysql的容器里.如果之前run容器的时候,没有把数据文件,日志文件,配置文件 ...

随机推荐

  1. STL next_permutation 全排列

    调用方法: ]={,,,}; )){ ;i<;i++) printf("%d ",arr[i]); puts(""); } 测试效果: 注:可以看到1 2 ...

  2. 第03组 Alpha冲刺(4/4)

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  3. 【luoguP5490】【模板】扫描线

    求\(n\)个矩形的面积并,可以用线段树维护一条垂直于\(y\)轴的直线上被矩形覆盖的长度有多少长,将直线从左往右扫一遍,遇到矩形左边界就+1,遇到右边界就-1,不为\(0\)的位置就表示没有覆盖 不 ...

  4. centos7 安装 bugfree3

    . 安装apache yum install httpd . 安装mysql wget -i -c http://dev.mysql.com/get/mysql57-community-release ...

  5. java并发编程(三)cpu cache & 缓存一致性

    一 cpu cache 1. cache的意义    为什么需要CPU cache?因为CPU的频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源.所以cache的出 ...

  6. 冰多多团队-第四次Scrum会议

    冰多多团队-第四次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj 撰写团队任务拆解博客 完成部分Action的实现 牛雅哲 完成了词典单词,词典映射的代码实现,设计了初步的词典异常 ...

  7. Ubuntu 14.04下超级终端Minicom连接ARM(转)

    转自:https://blog.csdn.net/ajianyingxiaoqinghan/article/details/70209765 笔者的工作环境: PC系统:Ubuntu 14.04 LT ...

  8. Debian 9安装java与设置环境变量

    安装默认JRE / JDK 先更新软件包索引: apt update 检查是否已安装Java: java -version 如果当前未安装Java,您将看到以下输出: Output-bash: jav ...

  9. odoo开发笔记 -- 还原数据库后,异常:ir_attachment: IOError: [Errno 2] No such file or directory: u'/var/...'

    场景描述: 恢复Odoo数据后,抛出错误导致无法进入页面 -- ::, INFO aeo odoo.addons.base.ir.ir_attachment: _read_file reading / ...

  10. 在线visio软件,在线流程图软件,在线绘图、在线画图

    1. https://www.bullmind.com/ 推荐bullmind的在线visio软件,一种低成本的Visio替代品.bullmind是基于 网络的绘图工具,具有出色图表功能.您可以使用b ...