對於文件存儲來講,通常狀況下簡單的處理就是在Django配置文件中配置存儲目錄,按照規則對文件進行上傳或者下載。python
實際上,當文件較少的時候,Django是能夠應付的過來的。但當文件以海量形式出現的時候,Django就並非那麼好用了,因而Fast DFS應運而出。docker
FastDFS是一個開源的分佈式文件系統,它對文件進行管理,功能包括:文件存儲、文件同步、文件訪問(文件上傳、文件下載)等,解決了大容量存儲和負載均衡的問題。特別適合以文件爲載體的在線服務,如相冊網站、視頻網站等等。能夠說它就是爲互聯網而生,爲大數據而生的。
FastDFS服務端有兩個角色:跟蹤器(tracker)和存儲節點(storage)。跟蹤器主要作調度工做,在訪問上起負載均衡的做用。 存儲節點存儲文件,完成文件管理的全部功能:存儲、同步和提供存取接口,FastDFS同時對文件的meta data進行管理。跟蹤器和存儲節點均可以由多臺服務器構成。跟蹤器和存儲節點中的服務器都可以隨時增長或下線而不會影響線上服務。其中跟蹤器中的全部服務器都是對等的,能夠根據服務器的壓力狀況隨時增長或減小。django
爲何要用FastDfs:瀏覽器
1 解決海量存儲,同時存儲容量擴展方便。
2 解決文件內容重複,若是用戶上傳的文件重複(文件指紋同樣),那麼系統只有存儲一份數據,值得一提的是,這項技術目前被普遍應用在網盤中。
3 結合Nginx提升網站讀取圖片的效率。bash
1,首先下載fastdfs鏡像服務器
docker pull delron/fastdfs
2,使用docker鏡像構建tracker容器(跟蹤服務器,起到調度的做用),這裏tracker服務將會自動映射到宿主機上網絡
注意:docker 的 -v 參數,能夠自動掛載宿主機的文件件到容器中去,這樣宿主和容器就能夠進行無障礙的文件共享,咱們經過-v參數,把宿主機的root目錄自動掛載到docker容器中的/var/root目錄中去負載均衡
docker run -d --network=host --name tracker -v /root:/var/root delron/fastdfs tracker
3,docker鏡像構建storage容器(存儲服務器,提供容量和備份服務),這裏storage容器須要依賴tracker服務,傳入你的tracker服務的ip地址,端口默認是22122,ip地址也就是你宿主機的ip分佈式
docker run -d --network=host --name storage -e TRACKER_SERVER=192.168.99.100:22122 -v /root:/var/root -e GROUP_NAME=group1 delron/fastdfs storage
注意:上面ip爲docker的ip大數據
此時,命令行輸入 docker ps 就能夠看到兩套服務都已經啓動
注意: docker ps -a 能夠查看全部進程 docker rm 進程號 刪除對應進程
而後分別進入宿主的命令行以及進入容器storage的命令行,發現文件夾已經共享
進入正在後臺運行的storage容器
docker exec -it storage /bin/bash
下面來個例子(上傳視頻)
咱們能夠利用docker的exec命令不進入容器,直接在宿主機的環境下調用容器內的命令,由於文件夾已經共享,因此咱們輸入的文件目錄雖然是容器中的/var/root目錄,可是實際上該上傳的文件就在宿主的/root目錄中
docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4
上傳成功後,fastdfs將會返回視頻的網絡地址
瀏覽器訪問一下,沒有問題
至此,在宿主機中上傳文件已經搞定,而python一樣也能夠在命令行中執行命令,咱們能夠從命令中獲得URL的作法來實現django與fastdfs的交流,這裏利用的是python中的os.popen方法,能夠很是簡單的在命令行中獲取返回的fastdfs網絡地址,從而避開了必需要安裝fastdfs的python客戶端,由於該客戶端對python3並不十分友好。代碼以下:
import os import re std = os.popen("docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4").read() print('*********** fastdfs excute start ***********') print(std.strip()) print('*********** fastdfs excute end ***********')
這樣,在django中上傳文件時,就能夠經過命令的方式上傳到fastdfs中,獲取返回地址後入庫就能夠了,本次操做將docker的特性運用到了極致,因而可知docker的泛用性之廣,實實在在的提升了開發效率。