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

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

Create a volume:

$ docker volume create my-vol
  • 1

注意这个命令不是所有的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
  • 1

注意这个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命令新建了一个容器,至于能不能直接给运行中的容器进行挂载,我查了半天只有一个是关于这个的,但是我也没有考证,有兴趣的可以看下:http://dockone.io/article/149

用Volume在主机和Docker容器文件传输的更多相关文章

  1. 不同主机的docker容器互相通信

    Docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.0.1/16,一个16位的子网掩码给容器提供了 65534个IP地址. docker0只是一个在绑定到 ...

  2. 主机和docker容器拷贝文件

    从主机复制到容器sudo docker cp host_path containerID:container_path 从容器复制到主机sudo docker cp containerID:conta ...

  3. 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机或Docker容器性能数据

    基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据   by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 3 使用前提 3 使用方法 ...

  4. MacOS下解决宿主机和docker容器之间网络互通

    docker在Mac下使用非常方便,官网提供了desktop版本的可视化软件,甚至还十分贴心地集成好了k8s套件.然而如果想同时部署和使用多个容器,每个容器不使用127.0.0.1地址,而是各自有ip ...

  5. windows宿主机和docker容器设置挂载共享文件夹

    docker容器内的程序经常需要访问.调用宿主机目录中的数据,每次都要导入导出非常麻烦费力. 接下来,一步步实现将宿主机的指定文件夹挂载到docker容器中. 1. 打开Oracle VM Vitua ...

  6. Docker 容器文件导出 - 六

    Docker 容器 导入导出 导入:import 导出:export 打tar包导出容器 nginx1 的文件系统: # docker export nginx1 > nginx1.tar.gz ...

  7. 两台主机间docker容器网络互通

    服务器1: 网络172.30.0.0/16 服务器2: 网络172.31.0.0/16 服务器1和服务器2上的docker容器网络之间是无法互通的,如果需要互通,需要做以下配置: 服务器1上执行: i ...

  8. qt-5.6.0 移植之实现板子与ubuntu主机通过网络进行文件传输

    经过一上午的调试以及同事的帮助,终于实现板子与主机的文件传输. 第一步关闭所有的防火墙 在 Windows 里面是在控制面板->安全->Windows 防火墙->自定义设置 在ubu ...

  9. 如何使用数据卷在宿主机和docker容器之间共享文件

    共享宿主机的目录给容器 docker run -i -t -v ~/download:/home/hello python3-env /bin/bash -v  表示创建一个数据卷并挂载到容器里 ~/ ...

随机推荐

  1. pyqt pyside QLabel 显示图片

    pyqt pyside QLabel 显示图片 pixmap = QtGui.QPixmap("D:/myPicture.jpg") label.setPixmap(pixmap) ...

  2. MERGE INTO无法更新ON中的字段解决办法

    可以将on里的条件放到update 之后的where条件里 MERGE INTO xshtest.WEB_USER_VIP T1 USING ( select 53254624 enterpriseI ...

  3. python-nmap的函数学习

    简介 python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且可以帮助系统管理员进行自动化扫描任务和生成报告.同时,它也支持nmap脚本输出. 可 ...

  4. 通过ViewPager 实现图片轮播

    通过ViewPager 实现图片轮播 首先来个效果图 布局文件: LinearLayout 用来存放下方的几个小白点. <?xml version="1.0" encodin ...

  5. ORACLE11g 重装系统后根据dbf恢复数据库

    1.安装一个和原系统一致的oracle 环境,主要包括版本.数据名sid.实例名.路径和数据库编码一致 2.修改listener.ora的参数 SID_LIST_LISTENER = (SID_LIS ...

  6. Jmeter初步

    Jmeter 3. 去掉没有必要的结果记录 对于一些不必要的日志信息可以暂时不要记录. 例如:结果树. 当然可以勾选记录那些失败的日志. 聚合报告中,点击  configure,根据需求设置自己想要保 ...

  7. help文档制作 chm

    程序中的help文档制作 所用工具:HTML Help Workshop 文件包括:各个html文档,帮助页面的具体内容 hhc文档:help的目录文件 hhk文档:help的索引文件 MAP文件夹中 ...

  8. 变量类型-List

    教程:一:列表的创建 List(列表) 是 Python 中使用最频繁的数据类型.列表中元素的类型可以不相同,数字,字符串甚至可以包含列表(所谓嵌套)    (1)List写在方括号之间,元素用逗号隔 ...

  9. IOS不支持iframe的解决办法

    最近做ios的兼容,因为入口不同,需要把公共页面抽取出来,然后根据不同的值,传递给后台不同的入口.刚开始用iframe页面嵌套(第一次尝试使用),但发现iOS系统对iframe嵌套页面的高度和定位控制 ...

  10. .NET Core 中基于 IHostedService 实现后台定时任务

    .NET Core 2.0 引入了 IHostedService ,基于它可以很方便地执行后台任务,.NET Core 2.1 则锦上添花地提供了 IHostedService 的默认实现基类 Bac ...