Date Volume 本質上是Dokcer host檔案系統中的目錄或者檔案,能夠直接被mount到容器的檔案系統中。
Data Volume 有如下特點:
1、Data Volume 是目錄或者檔案,而非沒有格式化的磁碟(塊裝置)
2、容器可以讀寫volume中的資料
3、volume資料可以被永久的儲存,即使使用他的容器已經銷燬
現在有三種方式來儲存資料:映象層、容器層、volume 。考慮如下幾個場景:
1、Database 軟體 vs Database 資料
2、Web應用 vs 應用產生的日誌
3、資料分析軟體 vs input/output 資料
4、apache server vs 靜態HTML檔案
對於以上四種場景,前者是無狀態的,放在資料層,屬於映象的一部分。後者放在Data Volume中,這是需要持久化的資料,應該與映象分開存放。
設定volume容量
因為volume實際上是docker host檔案系統的一部分,所以volume的容量取決於檔案系統當前未使用的空間,目前還沒有辦法設定volume的容量
volume掛載方式1 bind mount
將host上已經存在的目錄或者檔案mount到容器
掛載方式
1、目錄 -->> 目錄
docker run -v <host dir path>:<container dir path> image_name
2、檔案 -->> 檔案
docker run -v <host file path>:<container file path> image_name
3、只讀方式掛載
docker run -v <host path>:<container path>:ro image_name
4、目錄 -->> 不存在目錄(會自動在容器中建立這個不存在的目錄,內容是docker host上的指定目錄)
docker run -v <host dir path>:<container none_dir path> image_name
5、檔案 -->> 不存在的檔案(會自動在容器中建立這個不存在的檔案,內容是dokcer host上的指定檔案)
docker run -v <host file path>:<container none_file path> image_name
6、不存在path -->> 存在目錄(在docker host上建立一個空目錄,掛載到容器中,覆蓋容器中的目錄)
docker run -v <host none_path>:<container dir> image_name
7、不存在path -->> 存在檔案(報錯,無法掛載)
docker run -v <host none_path>:<container file> image_name
8、不存在path -->> 不存在path (會在dockerhost和容器中分別建立對應的path,進行掛載)
docker run -v <host path>:<container path>:ro image_name
容器銷燬後,之前對docker host 上進行的檔案或者目錄修改不會丟失,會持久儲存
需要注意的是,當容器遷移到新的docker host上,而該host上沒有目錄可供掛載,那麼掛載會失敗
1、測試一個正常的httpd容器
root@docker-lab:~/html# docker run -d -p 81:80 httpd
eafed05a921727813c10dad78e3b850e44729b1f9866f511fb5edfbafbfe5256
root@docker-lab:~/html# docker inspect eafe -f '{{.NetworkSettings.IPAddress}}'
172.17.0.12
root@docker-lab:~/html# curl http://172.17.0.12
<html><body><h1>It works!</h1></body></html>
root@docker-lab:~/html# curl http://127.0.0.1:81
<html><body><h1>It works!</h1></body></html>
2、掛載docker host上的HTML目錄到httpd容器中,且容器銷燬後dockerhost上的檔案還在
root@docker-lab:~/html# pwd
/root/html
root@docker-lab:~/html# cat index.html
Docker Volume bind test
root@docker-lab:~/html# docker run -d -p 80:80 -v /root/html:/usr/local/apache2/htdocs httpd
595f3bf54850a93c0b10580efed8f3c7c6ab70c264ad8b3bd108898a3f059295
root@docker-lab:~/html# docker inspect 595f -f '{{.NetworkSettings.IPAddress}}'
172.17.0.11
root@docker-lab:~/html# curl http://172.17.0.11
Docker Volume bind test
root@docker-lab:~/html# curl http://127.0.0.1:80
Docker Volume bind test
root@docker-lab:~/html# docker stop 595f
595f
root@docker-lab:~/html# docker rm 595f
595f
root@docker-lab:~/html# pwd
/root/html
root@docker-lab:~/html# cat index.html
Docker Volume bind test
3、掛載docker host上的檔案到容器中,驗證效果
root@docker-lab:~/html# docker run -d -p 80:80 -v /root/html/index.html:/usr/local/apache2/htdocs/index.html httpd
0c51a31ee4c1412785864ef1ad820b8624e7e8f5338cb35c1a7d8f7afab3edf4
root@docker-lab:~/html# docker inspect 0c51 -f '{{.NetworkSettings.IPAddress}}'
172.17.0.11
root@docker-lab:~/html# curl http://172.17.0.11
Docker Volume bind test
root@docker-lab:~/html# curl http://127.0.0.1
Docker Volume bind test
4、確認busybox容器預設 /home 目錄是空的
root@docker-lab:~/html# docker run -it busybox sh
/ # ls -a /home/
. ..
5、掛載目錄到容器中,並驗證只讀引數
root@docker-lab:~/html# docker run -it -v /root/html:/home:ro busybox sh
/ # ls -a /home/
. .. index.html
/ # echo aaa > /home/testwrite
sh: can't create /home/testwrite: Read-only file system
6、掛載檔案到容器中一個不存在的檔案
root@docker-lab:~/html# docker run -it -v /root/html/index.html:/home/index.html2 busybox sh
/ # ls -a /home/
. .. index.html2
/ # cat /home/index.html2
Docker Volume bind test
7、掛載一個不存在的path到容器中也不存在的path,會在dockerhost和容器中分別建立對應的path,進行掛載
root@docker-lab:~/html# docker run -it -v /root/html/index.html2:/home/index.html busybox sh
/ # ls -a /home/
. .. index.html
/ # echo aaa > /home/index.html/testfile
/ # cat /home/index.html/testfile
aaa
/ # exit
root@docker-lab:~/html# ls
index.html index.html2
root@docker-lab:~/html# cat index.html2/testfile
aaa