Docker向数据卷Volume写入数据

一、前言

我们知道,镜像是只读的,容器是在镜像的基础上加了一层读写层,这样容器就可以写了。既然容器可以进行写入了,那么我们就可以把一些数据放进容器里面。但是这样会有一种问题:如果容器被删除了,那么容器里面的数据也将会被删除。这该怎么解决呢?这时我们就可以使用Volume来解决这种问题。

二、volume

1、什么是volume

我们先来考虑这样一个问题:如何把源代码放进容器里面

  • 可以在制作镜像时直接把源代码嵌入里面。(不考虑这种方式)
  • 把源代码挂载到容器的可读写层。

那么什么是Volume呢?

  • Volume(卷)是容器中一个特别种类的目录,通常叫做数据volume,顾名思义,里面可以放置各种类型的数据,例如代码、日志文件、数据文件等等。
  • Volume可以在容器间被共享和复用。可以让多个容器对同一个volume进行读写,也可以让一个容器读写多个volume。
  • 对镜像的更新并不会影响volume。
  • Volume是被持久化的,即使容器被删除,它仍然存在。

我们可以用下面的一张图来理解Volume

蓝色的部分表示容器,浅绿色的部分表示volume。可以在容器里面定义一个Volume,在容器里面的路径定义为/var/www,这里的路径是任意的。如果我们想把源代码写到/var/www路径里面,这个路径不应该是在容器里面,应该是在容器外部,否则容器被删除了,里面的数据也就随之被删除。

在来看下面一张图

在上图中,我们在容器里面的/var/www路径里面写入了一些东西,而这个路径就是Docker宿主里面挂载的一个文件夹。我们用上面的截图来说明,容器里面的/var/www的路径就是对于的docker宿主里面的/mnt路径,这个路径也是可以自定义的。 如果使用的是Linux操作系统或者Windows Server2016及以上版本的操作系统,这里的Docker宿主机就是操作系统。而在Windows10上面,其实是使用的一个Linux的虚拟机,这时的Docker宿主机是Linux虚拟机。

我们往容器的/var/www路径里面写入东西,其实是写入到了Docker宿主的/mnt路径下面,这样即使把容器删除掉了,数据还是会保存在Docker的宿主里面。除非docker宿主机的文件也被删除了,否则数据就会一直存在。

看下面的一个例子

docker run --name=nginx -d -p 4030:80 -v /var/www nginx

对上面命令的解释:

  • -v:表示在容器里面创建一个volume。指定容器里面创建的volume路径是/var/www,也就是路径的别名。这里没有指定docker宿主机里面的路径,docker就会在宿主机里面自动指定一个路径

如图所示

我们看到这个容器已经在运行了。我们使用inspect命令查看容器信息

docker inspect nginx

这里使用的是容器名称,也可以使用容器ID。

我们查看Mounts节点信息

在这个节点里面,我们可以看到容器里面的地址和Docker宿主机里面的地址。

我们进入Docker宿主机的目录查看

在docker的宿主机里面就可以看到自动生成的路径了。

上面的例子中,我们是使用的Docker自动生成的路径,我们还可以自定义写入路径。

我们在demo目录下面创建一个MyVolumn目录,然后把容器里面的路径指定到创建的MyVolumn目录

然后在执行下面的命令

docker run --name=nginx -d -p 4030:80 -v /demo/MyVolumn:/var/www nginx

对上面命令的解释如下

  • /demo/MyVolumn:表示Docker宿主机定义的目录。
  • /var/www:表示容器里面的目录。

如图所示

我们在使用inspect命令查看

查看Mounts节点

这里就是我们自定义的路径了。

2、写入操作

上面的两个例子中都没有数据写入操作,我们只看到生成了路径,不能知道路径下面有没有数据生成。下面看一个有写入操作的例子,通过这个例子,我们可以更直观地明白volume的作用。

我们使用VS2019创建一个ASP.NET Core MVC项目,然后在Program的Main方法里面写日志

using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace VolumnDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // 写文件,模拟写入功能
            using(StreamWriter sw=new StreamWriter(@"/var/www/text.txt",true))
            {
                sw.WriteLine("test");
                sw.Close();
            }
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

然后添加Dockerfile文件,项目在本地发布之后拷贝到Linux服务器上面。这里不在演示。

我们创建一个VolumnDemo目录

