一:前言

 在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. 【BZOJ1095】【ZJOI2007】捉迷藏

    前言 好恶心的一道题,代码写了2.5h,调试调了5h+,局部重构了n遍. 题意 一棵树上的节点有黑白两色,初始为黑,支持修改颜色,查询最远黑点对.$n<=10^5,m<=5*10^5$ 题 ...

  2. BZOJ 5306: [Haoi2018]染色 二项式反演+NTT

    给定长度为 $n$ 的序列, 每个位置都可以被染成 $m$ 种颜色中的某一种. 如果恰好出现了 $s$ 次的颜色有 $k$ 种, 则会产生 $w_{k}$ 的价值. 求对于所有可能的染色方案,获得价值 ...

  3. 常用方法 DataTable转换为Entitys

    备注:摘自网上 有附地址 public static List<T> DataTableToEntities<T>(this DataTable dt) where T : c ...

  4. select函数及fd_set介绍

    1. select函数 1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在 ...

  5. 如何高效的阅读uni-app框架?(建议收藏)

    作者 | Jeskson来源 | 达达前端小酒馆 uni-app的框架,配置:page.json,manifest.json,package.json,vue.config.js.脚本,应用程序,ma ...

  6. JavaScript 箭头函数

    ES6新标准增加了一种新的函数,箭头函数. x=>x*x 相当于: function (x){ return x*x; } 如果参数不是一个,就需要用括号()括起来: // 两个参数:var t ...

  7. Content-type解析

    一.是什么? 是Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request header和response header里都存在. Content-Type(内容类型),一 ...

  8. Java 内存排查,慢慢收集总结

    Java堆外内存排查小结: https://mp.weixin.qq.com/s?__biz=MzA4MTc4NTUxNQ==&mid=2650518612&idx=2&sn= ...

  9. In Vitro model验证 | Harnessing single-cell genomics to improve the physiological fidelity of organoid-derived cell types

    Transcriptional benchmarking of in vitro cells to in vivo with single-cell rna-seq - 简介 Harnessing s ...

  10. 浅析String.intern()方法

    1.String类型“==”比较样例代码如下:package com.luna.test;public class StringTest { public static void main(Strin ...