首先介绍下今天的两个主角:nfs和dockerhtml
nfs 是什么
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它容许网络中的计算机之间经过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用能够透明地读写位于远端NFS服务器上的文件,就像访问本地文件同样。 摘自百度百科docker
docker 是什么
这个就很少说了,近两年一个很是流行的东西哦。ubuntu
主角介绍完毕,那么要说说为何要使用docker来搭建nfs,其实本文标题已经说明,主要目的仍是为了实现容器间文件的共享。 用过docker的都应该知道docker能够支持容器目录挂载到宿主机。而经过nfs,则能够将容器之间的目录实现共享挂载。若是你有多个容器间须要共享文件的需求,这个将是一个能够尝试的方案,具体使用场景看你们发挥想象了,今天这里主要实践一下如何实现这个功能。bash
涉及到的知识
- 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服务器
执行tcp
docker run -it --name nfs-server --privileged scottkiss/nfs
执行完毕后进入容器终端测试
修改配置ui
vi /etc/exports
在末尾加入url
/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,这里为了便于试验,尽可能使用了简单粗暴的方式。
##文档信息