1. 程式人生 > >【docker】Docker 容器資料卷掛載小結

【docker】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 |啟動錯誤|


作者:左藍
連結:https://www.jianshu.com/p/e605de64e9f9
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

歡迎關注公眾號:

相關推薦

dockerDocker 容器資料掛載小結

為了更直觀瞭解資料卷掛載的操作,做個實驗一一驗證資料卷掛載的各種情況。 情況一、本地不存在檔案掛載到容器存在檔案 首先是當本地不存在該檔案,而容器記憶體在該檔案的情況,嘗試把不存在的檔案掛載到存在該檔案的容器中。以一個 Alpine 映象為例,這裡把一個修改後的

Docker(五):容器資料2

資料卷(DockerFile新增) DockerFile: 對映象的一種原始碼級的描述檔案 1、根目錄下新建mydocker資料夾並進入 2、可在DockerFile中使用VOLUME指令來給映象新增一個或多個數據卷 VOLUME["/dataVolumeC

docker學習-05容器資料

Docker的理念:     *  將運用與執行的環境打包形成容器執行 ,執行可以伴隨著容器,但是我們對資料的要求希望是持久化的     *  容器之間希望有可能共享資料     Docker容器產

Docker容器資料volumes-from

定義4個終端: 終端host 終端container dc01 終端container dc02 終端container dc03 各個容器之間的關係: 1、啟動一個父容器dc01 啟動一個父容器dc01,並在 dataVolumeCon

dockerdocker啟動、重啟、關閉命令,附帶:docker啟動容器報錯:docker: Error response from daemon: driver failed programming external connectivity on endpoint es2-node

在關閉並放置centos 的防火牆重啟之後【操作:https://www.cnblogs.com/sxdcgaq8080/p/10032829.html】 啟動docker容器就發現開始報錯: [[email protected] elasticSearch]# docker run -d

Docker基礎 5.Docker容器資料

Docker基礎 @Author:hanguixian @Email:[email protected] Docker文件:https://docs.docker.com/ Dcker中文文件:https://docs.docker-cn.com/ 五.

Docker容器資料的使用

作用:  1.容器的持久化  2.容器間的繼承(主要體現在dockerfile)+共享資料 特點:  1.卷中的更改可以直接生效  2.資料卷中的更改不會包含在映象的更新中  3.資料卷的生命週期,會一直持續到沒有容器使用它為止 使用命令:docker run -it -v /宿主機絕對路徑

DockerDocker入門操作容器和映象

容器 建立容器 從映象上建立並執行一個新的容器 sudo docker run -i -t ubuntu /bin/bash 要在命令列下建立一個能互動的容器,而不是一個執行後臺服務的容器,則-i和-t是最基本的引數 -i引數保證容器中STDI

Docker容器資料

一、是什麼? Docker的理念:將運用於執行的環境打包形成容器執行,執行可以伴隨著容器,但是我們對資料的希望是持久化,同時希望容器之間能夠共享資料。Docker產生的資料,如果不通過docker commit生成新的映象,使得資料作為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就

dockerdocker容器和宿主機之間檔案互傳,互相拷貝

原文地址:https://www.cnblogs.com/areyouready/p/8973495.html     【注意:命令中符號均為英文符號】 1、從容器裡面拷檔案到宿主機      答:在宿主機裡面執行以下命令    

Docker容器和本機之間的檔案傳輸

主機和容器之間傳輸檔案的話需要用到容器的ID全稱。 獲取方法如下: 1.先拿到容器的短ID或者指定的name。 2.然後根據這兩項的任意一項拿到ID全稱。 有了這個長長的ID的話,本機和容器之間的檔案傳輸就簡單了。 docker cp 本地檔案路徑 ID全稱:容器路徑 進入容器之後

專欄 - Docker+Kubernetes(k8s)微服務容器化實踐

Docker+Kubernetes(k8s)微服務容器化實踐 Docker官方支援Kubernetes, Kubernetes是容器編排最大贏家,Kubernetes 以其高效、簡便、高水平的可移植性等優勢佔領了絕大部分市場,江湖

docker容器如何優雅的終止詳解

docker容器如何優雅的終止詳解 最近公司在試驗如何將專案部署到docker容器中去,這其中涉及到一個技術環節,那就是如何讓docker容器優雅的終止。所謂優雅終止,指的就是程式在退出前有清理資源,儲存必要中間狀態,持久化記憶體資料的機會。下面通過這篇大

Docker 容器資料

前提 Docker容器產生的資料,如果不通過docker commit生成新的映象,使資料做為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就沒有了。 為了能儲存資料在docker中我們使用卷。目的就是為了讓容器內的資料吃持久化. 資料卷的介紹 卷就是目錄或檔案,存在於一個或多個容器中,由dock

Docker系列-第五篇Docker容器資料

1.是什麼 在生產環境中使用 Docker,往往需要對資料進行持久化,或者需要在多個容器之間進行資料共享,這必然涉及容器的資料管理操作 。 容器中的管理資料主要有兩種方式 : 資料卷 ( Data Volumes ) : 容器內資料直接對映到本地主機環境; 資料卷容器( Data Volume Contai

Docker(六)容器資料

## 容器資料卷 ### docker的理念回顧 將應用和環境打包成一個映象 **需求:資料可以持久化和同步** ### 使用資料卷 #### 指定路徑掛載 ``` docker run -it -v 主機目錄:容器內目錄 # 測試 [root@hwh1 ~]# docker run -it -v /ho

LinuxServicesDockerDocker File

鏡像 數據 基於 mman 行為 絕對路徑 ring 頁面 cobbler Docker Images: docker commit Dockerfile:文本文件,鏡像文件構建腳本; Dockerfile:由一系列用於根據基礎鏡像構建新的鏡像文件的專用指令序列組

dockerdocker下安裝mysql

body 進入 div pass com clas doc oot class 1 拉取mysql鏡像,采用網易加速地址docker pull hub.c.163.com/library/mysql:5.7 2 重命名鏡像名docker tag hub.c.163.com/

LinuxServicesSaaSDocker+kubernetes(4. 用ansible管理機器和軟件)

實現 service SDR https 輸出 公司 keygen /etc slave 1. 簡介 1.1. 公司環境使用的puppet,但是我更喜歡ansible,原因有二,第一,我是紅帽的忠粉:),第二,我對python比較熟悉 1.2. ansible官方網站:ht

轉載Docker 經驗之談

com 適合 自動下載 roo static 包含 處理 library latest 本文來源:Ghostcloud原創 對於用戶來說,可能一開始在不了解的情況下會對容器報以拒絕的態度,但是在嘗到容器的甜頭、體驗到它的強大性能之後,相信大家最終是無法