利用Volume在主机和Docker容器文件传输的方法

之前写过一篇关于Docker容器和本机之间的文件传输。的文章,但是此方法相对比较繁琐一些,在查看了官方关于数据管理的文档之后发现利用volume来实现主机和容器的文件传输效率更高一点,其实也就是将本地的目录进行挂载到容器上,官方一共有三种方法:Manage data in Docker

这里只介绍使用volume的操作:Use volumes

1.使用Volume在主机和容器之间传输文件。

在官方文档中可以看到使用如下命令即可创建一个volume:

Create a volume:

$ docker volume create my-vol

注意这个命令不是所有的docker版本都可以运行的:

The client and daemon API must both be at least 1.21 to use this command. Use the docker version command on the client to check your client and daemon API versions.

创建完成之后可以查看详细信息:

$ docker volume inspect my-vol

注意这个Mountpoint所对应的目录就是我们用来主机和容器进行文件传输的目录。

然后在使用run启动一个容器的时候就可以使用该volume:

可以看到通过-v命令将刚才创建的数据卷挂载到容器中的hostdata目录下了,这时候我们在容器中给hostdata目录下添加文件的时候,在主机的的/var/lib/docker/volumes/my-vol/_data中就可以看到了,同理在主机的该目录中添加文件,在容器的hostdata中也可以看到。

我将nginx这个文件复制到主机中用来交换的目录下,进入容器之后在hostdata的目录下也可以查看:

同样的在容器中将文件拷贝到hostdata目录下中,在主机的/var/lib/docker/volumes/my-vol/_data也能够使用查看。

在这里我在容器中创建一个文件testfile并向其中写入:This is container write!,然后回到主机进行查看,并在主机中使用vim向其中添加:“This is host write!”,并返回容器中进行查看。

2.使用数据卷容器。

我在有些地方看到有人使用数据卷容器来实现多个容器之间的数据共享,其过程是这样子的:

1.先创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/bdata:

可以通过docker volume ls查看生成了一个随机名称的volume。

2.然后,可以在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:

3.然后此时在三个容器中任何一方在/dbdata目录下的写入,其他容器中都可以看到。

在图中,在dbdata容器中创建testfile文件并写入”dbdata container write!”,然后在db1容器中查看并写入“db1 container write!”,然后在db2容器中查看并写入“da2 container write!”,最后回到dbdata容器中查看。

4.然后还可以通过多个–volumes-from来挂载多个数据卷,然后还给出了备份和恢复的方法,网上一搜一大把。

3.为什么不用数据卷容器?

在看到许许多多关于数据卷容器的文章,并且都是大同小异。然后我想了想发现并没有使用数据卷的必要性(或许是我想的不够周全)。

上面提到数据卷容器用来在多个容器中共享数据,但是在明明可以通过挂载一个相同的本地目录就能实现该方法。比如说在第一步中创建的my-vol数据卷,我可以将其同时挂载到db3和db4容器中。

在图中,我将my-vol数据卷挂载到了db3和db4中,然后在其中能够找到之前的数据文件,并且在db4容器中对testfile文件进行写入操作,在db3中容器中也可以查看。

那么也就是说,我同样的可以通过挂载一个数据卷就可以实现多个容器中的数据共享,并且在主机的目录中添加的文件,在所有的容器中也能够查看。如果备份的话直接在主机本地将文件夹进行拷贝即可,岂不是更方便。

4.为什么使用数据卷容器?

但是数据卷容器还有一个作用比较不错,那就是可以用来指定挂载本地目录,在第一点中我们创建一个名为my-vol的数据卷,该数据卷在本地存放的目录为:/var/lib/docker/volumes/my-vol/_data,可以看出这个名字很长不方便操作,可以通过数据卷容器来解决该问题。

比如我在主机上创建了一个专门用来存放主机和容器进行文件交互的目录,也就是说以后我想给容器中传输什么文件了,我直接将文件拷贝到该目录下即可:

我在官方文档中并没有发现使用docker volume create 创建数据卷时可以指定volume对应的本地目录的命令(或许是我看的不够多)。

但是我就是想要用/usr/local/datadb 这个目录该怎么办?此刻数据卷容器的作用就出来了,可以通过创建一个数据卷容器,并且将该目录挂在到数据卷容器上即可:

在图中,我创建了一个所谓的数据卷容器,并且使用-v参数,将刚才主机的/usr/local/datadb目录挂载进去,然后在容器中创建文件testfile并写入“HAHAHAHA”,在主机上进行查看。

然后在其他容器创建的时候既可以使用–volumes-from将该数据卷容器进行挂载,然后想给容器中传文件的时候直接拷贝到/usr/local/datadb目录下即可,反过来容器给主机传文件直接拷贝到容器中的挂载目录下即可。

至于备份,直接将主机/usr/local/datadb赋值一份就好了,恢复的话再次挂载就好了。

