首先介绍下今天的两个主角: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 111/udp 2049/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=0,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=2049 $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,这里为了便于试验,尽量使用了简单粗暴的方式。

##文档信息

使用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. Docker学习(九)Volumn容器间共享数据

    Docker学习(九)Volumn容器间共享数据 volume是什么 volume在英文中是容量的意思, 在docker中是数据卷的意思,是用来保存数据的容器 为什么要进行数据共享 在集群中有多台to ...

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

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

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

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

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

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

  9. Docker:容器间互联的应用zabbix监控项目 [十]

    一.docker容器间的互联 1.创建两个容器 [root@luoahong ~]# docker run -d --name luoahong httpd:latest 8f771f043391e7 ...

随机推荐

  1. Redis教程(七):Key操作命令详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/134.html?1455807040 一.概述: 在该系列的前几篇博客中, ...

  2. Jquery对文本框的值、字符串的验证;正则表达式字符串的验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. How Tomcat works — 八、tomcat中的session管理

    在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...

  4. php 3种常见设计模式

    1.工厂模式 <?php namespace Facebab; class Factory { static function createDatabase () { return new Da ...

  5. Unreal Engine 4官网教程

    编辑器纵览 https://www.unrealengine.com/zh-CN/blog/editor-overview 虚幻编辑器UI布局概述 https://www.unrealengine.c ...

  6. 阿里云产品介绍(三):云数据库RDS

    写完云服务器ECS,本来想先写负载均衡的. 因为发现很多客户,都是直接将单台云服务器应用对外提供访问,如果云服务器宕机,应用就会停止服务.云服务器标称有99.95%的可用率,一年下来宕机四个多小时也是 ...

  7. samba权限之easy举例说明--原创

    实验环境RHEL5.0,samba3.023rc-2 一.何为browsealbe=no? 如图lingdao目录的权限为777 如图ling目录的共享设置和用户的ID和组 当用户lingdao_01 ...

  8. 微信、陌陌等著名IM软件设计架构详解

    对微信.陌陌等进行了分析,发出来分享一下(时间有些久了) 电量:对于移动设备最大的瓶颈就是电量了.因为用户不可能随时携带电源,充电宝.所以必须考虑到电量问题.那就要检查我们工程是不是有后台运行,心跳包 ...

  9. C#控制其它程序

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]        ...

  10. mysql触发器_begin end 执行多次语句

    //多SQL中导出的触发器语句: DROP TRIGGER IF EXISTS `t_trig`; DELIMITER // CREATE TRIGGER `t_trig` BEFORE INSERT ...