淺談Docker 容器數(shù)據(jù)卷掛載小結(jié)
為了更直觀了解數(shù)據(jù)卷掛載的操作,做個(gè)實(shí)驗(yàn)一一驗(yàn)證數(shù)據(jù)卷掛載的各種情況。
情況一、本地不存在文件掛載到容器存在文件
首先是當(dāng)本地不存在該文件,而容器內(nèi)存在該文件的情況,嘗試把不存在的文件掛載到存在該文件的容器中。以一個(gè) Alpine 鏡像為例,這里把一個(gè)修改后的 Alpine 鏡像打了新標(biāo)簽,叫做 volume_test:
# 本地目錄不存在 test 文件。 $ docker run --name=test -v ~/test.txt:/etc/hosts -d volume_test 0cba2e50229df7508c616bd456c4ab131f2fe1a88385c34f8a5876fbc577b176 docker: Error response from daemon: oci runtime error: rootfs_linux.go:53: mounting "/var/lib/docker/devicemapper/mnt/6b83c07ebedcb828f34cac69eac5a85ce3a5f59e1e8688c8dae40198671d0ecb/rootfs/etc/hosts" to rootfs "/var/lib/docker/devicemapper/mnt/6b83c07ebedcb828f34cac69eac5a85ce3a5f59e1e8688c8dae40198671d0ecb/rootfs" caused "not a directory". # 啟動(dòng)容器失敗。
情況二、本地不存在文件夾掛載到容器存在文件夾
然后是把本地不存在的文件夾掛載到容器內(nèi)存在的文件夾,在 volume_test 鏡像中存在一個(gè) /srv 的文件夾,文件夾里面有一個(gè) index.php 文件。
# 本地目錄不存在 srv文件夾。 $ docker run --name=test -v ~/srv:/srv -d volume_test c71cf1cfa4932e3e398a7d6c4e2ae94f915b832f5506e374aedb19af4cb1ac62 # 啟動(dòng)正常,但是進(jìn)入容器發(fā)現(xiàn)目錄被清空。 $ docker exec -it test sh /srv # ls /srv #
上面兩個(gè)例子已經(jīng)告訴我們,數(shù)據(jù)卷的掛載是通過(guò)把本地的目錄覆蓋到容器中的。也就是說(shuō),當(dāng)宿主機(jī)文件不存在時(shí),不能掛載;當(dāng)文件夾不存在時(shí),掛載到容器會(huì)用一個(gè)空文件夾覆蓋容器原有目錄。
情況三、宿主機(jī)存在文件掛載到容器不存在文件
我們繼續(xù),假設(shè)宿主機(jī)存在文件,容器內(nèi)不存在該文件:
# 本地目錄存在 test.txt文件 $ docker run --name=test -v ~/test.txt:/srv/test.txt-d volume_test 2d6853c10643a735ae3d7f3aaac8c6344f9c75170e531f613d08db7cdf484e54 # 容器內(nèi)存在 /srv 文件夾,里面原本有一個(gè) index.php 。 $ docker exec -it test sh /srv # ls index.php test.txt /srv # # 可以看到文件掛載成功。
情況四、宿主機(jī)存在文件夾掛載到容器不存在文件夾
接下來(lái)是宿主機(jī)存在文件夾,容器不存在該文件夾,宿主機(jī)的 test 文件夾里面存在一個(gè) hello 文件:
$ docker run --name=test -v ~/test:/srv/test -d volume_test c935ffa0d9fc5e5ac8f213a51a878e71056472b0597d2e385a29e5c748012958 # 進(jìn)入容器,查看是否存在 test 文件夾,以及文件夾里面是否有 hello 文件。 $ docker exec -it test sh /srv # ls index.php test /srv # cd test/ /srv/test # ls hello /srv/test #
上面兩個(gè)例子說(shuō)明了,容器內(nèi)部如果不存在文件,宿主機(jī)直接掛載。
情況五、宿主機(jī)文件夾掛載到容器文件
接下來(lái)假設(shè)宿主機(jī)存在 test 文件夾,而容器內(nèi)部存在的是名為 test 文件,這樣掛載會(huì)怎樣呢?
$ docker run --name=test -v ~/test:/srv/test-d volume_test 385bc78e5333460da11f04535da27a3fd226df218f95c970ff2dd5609b17f816 docker: Error response from daemon: oci runtime error: rootfs_linux.go:53: mounting "/var/lib/docker/devicemapper/mnt/fd5c42e844c3550d1a372ed939ed57f90dcacbd375dfed1bedfbb71ef6f3f185/rootfs/etc/hosts" to rootfs "/var/lib/docker/devicemapper/mnt/fd5c42e844c3550d1a372ed939ed57f90dcacbd375dfed1bedfbb71ef6f3f185/rootfs" caused "not a directory".
上面的情況不出意外是啟動(dòng)錯(cuò)誤。
情況六、同名文件夾掛載
那么假設(shè)宿主機(jī)是文件夾,容器也是文件夾,兩個(gè)文件夾里面內(nèi)容不一樣,宿主機(jī)內(nèi)部有一個(gè) hello 文件,容器的文件夾里面有一個(gè) index.php :
$ docker run --name=test -v ~/srv:/srv -d volume_test 3aec30122bd7010c694e0ff8b77f7b7b6bb6f850c258786db125313060fad43b$ docker exec-it test sh /srv # ls hello /srv # # 可以看到,宿主機(jī)文件夾會(huì)覆蓋容器內(nèi)部的文件夾。
情況七、同名文件掛載
假設(shè)宿主機(jī)有一個(gè) test.txt 文件,里面寫(xiě)著 Hello World,而容器里面也存在一個(gè) test.txt 文件,里面寫(xiě)著 Hi World,現(xiàn)在掛載文件:
$ docker run --name=test -v ~/test.txt:/srv/test.txt -d volume_test 047cbfe45b5bc868c864fe94f7a22643d52b644947f40260097dbb579de56c5c $ docker exec -it test sh /srv # cat /test Hello World /srv # # 宿主機(jī)會(huì)覆蓋容器的文件。
情況八、宿主機(jī)文件掛載到容器文件夾
最后一種情況,宿主機(jī)存在文件 test.txt,而容器內(nèi)部存在一個(gè) test 的文件夾,現(xiàn)在把 文件掛載到文件夾中:
$ docker run --name=test -v ~/test.txt:/test -d volume_test 59b5fd74a1e9e17aa2a6a9be7900b16c7dd4b3c424a4fa72a7671fa1c51bdf69 docker: Error response from daemon: oci runtime error: rootfs_linux.go:53: mounting "/var/lib/docker/devicemapper/mnt/b201054ed36a189b5abb599082d0b5bcbe31d07611a0985deefd79d1221447fd/rootfs/home" to rootfs "/var/lib/docker/devicemapper/mnt/b201054ed36a189b5abb599082d0b5bcbe31d07611a0985deefd79d1221447fd/rootfs" caused "not a directory". # 啟動(dòng)失敗。
小結(jié):
宿主機(jī)文件 | 容器內(nèi)文件 | 啟動(dòng)參數(shù)(加粗表示不存在) | 容器啟動(dòng)情況 |
---|---|---|---|
不存在 | 文件 | -v ~/test.txt:/etc/hosts | 啟動(dòng)錯(cuò)誤 |
不存在 | 文件夾 | -v ~/srv:/srv | 啟動(dòng)正常 |
文件 | 不存在 | -v ~/test.txt:/srv/test.txt | 啟動(dòng)正常 |
文件夾 | 不存在 | ~/test:/srv/test | 啟動(dòng)正常 |
文件夾 | 文件 | ~/test:/srv/test | 啟動(dòng)錯(cuò)誤 |
文件夾 | 文件夾 | -v ~/srv:/srv | 啟動(dòng)正常 |
文件 | 文件 | -v ~/test.txt:/srv/test.txt | 啟動(dòng)正常 |
文件 | 文件夾 | -v ~/test.txt:/test | 啟動(dòng)錯(cuò)誤 |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker安裝部署RabbitMQ的實(shí)現(xiàn)步驟
RabbitMQ是一款開(kāi)源的消息隊(duì)列中間件,能夠在分布式系統(tǒng)中實(shí)現(xiàn)可靠的消息傳遞,本文主要介紹了Docker安裝部署RabbitMQ的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Docker部署Mysql數(shù)據(jù)庫(kù)步驟詳解
Docker是一種流行的容器化平臺(tái),可以簡(jiǎn)化應(yīng)用程序的部署和管理,在本博客中,我們將探討如何使用Docker部署兩個(gè)廣泛使用的數(shù)據(jù)庫(kù):MySQL,我們將提供詳細(xì)的步驟和相應(yīng)的命令,以幫助您輕松地在Docker容器中設(shè)置和運(yùn)行這個(gè)數(shù)據(jù)庫(kù)2023-07-07docker部署nginx訪問(wèn)宿主機(jī)服務(wù)并使用緩存的操作方法
這篇文章主要介紹了docker部署nginx訪問(wèn)宿主機(jī)服務(wù)并使用緩存的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,感興趣的朋友一起看看吧2024-04-04在Linux系統(tǒng)中安裝Docker的過(guò)程
這篇文章主要介紹了如何在Linux系統(tǒng)中安裝Docker,其實(shí)安裝docker真的很簡(jiǎn)單,只需要幾條命令就可以完成了,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12解析docker妙用SpringBoot構(gòu)建微服務(wù)實(shí)戰(zhàn)記錄
Spring Boot 是 Spring 開(kāi)源組織的子項(xiàng)目,是 Spring 組件一站式解決方案,本文通過(guò)詳細(xì)案例給大家解析docker妙用SpringBoot構(gòu)建微服務(wù)實(shí)戰(zhàn)記錄,感興趣的朋友跟隨小編一起看看吧2021-11-11一文搞定Docker安裝ElasticSearch的過(guò)程
通過(guò)本文可以幫助大家快速學(xué)習(xí)Docker安裝ElasticSearch的過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器)
容器中管理數(shù)據(jù)主要有兩種方式,這篇文章主要介紹了詳解Docker數(shù)據(jù)管理(數(shù)據(jù)卷&數(shù)據(jù)卷容器) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10docker安裝RocketMQ的實(shí)現(xiàn)步驟
本文主要介紹了docker安裝RocketMQ的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11docker+Nginx部署前端項(xiàng)目的詳細(xì)過(guò)程記錄
docker的出現(xiàn)解決了我們很多問(wèn)題,讓我們避免陷入各種依賴(lài)安裝的痛苦中,下面這篇文章主要給大家介紹了關(guān)于docker+Nginx部署前端項(xiàng)目的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10在Docker中構(gòu)建并運(yùn)行Nginx容器的完整教程
Docker 作為一種強(qiáng)大的容器化平臺(tái),使得開(kāi)發(fā)、測(cè)試和部署變得更加高效和靈活,Nginx 是一款廣泛使用的高性能 Web 服務(wù)器和反向代理服務(wù)器,適用于各種場(chǎng)景,在本教程中,我們將詳細(xì)介紹如何在 Docker 中構(gòu)建并運(yùn)行一個(gè) Nginx 容器,需要的朋友可以參考下2024-09-09