關於docker掛載數據卷

docker掛載數據卷能夠分兩種狀況:掛載主機目錄做爲容器卷和掛載一個容器卷html

1、建立和加載一個數據卷容器

1.建立一個數據卷容器

查看命令參數:docker run --helplinux

看到-v的命令幫助docker

這裏咱們能夠看到-v相關命令一共有三個參數centos

--volume(等同於-v)

解釋:建立一個容器數據卷,要掛載容器數據卷首先要有容器數據卷,這個命令就是建立一個容器數據卷。tomcat

好比:運維

docker run -d --volume /var/volume --name DATA centos ls

上面的命令即從名爲centos的鏡像啓動(守護線程)一個容器,容器命名爲DATA,啓動以後執行ls命令。而且將容器中的/var/volume目錄(或文件)分享出去,這樣就建立了一個數據卷容器。上面的命令等價於:docker run -v /var/volume -name DATA centos學習

這裏的/var/valume建議寫成絕對路徑,雖然相對路徑沒有報錯,可是很容易引發誤解。由於這裏即便寫成相對路徑,docker也會當成絕對路徑來處理。好比把這裏的/var/valume寫成./var/volume或var/valume結果都同樣,這對於開發者來講很容易誤解,因此建議寫成絕對路徑。ui

咱們注意到上面查詢出來的--volume命令的參數類型是list,因此咱們能夠在一個容器中建立多個數據卷。spa

好比:命令行

docker run -d --volume /var/volume1 --volume /var/volume2 --name DATA centos ls

這樣咱們就在DATA 容器中建立了兩個數據卷

除了上面的建立數據卷容器外,咱們還能夠在Dockerfile中建立數據卷,使用 VOLUME 命令。

好比:

# BUILD-USING:        docker build -t data .
# RUN-USING:          docker run -name DATA data
FROM          base-image
VOLUME        ["/var/volume1", "/var/volume2"]
CMD           ["ls"]

注:這裏的ls命令並非必須的,由於容器啓動後要執行一個命令,這個命令能夠寫在docker啓動命令行的最後,也能夠寫在Dockerfile的CMD命令中,且命令行中的命令會覆蓋Dockerfile中的CMD命令

2.加載數據卷

--volumes-from

解釋:從指定容器安裝數據卷

當咱們已經建立好一個數據卷容器後或者已經存在一個數據卷容器,咱們如何去加載這個數據卷容器到另外一個容器呢?這就須要用到--volumes-from命令。

這個命令就是從指定的一個或多個數據卷容器加載數據捲到當前的容器中。加載的意思就是若是當前容器若是存在數據卷的目錄結果則被覆蓋,若是沒有則直接加載。

好比:

docker run -d --volumes-from DATA:rw --name client centos ls

上面的命令即從名爲centos的鏡像中啓動(守護線程)一個容器,容器命名爲client,而且從名爲DATA的容器中加載數據卷(讀寫),啓動後執行ls命令。這樣DATA中的數據卷(/var/volume)就和client中的加載的數據卷(/var/volume)共享了,只要任意一方對數據卷作出更改都會同步到另外一方。值得注意的時這裏並非利用相似複製粘貼的功能實現的同步數據,而是直接修改數據,這對於超大文件頗有用。

這裏的--volumes-from命令的參數類型一樣是list,因此也是能夠指定多個數據卷容器的。

好比:

docker run -d --volumes-from DATA1:ro --volumes-from DATA2:ro --name client centos ls

注:--volumes-from加載的數據卷能夠賦予讀寫權限[rw|ro],也就是read write和read only,只讀和讀寫。默認使用數據卷相同的權限。

--volume-driver

解釋:爲容器選擇數據卷驅動

此命令不在這次討論範圍內,讀者有興趣可自行查閱相關資料。

2、掛載主機目錄做爲容器卷

上面講了如何把容器做爲一個數據卷,在容器之間共享數據的方法。但其實更多的時候咱們是把主機中的目錄做爲一個數據卷加載到容器中,容器中的目錄「外掛」,以方便運維人員維護和修改項目配置。

--volume [host-dir]:[container-dir]:[rw|ro]

上面的命令等價於:-v [host-dir]:[container-dir]:[rw|ro]

解釋:將主機的目錄(host-dir)做爲數據卷加載到容器(container-dir)中,並指定讀寫權限默認使用數據卷的權限

好比:

docker run -d --volume /var/logs:/var/host_logs:ro tomcat

上面的命令即從名爲tomcat的鏡像(守護線程)啓動一個容器,容器名隨機。掛載主機目錄/var/logs做爲數據卷,並加載到當前啓動的容器/var/host_logs,指定只讀權限。這樣的話就把主機的logs目錄和容器的host_logs目錄數據共享,當容器(數據卷)中或主機(數據卷)數據更改會同步。實際的以些應用場景有項目的配置文件掛載、日誌文件掛載等,由於這些文件都是常常查看和修改的,若是每次都進入容器修改和查看十分麻煩,因此直接掛載一個主機數據卷就能夠經過修改和查看主機的數據卷同步容器中的數據,簡化的操做步驟。

這裏有幾個點須要注意:

主機目錄和容器目錄須要絕對路徑,若是不指定絕對路徑啓動會報錯,錯誤提示爲invalid mount path,mount path must be abstract。

若是主機目錄不存在則會自動建立,建立的目錄權限爲docker容器中對應的目錄權限。

若是容器目錄不存在則會自動建立,建立的權限爲宿主機對應的目錄權限,用戶和用戶組爲1000(貌似默認的)

若是主機目錄和容器目錄都存在,則主機目錄的內容會覆蓋掉容器目錄的內容,但目錄名不會改變。

容器內部沒法刪除掛載的數據卷(目錄),但主機能夠刪除掛載的數據卷,刪除後容器內的目錄依舊存在但內容爲空。刪除失敗 Device or resource busy

容器中止和刪除都不影響主機數據卷,即便容器已經刪除了,主機數據卷內容任然存在。

掛載數據卷的操做是在容器執行啓動成功後的命令以前完成的,也就是在Dockerfile的CMD命令以前。因此你可能會在掛載數據卷後進容器查看數據卷內容發現與進容器以前看到的主機數據卷不一致,其實數據卷已經被容器啓動後作了數據數據更改了,當你退出容器查看主機數據卷已經同步。

 

總結

Docker是一個開源引擎,能夠輕鬆地從任何應用程序建立輕量,可移植,自給自足的容器。docker的出現給項目的部署提供了一種更爲方便的方式。docker利用linux的name space技術,實現了輕量、可移植、數據隔離,其優秀的可移植性和數據隔離賦予了受到衆多運維人員的青睞。工欲善其事必先利其器,docker的輕量方便也是創建在優秀的鏡像和容器製做之上的,因此要想有一個高可用的容器,製做過程須要細心研究。

本文乃做者我的研究有感而寫,若有錯誤或不妥之處,我的學習是小耽誤他人前途是大,還望各位讀者指正。

轉載請指明出處。

 

參考文檔:

https://docker-doc.readthedocs.io/zh_CN/latest/index.html

https://docs.docker.com/get-started/

相關文章
相關標籤/搜索