您好,登錄后才能下訂單哦!
小編給大家分享一下Docker中容器數據卷掛載的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
情況一、本地不存在文件掛載到容器存在文件
首先是當本地不存在該文件,而容器內存在該文件的情況,嘗試把不存在的文件掛載到存在該文件的容器中。以一個 Alpine 鏡像為例,這里把一個修改后的 Alpine 鏡像打了新標簽,叫做 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". # 啟動容器失敗。
情況二、本地不存在文件夾掛載到容器存在文件夾
然后是把本地不存在的文件夾掛載到容器內存在的文件夾,在 volume_test 鏡像中存在一個 /srv 的文件夾,文件夾里面有一個 index.php 文件。
# 本地目錄不存在 srv文件夾。 $ docker run --name=test -v ~/srv:/srv -d volume_test c71cf1cfa4932e3e398a7d6c4e2ae94f915b832f5506e374aedb19af4cb1ac62 # 啟動正常,但是進入容器發現目錄被清空。 $ docker exec -it test sh /srv # ls /srv #
上面兩個例子已經告訴我們,數據卷的掛載是通過把本地的目錄覆蓋到容器中的。也就是說,當宿主機文件不存在時,不能掛載;當文件夾不存在時,掛載到容器會用一個空文件夾覆蓋容器原有目錄。
情況三、宿主機存在文件掛載到容器不存在文件
我們繼續,假設宿主機存在文件,容器內不存在該文件:
# 本地目錄存在 test.txt文件 $ docker run --name=test -v ~/test.txt:/srv/test.txt-d volume_test 2d6853c10643a735ae3d7f3aaac8c6344f9c75170e531f613d08db7cdf484e54 # 容器內存在 /srv 文件夾,里面原本有一個 index.php 。 $ docker exec -it test sh /srv # ls index.php test.txt /srv # # 可以看到文件掛載成功。
情況四、宿主機存在文件夾掛載到容器不存在文件夾
接下來是宿主機存在文件夾,容器不存在該文件夾,宿主機的 test 文件夾里面存在一個 hello 文件:
$ docker run --name=test -v ~/test:/srv/test -d volume_test c935ffa0d9fc5e5ac8f213a51a878e71056472b0597d2e385a29e5c748012958 # 進入容器,查看是否存在 test 文件夾,以及文件夾里面是否有 hello 文件。 $ docker exec -it test sh /srv # ls index.php test /srv # cd test/ /srv/test # ls hello /srv/test #
上面兩個例子說明了,容器內部如果不存在文件,宿主機直接掛載。
情況五、宿主機文件夾掛載到容器文件
接下來假設宿主機存在 test 文件夾,而容器內部存在的是名為 test 文件,這樣掛載會怎樣呢?
$ 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".
上面的情況不出意外是啟動錯誤。
情況六、同名文件夾掛載
那么假設宿主機是文件夾,容器也是文件夾,兩個文件夾里面內容不一樣,宿主機內部有一個 hello 文件,容器的文件夾里面有一個 index.php :
$ docker run --name=test -v ~/srv:/srv -d volume_test 3aec30122bd7010c694e0ff8b77f7b7b6bb6f850c258786db125313060fad43b$ docker exec-it test sh /srv # ls hello /srv # # 可以看到,宿主機文件夾會覆蓋容器內部的文件夾。
情況七、同名文件掛載
假設宿主機有一個 test.txt 文件,里面寫著 Hello World,而容器里面也存在一個 test.txt 文件,里面寫著 Hi World,現在掛載文件:
$ 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 # # 宿主機會覆蓋容器的文件。
情況八、宿主機文件掛載到容器文件夾
最后一種情況,宿主機存在文件 test.txt,而容器內部存在一個 test 的文件夾,現在把 文件掛載到文件夾中:
$ 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". # 啟動失敗。
小結:
宿主機文件 | 容器內文件 | 啟動參數(加粗表示不存在) | 容器啟動情況 |
---|---|---|---|
不存在 | 文件 | -v ~/test.txt:/etc/hosts | 啟動錯誤 |
不存在 | 文件夾 | -v ~/srv:/srv | 啟動正常 |
文件 | 不存在 | -v ~/test.txt:/srv/test.txt | 啟動正常 |
文件夾 | 不存在 | ~/test:/srv/test | 啟動正常 |
文件夾 | 文件 | ~/test:/srv/test | 啟動錯誤 |
文件夾 | 文件夾 | -v ~/srv:/srv | 啟動正常 |
文件 | 文件 | -v ~/test.txt:/srv/test.txt | 啟動正常 |
文件 | 文件夾 | -v ~/test.txt:/test | 啟動錯誤 |
看完了這篇文章,相信你對“Docker中容器數據卷掛載的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。