有些容器會自動產生一些數據,爲了避免讓數據隨着container的消失而消失,保證數據的安全性。例如:數據庫容器,數據表的表會產生一些數據,若是我把container給刪除,數據就丟失。爲了保證數據不丟失,這就有了Volume的存在。html
Data Volume 結構圖 mysql
Docker持久化數據的方案Volume的類型nginx
以官方鏡像mysql的dockerfile文件爲例。其中dockerfile經過volume指定了當前容器中要備份的文件路徑,可是並無指定說要保存到宿主機的哪一個位置。git
volume: 映射容器中的文件到本地宿主機硬盤中github
在咱們使用docker run
啓動mysql鏡像容器的時候,容器會默認在宿主機生成一個volume,至於位置在哪,名字是什麼,能夠經過以下命令查看
#查看全部volume
docker volume ls
#刪除指定volume
docker volume rm [volume name]
#查看volume詳細
docker volume inspect [volume name]
複製代碼
此時咱們刪除容器,發現volume數據卷還在,有保留。
此時咱們會以爲這個data volume name 的名字很長,很很差理解。咱們能夠經過
-v
以下命令來指定生成的volume name
docker run -d -v mysql:/var/lib/mysql --name mysql mysql5.7
-v
:前參數是volume name, :後面的是要備份的文件目錄(容器)
此時咱們刪除容器,volume數據卷還在,咱們用這個名爲mysql的volume做爲一個新容器的數據卷,覆蓋它。
docker run -d -v mysql:/var/lib/mysql --name mysql2 mysql5.7
和上面Data Volume不一樣的是,bind Mounting只能經過docker run -v
方式啓動,沒法使用dockerfile文件的方式。sql
運行容器的時候指定本地的一個文件目錄和容器中的一個文件目錄的映射,經過這個能夠作文件數據同步,2方不管哪一方有修改,另外一方都會同步內容docker
docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name nginx nginx
複製代碼
這個時候-v
:前面的參數是本機文件路徑, :後面是docker文件目錄(容器)數據庫
值得注意的是,使用bind Mounting方式作數據卷的映射時,首次docker run -v
運行,若是本機的文件夾是沒有內容的,docker容器中的文件夾是有內容的,則本機的會覆蓋dokcer容器中的,也就是容器中本來有內容的也會沒有內容。安全