之前有說明過在執行 Docker Container 的時侯檔案系統會分為 Image 層、Init 層以及可讀可寫層這三個部份,當 Docker Container 刪除掉之後,存放在 Docker Container 上的資料也就會跟著刪除掉,因此需要把不想要被刪除掉的資料存放在實體機器上,避免資料不見的問題。
主要實作如何使用 Docker 的 Volume 功能,把資料寫入到實體機器上,主要的方式有二個方法:
在執行 docker run
指令時加上 -v
參數,使得 Container 裡面的檔案路徑Mapping 到實體主機的檔案路徑。
在撰寫 Dockerfile 時,加入 VOLUME
指令,做到把資料存放在實體的主機上。使用這種方法需要搭配 docker inspect
指令,才能查詢到實體主機檔案的存放路徑在哪。(這個明天會做介紹)
在使用 docker run
指令時,指定 -v
參數,使得實體主機的資料夾路徑 Mapping 到 Container 的資料夾路徑,指令如下
$ docker run -it -v /home/user1/storage:/storage centos /bin/bash
/home/user1/storage
是實體主機的資料夾路徑 Mapping 到 Container 裡面的 /storage
資料夾路徑。
執行畫面如下:
我們就會在上個畫面中的左邊視窗看到執行 docker run
指令時使用 -v
參數 Mapping 到實體主機的 /home/user1/storage
的資料夾。然後在右邊視窗中的實體主機 /home/user1/storage
的資料夾建立一個 helloworld.txt 的檔案,最後再回到左邊視窗的 Container 裡面的 /storage 資料夾去看 helloworld.txt 的檔案已經存在了。
在使用 docker run
指令時,指定 -v
參數,但是沒有指定實體主機的檔案路徑,指令如下
$ docker run -it -v /storage centos /bin/bash
使用以上的指令會發現到沒有指定實體主機的資料夾路徑,那資料會跑到哪裡去了呢?
要回答這個答案之前需要先使用 docker volume ls
可以看到如下的畫面
上圖就是一個 Container 的 Volume,如果要找到在實體主機真實的資料夾路徑,可以使用以下的指令:
$ docker inspect -f '{{.Mounts}}' 4c2a9ef663c2
4c2a9ef663c2
是 Container 的 ID
執行畫面如下
上圖就可以找到 Volume 在實體主機的真實路徑,這時侯就可以使用 cd
command 切進上圖查詢出來的資料夾路徑並且寫入一個檔案在此資料夾,但是要注意使用者權限的問題,這裡是直接切換成 root 權限,如下圖:
從上圖就可以看到helloworld.txt的檔案有在 container上出現,也就有成功的把 Volume 這個功能執行起來。
今天已經介紹了如何使用 docker run
,指令把Container 的資料夾 Mapping 到實體機器上,明天要繼續介紹的部份是透過使用撰寫 Dockerfile 的方式把 Volume 掛載起來。
docker run -it -v /home/user1/storage:/storage centos /bin/bash
想問 :/storage 這資料夾是 centos image 存在的資料夾 ?
:/storage
不是 CentOS Image 存在的資料夾,是因為啟動 docker container 時使用了 -v 參數之後會自動在 container 裡建立 /storage
的資料夾。
感謝,困惑很久了。
想請問 後面的 centos /bin/bash 是代表什麼呢
新手問問題不好意思
使用centos image 並採用bash shell 執行指令