iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 17
3
DevOps

用30天來介紹和使用 Docker系列 第 17

Day17:使用 Docker Volume 的功能 (一)

  • 分享至 

  • xImage
  •  

之前有說明過在執行 Docker Container 的時侯檔案系統會分為 Image 層、Init 層以及可讀可寫層這三個部份,當 Docker Container 刪除掉之後,存放在 Docker Container 上的資料也就會跟著刪除掉,因此需要把不想要被刪除掉的資料存放在實體機器上,避免資料不見的問題。

主要實作如何使用 Docker 的 Volume 功能,把資料寫入到實體機器上,主要的方式有二個方法:

  1. 在執行 docker run 指令時加上 -v 參數,使得 Container 裡面的檔案路徑Mapping 到實體主機的檔案路徑。

  2. 在撰寫 Dockerfile 時,加入 VOLUME 指令,做到把資料存放在實體的主機上。使用這種方法需要搭配 docker inspect 指令,才能查詢到實體主機檔案的存放路徑在哪。(這個明天會做介紹)

Example1:

在使用 docker run 指令時,指定 -v 參數,使得實體主機的資料夾路徑 Mapping 到 Container 的資料夾路徑,指令如下

$ docker run -it -v /home/user1/storage:/storage centos /bin/bash

/home/user1/storage 是實體主機的資料夾路徑 Mapping 到 Container 裡面的 /storage 資料夾路徑。

執行畫面如下:
https://ithelp.ithome.com.tw/upload/images/20171220/201034568VBqsahBBQ.png

我們就會在上個畫面中的左邊視窗看到執行 docker run 指令時使用 -v參數 Mapping 到實體主機的 /home/user1/storage 的資料夾。然後在右邊視窗中的實體主機 /home/user1/storage 的資料夾建立一個 helloworld.txt 的檔案,最後再回到左邊視窗的 Container 裡面的 /storage 資料夾去看 helloworld.txt 的檔案已經存在了。

Example2:

在使用 docker run 指令時,指定 -v參數,但是沒有指定實體主機的檔案路徑,指令如下

$ docker run -it -v /storage centos /bin/bash

使用以上的指令會發現到沒有指定實體主機的資料夾路徑,那資料會跑到哪裡去了呢?
要回答這個答案之前需要先使用 docker volume ls 可以看到如下的畫面
https://ithelp.ithome.com.tw/upload/images/20171220/20103456hggPfYWnav.png

上圖就是一個 Container 的 Volume,如果要找到在實體主機真實的資料夾路徑,可以使用以下的指令:

$ docker inspect -f '{{.Mounts}}' 4c2a9ef663c2

4c2a9ef663c2 是 Container 的 ID
執行畫面如下
https://ithelp.ithome.com.tw/upload/images/20171220/20103456FnOfepvS4Q.png

上圖就可以找到 Volume 在實體主機的真實路徑,這時侯就可以使用 cd command 切進上圖查詢出來的資料夾路徑並且寫入一個檔案在此資料夾,但是要注意使用者權限的問題,這裡是直接切換成 root 權限,如下圖:
https://ithelp.ithome.com.tw/upload/images/20171220/20103456a1xW8B8d8a.png

從上圖就可以看到helloworld.txt的檔案有在 container上出現,也就有成功的把 Volume 這個功能執行起來。

今天已經介紹了如何使用 docker run,指令把Container 的資料夾 Mapping 到實體機器上,明天要繼續介紹的部份是透過使用撰寫 Dockerfile 的方式把 Volume 掛載起來。


上一篇
Day16:實作簡單的 service 程式打包成 Docker Image(二)
下一篇
Day18:使用 Docker Volume 的功能 (二)
系列文
用30天來介紹和使用 Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
chichi
iT邦新手 3 級 ‧ 2018-01-12 19:30:34

docker run -it -v /home/user1/storage:/storage centos /bin/bash
想問 :/storage 這資料夾是 centos image 存在的資料夾 ?

:/storage 不是 CentOS Image 存在的資料夾,是因為啟動 docker container 時使用了 -v 參數之後會自動在 container 裡建立 /storage 的資料夾。

chichi iT邦新手 3 級 ‧ 2018-01-13 14:15:34 檢舉

感謝,困惑很久了。

0
cchangleo
iT邦見習生 ‧ 2019-03-13 18:47:50

想請問 後面的 centos /bin/bash 是代表什麼呢
新手問問題不好意思

orzzro iT邦新手 5 級 ‧ 2019-08-06 09:42:19 檢舉

使用centos image 並採用bash shell 執行指令

我要留言

立即登入留言