您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關docker中怎么掛載數據卷,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、創建和加載一個數據卷容器
查看命令參數:docker run --help
看到-v的命令幫助
這里我們可以看到-v相關命令一共有三個參數
解釋:創建一個容器數據卷,要掛載容器數據卷首先要有容器數據卷,這個命令就是創建一個容器數據卷。
比如:
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結果都一樣,這對于開發者來說很容易誤解,所以建議寫成絕對路徑。
我們注意到上面查詢出來的--volume命令的參數類型是list,所以我們可以在一個容器中創建多個數據卷。
比如:
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命令
解釋:從指定容器安裝數據卷
當我們已經創建好一個數據卷容器后或者已經存在一個數據卷容器,我們如何去加載這個數據卷容器到另一個容器呢?這就需要用到--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,只讀和讀寫。默認使用數據卷相同的權限。
解釋:為容器選擇數據卷驅動
此命令不在此次討論范圍內,讀者有興趣可自行查閱相關資料。
二、掛載主機目錄作為容器卷
上面講了如何把容器作為一個數據卷,在容器之間共享數據的方法。但其實更多的時候我們是把主機中的目錄作為一個數據卷加載到容器中,容器中的目錄“外掛”,以方便運維人員維護和修改項目配置。
上面的命令等價于:-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中怎么掛載數據卷了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。