然后把刚才的项目拷贝到这个目录下面

使用下面的命令来构建一个镜像

docker build -t volumndemo .

如图所示

镜像构建成功以后运行容器,volume目录指向MyVolumn目录

docker run --name=volumndemo -d -p 9020:80 -v /demo/MyVolumn:/var/www volumndemo

如图所示

然后我们在浏览器里面访问9020端口

查看/demo/MyVolumn目录里面有没有文件生成

可以看到生成了text.txt文件。然后查看文件内容

我们在进入容器里面查看/var/www目录下面有没有文件生成

可以看到,www目录下面也有了text.txt文件生成。这个路径是在隐藏目录里面,所以要使用ls -a命令查看所有的目录,包括隐藏目录。

我们查看text.txt文件内容

这样就实现了容器里面的目录和docker宿主机目录的映射。 可以保证数据不丢失。

到此这篇关于Docker向数据卷Volume写入数据的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • docker中容器数据卷volume介绍

    目录 docker 容器数据卷volume 使用数据卷 方式一:直接使用命令挂载 -v 方式二:Dockerfile 数据卷容器 总结 docker 容器数据卷volume 如果数据都在容器中,那么我们删除容器的时候数据就会丢失,所以我们希望数据可以持久化. 例如MySQL容器,我们希望数据可以存储在本地,当MySQL容器删除的时候,数据不会丢失. 容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地,这就是卷技术.也就是数据挂载技术,将我们容器内的目录,挂载到Linux上

  • Docker中数据卷(volume)管理的两种方式

    上篇文章给大家介绍过 docker基础知识之挂载本地目录的方法 ,今天给大家介绍Docker中数据卷(volume)管理的两种方式,具体内容如下所示: 什么是数据卷 数据卷( volume ):volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 为什么要用数据卷 Docker分层文件系统存在的问题: Docker的镜像是由一系列的只读层组合而来的,当启动一个容器时, Docker加载镜像的所有只读层,并在最上

  • Docker数据存储之Volumes详解

    默认容器的数据的读写发生在容器的存储层,当容器被删除时其上的数据将会丢失.所以我们应该尽量保证容器存储层不发生写操作,为了实现数据的持久化存储我们需要选择一种方案来保存数据,当前有以下几种方式: Volumes Bind mounts tmpfs mounts 下图展示了这三种技术: Volumes Volumes(数据卷)是一个可供一个或多个容器使用的位于宿主机上特殊目录,它拥有以下特性: 数据卷可以在容器间共享和重用 对数据卷的写入操作,不会对镜像有任何影响 数据卷默认会一直存在,即使容器被

  • Docker volume 挂载卷的实现方法

    最简单的hello world输出镜像的制作是最简单的开始,但是如果我们需要修改我们的运行代码,或者有输入输出文件的时候,我们就没有办法了,每一个container运行完毕后,其分配的资源以及文件系统都会消失,那么我们就需要在本地给docker container挂载一个卷,这样在container运行的时候,container的挂载点下的文件操作,也同样会影响到给container挂载的本地卷.就像linux中的mount一样.这样我们只需要修改本地卷中的代码,而不需要修改image即可. 例

  • Docker volume使用详解及实例

    Docker volume使用 一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享.数据卷可以在多个容器之间共享. 创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然你也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,你就可以在其他容器中通过--volumes-froms参数来挂载该数据卷了,而不管该容器是否运行.你也可以在Dockerfile中通过VOLUME指令来增加一个或者多个数据卷. 如果

  • docker volumes 文件映射方式

    背景 在做区块链日志模块时,如果容器运行,需要把日志文件映射到宿主机上以方便查看.下面介绍一下我的实现方式. 实现 通过docker-compose配置文件volumes参数 配置文件示例: volumes: - /var/run/:/host/var/run/ - ./channel-artifacts:/var/hyperledger/configs - ./fabric_logs:/tmp/fabric_logs/ 把容器中/tmp/fabric_logs目录映射到宿主机当前目录下的./f

  • docker volume删除卷的操作

    prune 要使用此命令,客户端和守护程序API版本都必须至少为1.25.在客户端上使用docker version命令可以检查客户端和守护程序API版本. docker volume prune [OPTIONS] 删除未被任何容器使用的本地卷. OPTIONS 名称,简写 说明 --filter 提供过滤值. --force , -f 不提示确认信息,直接删除. rm 要使用此命令,客户端和守护程序API版本都必须至少为1.21.在客户端上使用docker version命令可以检查客户端和

  • Docker向数据卷Volume写入数据

    一.前言 我们知道,镜像是只读的,容器是在镜像的基础上加了一层读写层,这样容器就可以写了.既然容器可以进行写入了,那么我们就可以把一些数据放进容器里面.但是这样会有一种问题:如果容器被删除了,那么容器里面的数据也将会被删除.这该怎么解决呢?这时我们就可以使用Volume来解决这种问题. 二.volume 1.什么是volume 我们先来考虑这样一个问题:如何把源代码放进容器里面 可以在制作镜像时直接把源代码嵌入里面.(不考虑这种方式) 把源代码挂载到容器的可读写层. 那么什么是Volume呢?

  • 浅谈docker学习之docker数据卷(volume)

    1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们需要明确Docker内的文件系统是如何工作的.Docker镜像被存储在一系列的只读层.当我们开启一个容器,Docker读取只读镜像并添加一个读写层在顶部.如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层.在读写层中的旧版本文件隐藏于该文件之下,但并没有被不破坏 - 它仍然存在于镜像以下.当Docker的容器被删除,然后重新启动镜像时,将开启一个没有任何更改的新的容器 - 这些更改会丢失

  • Docker挂载资料卷保存MySQL数据

    简介 docker是运行在虚拟环境中的,这样会有一个问题,那就是储存在docker内的数据会随着docker的重启.宕机而丢失,从而造成不可估量的损失. 所以docker提供了-v指令,可以将容器内的目录以及文件映射到外部文件系统,容器启动时会读取外部文件系统,从而保证数据的完整性. mysql作为最流行的数据库之一,使用范围十分广泛,如果部署在docker却无法持久化怎么办呢?今天就来说一下mysql资料卷. MySql资料卷 mysql需要保存的只有两种文件:数据和配置文件.mysql的默认

  • Docker中容器数据卷(Data Volume)和数据管理详解

    卷(Volume) 众所周知卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必重新构建镜像. 一.数据卷 数据卷是一个可以绕过联合文件系统的,专门指定的可在一或多个容器间共享目录.卷为提供为持久化或共享数据提供了一些有用的特性. 数据卷设计的初哀是提供持久化数据,而与容器的生命周期无关.因此,在删除容器时,Docker不会自动删除卷,直到没有容器再

  • 详解Docker 数据卷管理

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享. 数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像.使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统. 本节中,我们需要依次完成下面几项任务: 1.创建数据卷 2.管理数据卷权限 3.挂载宿主机文件 4.使用数据卷容器共享数据 5.数据卷备份

  • Docker 数据卷操作的实现

    数据卷入门 在前面的案例中,如果我们需要将数据从宿主机拷贝到容器中,一般都是使用 Docker 的拷贝命令,这样性能还是稍微有点差,没有办法能够达到让这种拷贝达到本地磁盘 I/O 性能呢?有! 数据卷可以绕过拷贝系统,在多个容器之间.容器和宿主机之间共享目录或者文件,数据卷绕过了拷贝系统,可以达到本地磁盘 I/O 性能. 本文先通过一个简单的案例向读者展示数据卷的基本用法. 以前面使用的 nginx 镜像为例,在运行该容器时,可以指定一个数据卷,命令如下: docker run -itd --n

  • Docker数据卷和容器编排的使用

    前言 Docker 数据卷和容器编排,记录下来! 数据卷 数据卷可以绕过拷贝系统,在多个容器之间.容器和宿主机之间共享目录或文件,数据卷绕过了拷贝系统,可以达到本地磁盘I/O性能. 运行容器时,指定一个数据卷 $ docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 e445ab08b2be 此时,我们创建了一个数据卷并且挂载到容器的/usr/share/nginx/html/目录下. 使用 docker inspect

  • 详解Docker数据管理(数据卷&数据卷容器)

    生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 1.数据卷(Data Volumes):容器内数据直接映射到本地主机环境:如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中. 2.数据卷容器(Data Volume Containers):使用特定容器维护数据卷.如何使用数据卷容器在容器和主机.容器和容器之间共享数据,并实现数据的备份和恢复. 数据卷 数据卷是一个可

随机推荐