首先介紹下今天的兩個主角: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,這里為了便於試驗,盡量使用了簡單粗暴的方式。
參考資料:
http://www.cnblogs.com/vimsk/p/5193413.html
http://ju.outofmemory.cn/entry/128061