首先介绍下今天的两个主角:nfs和docker

nfs 是什么
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。 摘自百度百科 docker 是什么
这个就不多说了,近两年一个非常流行的东西哦。 主角介绍完毕,那么要说说为什么要使用docker来搭建nfs,其实本文标题已经说明,主要目的还是为了实现容器间文件的共享。 用过docker的都应该知道docker可以支持容器目录挂载到宿主机。而通过nfs,则可以将容器之间的目录实现共享挂载。如果你有多个容器间需要共享文件的需求,这个将是一个可以尝试的方案,具体使用场景看大家发挥想象了,今天这里主要实践一下如何实现这个功能。 涉及到的知识
nfs安装
docker容器间通信
docker privileged
dockerfile
docker镜像
编写dockerfile
FROM ubuntu
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -qq && apt-get install -y nfs-kernel-server runit inotify-tools -qq
RUN mkdir -p /exports VOLUME /exports EXPOSE /udp /tcp
制作docker镜像
docker build -t=scottkiss/nfs .
运行该命令需要一段时间,成功后执行 docker images
将会看到本地刚刚创建nfs的docker镜像 配置并运行nfs服务器
执行 docker run -it --name nfs-server --privileged scottkiss/nfs
执行完毕后进入容器终端 修改配置 vi /etc/exports
在末尾加入 /exports *(rw,sync,no_subtree_check,fsid=,no_root_squash)
然后执行 exportfs -r
接着启动rpcbind服务 service rpcbind start
最后启动nfs服务 service nfs-kernel-server start
至此,不出意外,已经成功的启动了nfs服务器,并且将/exports目录共享了出去。这里,笔者在开始的时候遇到一坑, 就是启动时候需要加上–privileged参数,否则启动nfs服务时候会提示权限不足报错。主要是这个过程中涉及到了mount操作, 使用该参数后使得container内的root拥有真正的root权限,这样就不会报错了。 配置并启动客户端
客户端就简单多了,不需要像服务器那样配置了。 执行 docker run -it --link nfs-server:nfs --privileged scottkiss/nfs
进入容器终端。然后执行 service rpcbind start
接着执行远程挂载命令 mount -t nfs -o proto=tcp,port= $NFS_PORT_2049_TCP_ADDR:/exports /home
这样,便将服务器的exports目录挂载到了客户端的home目录了。 迫不及待的可以试试了,如在server终端的/exports目录下添加一个文件,在client的/home下也会同步添加。 这里涉及的主要就是–link参数,这个参数就是告诉Docker容器需要使用nfs-server这个容器并将其别名命名为nfs。这样,就可以使用$NFS_PORT_2049_TCP_ADDR来获取服务器ip了。 总结
以上所有只是为了测试而做的一个粗糙的方案,还有很多改进之处,包括dockerfile,这里为了便于试验,尽量使用了简单粗暴的方式。

参考资料:

http://www.cnblogs.com/vimsk/p/5193413.html

http://ju.outofmemory.cn/entry/128061

【云计算】使用docker搭建nfs实现容器间共享文件的更多相关文章

  1. 使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  2. Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案

    原文:Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案 版权声明:本文为博主原创文章,未经博主允许不得 ...

  3. <实训|第五天>通过搭建NFS,FTP实现共享文件附Vim脚本游戏

    先说个事情:我周末是不更新这个系列教程的,不过其他内容的会更新,我周末就整理这一周的各种内容到我的微信公众号中,提供给大家! 期待已久的linux运维.oracle"培训班"终于开 ...

  4. Docker:跨主机容器间通信之overlay [十五]

    一.配置overlay类型网络准备工作 1.在luoahong3主机上 docker run -d -p 8500:8500 -h consul --name consul progrium/cons ...

  5. WSL docker打通容器间通信和追加端口映射

    最近在docker中搭建一个服务,需要有多个容器通信.这里简单记录一下如何在容器间进行通信,同时说一下已经存在的容器如何追加端口映射. 增加网桥 容器间通信的目的是不适用IP而是使用容器名称进行网络通 ...

  6. 【云计算】docker的小知识,帮你更深入理解容器技术

    关于docker的15个小tip   1. 获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu): $ ID=$(docker run ubuntu e ...

  7. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  8. 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障

    3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...

  9. Docker & ASP.NET Core (4):容器间的连接

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用 ...

随机推荐

  1. 修改MySQL事件

    MySQL允许您更改现有事件的各种属性. 要更改现有事件,请使用ALTER EVENT语句,如下所示: ALTER EVENT event_name ON SCHEDULE schedule ON C ...

  2. elementUI 学习入门之 inputNumber 计数器

    InputNumber 计数器 基础用法 <el-input-number v-model="num2"></el-input-number> v-mode ...

  3. (9) go 时间日期

    1. var t = time.Now() println(t.String())//2019-04-26 13:38:02.5100554 +0800 CST m=+0.000000001 2. 月 ...

  4. java变量的命名使用规则

    1.环境变量通常是指在操作系统中,用来指定操作系统运行时需要的一些参数 2.变量名以字母.下划线或者美元符(4上面的¥)开头,不能以数字开头,后面跟字母.下划线.美元符.数字,变量名对大小写敏感,无长 ...

  5. Django框架之【自定义模板过滤器与标签】

    本文在我的微信公众号的链接:https://mp.weixin.qq.com/s?__biz=MzU5NTU5MjcwNw==&mid=2247483674&idx=1&sn= ...

  6. 运用jquery做打印和导出操作

    我最近接手的项目中经常让做出打印和导出统计图和表格 首先说打印,打印如果用echarts做出来的图表,打印的时候,要借助jquery的打印插件. 打印插件: <script src=" ...

  7. 初始Hibernate4

    Hibernate是一个ORM的轻量级框架,解决持久化操作,使得程序员可以从编写繁复的jdbc的工作中解放出来,专注与业务,提高我们的开发效率.移植性. 1.持久化    a) 侠义概念:数据存储在物 ...

  8. 二维数组sort排序

    和副本任务完全无关的奇怪感慨: 完全搞不懂我为什么会在搞图论的时候学这种奇怪东西,需要的时候不会,不需要的时候又莫名增加了奇怪的技能点. 之前的假期规划在十多天的放飞自我中彻底泡汤,简单的图论都一点不 ...

  9. 禁用substr、substring、mid函数的sql注入脚本

    #encodeing=utf-8 import requests import sys reload(sys) sys.setdefaultencoding('utf-8') payloads = l ...

  10. spoj 375 query on a tree LCT

    这道题是树链剖分的裸题,正在学LCT,用LCT写了,发现LCT代码比树链剖分还短点(但我的LCT跑极限数据用的时间大概是kuangbin大神的树链剖分的1.6倍,所以在spoj上是850ms卡过的). ...