但有一个问题就是,上述所有的挂载volume操作都是使用run命令新建了一个容器,至于能不能直接给运行中的容器进行挂载,我查了半天只有一个是关于这个的,但是我也没有考证,有兴趣的可以看下:https://www.jb51.net/article/157179.htm

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Docker容器与主机间的文件传输方法(复制/上传/下载)

    1.首先启动容器(以first-mysql容器为例) docker start first-mysql 2.查看容器ID root@kobe:/opt/software/temp/test# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 688e83c55129 mysql "docker-entrypoint.s-" 6 days ago Up 3 seconds 0.0.0.0:3306->33

  • 利用Volume在主机和Docker容器文件传输的方法

    之前写过一篇关于Docker容器和本机之间的文件传输.的文章,但是此方法相对比较繁琐一些,在查看了官方关于数据管理的文档之后发现利用volume来实现主机和容器的文件传输效率更高一点,其实也就是将本地的目录进行挂载到容器上,官方一共有三种方法:Manage data in Docker, 这里只介绍使用volume的操作:Use volumes 1.使用Volume在主机和容器之间传输文件. 在官方文档中可以看到使用如下命令即可创建一个volume: Create a volume: $ doc

  • windows宿主机和docker容器设置挂载共享文件夹的步骤

    docker容器内的程序经常需要访问.调用宿主机目录中的数据,每次都要导入导出非常麻烦费力. 接下来,一步步实现将宿主机的指定文件夹挂载到docker容器中. 1. 打开Oracle VM VitualBox: 2. 点击[设置]->点击左侧的[共享文件夹] 3. 双击默认的[c/Users \\?\c:\Users],进行编辑,这里设置D盘下的data为挂载共享目录,名称可修改,此处设为"data". 点击确定 4. 重启virtualbox虚拟机,中间有等待时间: 5. 创建

  • 修改已有docker容器中的内容方法

    一.docker ps    列出容器 二.docker cp   拷贝文件至容器 注:docker中宿主机与容器(container)互相拷贝传递文件的方法 1.从容器拷贝文件到宿主机 docker cp mycontainer:/opt/testnew/file.txt /opt/test/ 2.从宿主机拷贝文件到容器 docker cp /opt/test/file.txt mycontainer:/opt/testnew/ 需要注意的是,不管容器有没有启动,拷贝命令都会生效. 当结束后,

  • 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

    介绍 Docker Swarm是用于部署Docker主机集群的Docker本地解决方案.您可以使用它来快速部署在本地计算机或受支持的云平台上运行的Docker主机集群. 在Docker 1.12之前,设置和部署Docker主机集群需要使用外部键值存储(如etcd或Consul)来进行服务发现.但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,可以开箱即用. 在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器

  • 查看Docker容器的信息的方法实现

    目录 创建tomcat容器 第一种:进入容器内部获取信息 第二种:执行docker exec命令 第三种:使用docker inspect命令 对于运行在Docker环境的容器,有时我们想查询它们的一些基本信息,例如环境变量.hostname.ip地址等,接下来我们以一个tomcat容器为例,看看有哪些方式来取得这些信息: 创建tomcat容器 在docker环境下执行如下命令,即可创建一个名为tomcat001的tomcat容器: docker run --name tomcat001 -id

  • linux通过跳板机连接远程服务器并进行文件传输的方法

    最近在linux主机上部署环境时,遇到了很多问题,第一个就是通过跳板机远程连接服务器传输文件的问题. 看了很多网上的解决办法,大部分就是说用SecureCRT软件的Alt+P命令,然后通过SFTP进行传输,其中主要涉及以下几个指令 在sftp界面下有几个命令比较重要 cd 主要是打开服务器存放文件的位置 lcd 主要是打开本地待上传文件的位置 put 是上传文件的指令 get 是从服务器下载文件的指令 在sftp界面下有几个命令比较重要 cd 主要是打开服务器存放文件的位置 lcd 主要是打开本

  • Windows与Linux之间文件传输的方法图解

    Windows与Linux之间文件传输 (1).使用WinSCP工具,实现将Windows的文件上传到Linux指定目录下 (1).输入主机名.用户名.密码,选择登录,成功连接至Linux系统 (2).在左侧列表,选择要上传文件,单击右键选择上传即可 (3).在右侧列表,选择要下载文件,单击右键选择下载即可. 注意:主机名:Linux的IP地址 用户名:登录Linux的用户名 密码:登录Linux的密码 总结 以上所述是小编给大家介绍的Windows与Linux之间文件传输的方法图解,希望对大家

  • Java基于Socket的文件传输实现方法

    本文实例讲述了Java基于Socket的文件传输实现方法.分享给大家供大家参考,具体如下: 1. Java代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.Ser

  • 使用python3构建文件传输的方法

    有时需要传输比较大的文件,通过聊天工具发送极其不方便,或者网络受限的情况下,只能另寻他法.用python就可以做一个简单的web服务,方便而且传输速率高. 步骤: 在cmd下,进入含有需要发送文件的目录 输入python -m http.server 8000(8000为默认端口号,也可为其他的) 在本机上打开浏览器输入127.0.0.1:8000,就可以看到需要分享的文件夹了,可以下载:在其他计算机的浏览器中输入发送文件的计算机的IP:8000. 我用的校园网,两台机计算机之间ping不通,所

  • Docker容器自启动的实现方法

    容器自启动 Docker提供了restart policy机制,可以在容器退出或者Docker重启时控制容器能够自启动.这种Restart policy可以保证相关容器按照正确顺序启动.虽然也可以通过进程监控的方式(如systemd)来完成这种动作,但Docker还是建议尽量避免使用进程监控的方式来 "自启动" 容器. Docker的 Restart policy与dockerd命令的--live-restore启动标志还有区别:--live-restore标志可以在Docker升级的

随机推荐