docker容器也分為有狀態和無狀態的,像我們經常使用的busybox,我們只是運行後進行一些簡單的命令測試,如wget、ping等等,不需要保存數據供後面在使用,使用完直接退出就好,但對於另一類應用,如數據庫,消息隊列,ES之類的應用,他們需要保存之前的數據,就算容器銷燬我們也希望保留之前的數據,這類容器時具有狀態的,所以我們需要將這些數據單獨存儲起來。
一、Data Volume
特點:Data Volume是目錄或者文件,不是磁盤等設備
容器可以讀寫volume中的數據
volume數據可以永久保存,即使容器銷燬
1.1、bind mount是將host上已有的文件或目錄mount到容器
注意:面試的時候面試官經常會問一個問題,如果我這個容器需要進行一些測試,但是又沒有這個命令,容器不能聯網安裝,我們怎麼辦?
這個時候如果我們host機器有這個命令,就將該命令所在文件bind mount到容器裡面,如果沒有需要下載傳到host上,在用同樣的方法bind mount到容器裡面
-v <host>:<container> 將主機的文件掛到容器http首頁默認的位置,後面我們更新主機上的文件,容器裡面的也會隨之更新,bind mount實際是主機和容器共同使用數據,後面我們把容器銷燬,數據也不會丟失。/<container>/<host>
優點:我們可以很方便的將源代碼mount到容器中,在host上修改代碼就可以在容器中看到應用的實時效果,數據庫可以很方便的將數據bind mount到容器裡面,方便遷移和備份數據
缺點:指定了固定的目錄,限制容器的移植性,如果容器遷移到其他機器,對應的數據也要遷移過去而且要在對應的位置,否則容器就會報錯
1.2、docker managed volume
創建過程:
(1)、容器啟動,告訴docker我需要一個volume來存放數據,然後在幫我mount到指定目錄
(2)、docker在/var/lib/docker/volumes下隨機生成一個目錄做為mount源
(3)、如果指定的目錄已經存在,則將數據複製到mount源
(4)、將volume mount到指定的目錄
docker managed volume和bind mount最大的區別就是不需要指定monut的源
[root@my_server ~]# docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd
f513b19f43bc236bfdb11c942b6af138763db2fcdc68e27ff3d646551aba554f
[root@my_server ~]# docker inspect f513b
我們可以看到生成的index.html和容器裡面的文件內容一模一樣,在創建容器的時候mount point指向的是已有的目錄,原有的容器裡面數據會被複制到volume中,此時我們也可以像bind mount一樣更新數據
二、數據共享
2.1、將共享數據放到bind mount中,然後在mount到多個容器,下圖是演示
2.2、volume container
[root@my_server ~]# docker create --name vc_date \\
-v index.html:/usr/local/apache2/htdocs \\
-v /tmp/tools/ busybox
08909c820fd5e3ca9b06b7970c21d5d838f341d1fb75c3e76f92fb37e6569df3
[root@my_server ~]# docker run --name web1 -d -p 80 --volumes-from vc_date httpd
017b5c98ab27eac7ae3d3052f307aff2968d0b1efef6ad9d4bc015e90b027401
與bind mount相比,不用為每個容器指定host path,所有的path都在volume container中定義好了,只需要與該容器關聯,就可以實現與host解耦。部分代碼部分橫屏更加易於理解哦,感謝您的閱讀,歡迎關注和轉發。
閱讀更多 pythontaotao 的文章