Docker容器的數據卷(data volume),數據卷容器,數據卷的備份和還原。
數據卷就是數據(一個文件或者文件夾)。
Docker的理念之一是將應用與其運行的環境打包,docker容器的生命周期是與其運行的程序一致的,而對數據的要求是持久化,docker容器之間也需要有共享數據的渠道。
數據卷是特殊的目錄,可以繞過聯合文件系統,為一個或多個容器提供訪問。數據卷設計的目的是數據的永久化,是完全獨立於容器的生命周期,不會在容器刪除時刪除其掛載的數據卷,也不會存在類似垃圾收集機制,對容器引用的數據卷進行處理。
數據卷存在於宿主機中,獨立於容器,和容器的生命周期是分離的,數據卷存在於宿主機的文件系統中,數據卷可以目錄也可以是文件,容器可以利用數據卷與宿主機進行數據共享,實現了容器間的數據共享和交換。 數據卷的特點: 1.容器啟動的時候初始化的,如果容器使用的鏡像包含了數據,這些數據也會拷貝到數據卷中。 2.容器對數據卷的修改是及時進行的。 3.數據卷的變化不會影響鏡像的更新。數據卷是獨立於聯合文件系統,鏡像是基於聯合文件系統。鏡像與數據卷之間不會有相互影響。 4.數據卷是宿主機中的一個目錄,與容器生命周期隔離。 為容器添加數據卷(數據存放的地址): $sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash :-v指定數據卷在本機中的目錄和在容器中映射的目錄名。如果本機目錄container_data不存在會創建,data 是容器中映射的目錄。 yw1989@ubuntu:~$ docker run -it -v ~/ywjuan:/ywjuan ubuntu /bin/bash root@b78c81987d93:/# ls : 就包含了叫ywjuan的目錄 bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr ywjuan root@b78c81987d93:/# touch ywjuan/c1 : 在這個目錄中創建一個文件 root@b78c81987d93:/ywjuan# echo "i am yaowen" > c1 : 文件中寫入一個字符串 exit退出容器。 本機ls可以看到ywjuan文件夾,查看文件可以看到c1文件存在於ywjuan中了。 yw1989@ubuntu:~$ ls Desktop Documents examples.desktop Pictures Templates ywjuan dockerfile Downloads Music Public Videos yw1989@ubuntu:~$ cd ywjuan/ yw1989@ubuntu:~/ywjuan$ ls c1 :剛才輸入的字符也存在了 查看剛才的鏡像: yw1989@ubuntu:~/ywjuan$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b78c81987d93 ubuntu "/bin/bash" 15 minutes ago Up 15 minutes nifty_wozniak $docker inspecr b78c81987d93:可以看到Volumes信息。 為數據卷添加權限:$sudo docker run -it -v ~/datavolume:/data:ro --name=bghd ubuntu /bin/bash ,ro是只讀, 在容器的data文件目錄中就不能創建文件,因為是只讀的。$docker inspecr b78c81987d93可以看到數據卷信息和權限。 可以在dockerfile文件中加上VOLUME[“/data”]來創建含有數據卷的鏡像並使用該鏡像創建包含數據卷的容器。Dockefifle可以創建多個數據卷,與在run命令中創建數據卷不同,dockerfile中的數據卷不能映射到已經存在的本地文件目錄的,在鏡像構建時指定的數據卷會在容器啟動時創建指定名字的數據卷,運行同樣鏡像的容器創建的數據據是不一樣的(可以看到不同容器的數據卷地址是不一樣的)。當容器中的數據卷地址不一樣時,容器之間就無法共享數據了。 Docker run --name 容器名 -it 該鏡像名。 數據卷容器:命名的容器掛在數據卷,其他容器通過掛在這個容器實現數據共享,掛在數據卷的容器叫做數據卷容器。數據卷容器掛載了一個本地目錄,其他容器連接這個容器來實現數據的共享(數據地址的拷貝)。
$docker run --volumes-from [container name] 1.創建包含數據卷的鏡像 使用鏡像創建容器:docker run -it --name dvt4 jingxiang(或者 docker run -it --name=dvt4 -v ~/ywjuan:/ywjuan ubuntu /bin/bash) 2.可以看到在容器中創建了數據卷文件目錄,然后在目錄中創建文件,並寫入數據 3.退出容器 4.創建一個容器來掛載剛才這個容器$docker run -it --name dvt5 --volumes-from dvt4 ubuntu /bin/bash 5.進入新的容器,看有沒有文件 6.創建一個容器來掛載剛才這個容器$docker run -it --name dvt6 --volumes-from dvt4 ubuntu /bin/bash 看看有沒有文件 掛在容器就不用連接到宿主機的目錄去,可以隱藏服務器的實際目錄, $docker inspect --format=”{{.Volumes}}” dvt5 dvt6 返回的是數據卷的目錄不是數據卷容器的信息,dvt5 dvt6信息是一致的。修改一個容器其他容器也改了。 $docker rm dvt4 :刪除數據卷容器,掛載了這個數據卷容器的容器仍然可以訪問數據卷容器掛在的目錄。通過數據卷容器掛載數據卷容器的作用僅僅是一個數據卷配置信息的傳遞(就是數據地址的引用)。
創建新的數據卷容器dvt8, docker run -it --name dvt8 jingxiang(或者 docker run -it --name=dvt8 -v ~/ywjuan:/ywjuan ubuntu /bin/bash) dvt9掛在dvt8 docker run -it --name dvt9 --volumes-from dvt8 ubuntu /bin/bash 刪除dvt8和其數據卷:docker rm -v dvt8 $docker restart dvt9 $docker attach dvt9 #ls : 容器9中依然可以訪問容器8掛載的數據卷。Docker中一個數據卷還在被容器使用那么他就會一直存在,數據卷容器的作用僅僅是傳遞數據卷的配置,沒有其他用處。 Docker數據卷的備份和還原遷移: $docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar [container data volume] --volumes-from : 掛載一個容器。 -v :指定保存數據的路徑。 tar cvf :是容器運行時執行的命令,執行的是一個壓縮文件tar命令,將要備份容器中的目錄壓縮到指定的目錄下。
要備份的數據容器的數據,是備份在一個容器上,這個容器是掛載了要備份數據的容器。 執行備份命令的容器既掛載了一個需要備份的數據卷(volumes-from本就是對數據地址的引用)又掛載了一個備份數據的數據卷。(數據卷就是數據,一個文件或者文件夾) $docker restart dvt5 : 重啟dvt5容器 $docker attach dvt5 : 登陸這個容器 #ls : 現在要備份datavolume1這個目錄 #exit : 退出這個容器 $docker run --volumes-from dvt5 -v ~/backup1:/backup2:wr --name=dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume1(這個容器的名字叫做dvt10,掛載在dvt5上,宿主機目錄是backup1,容器中的目錄是backup2,權限是讀寫權限,運行ubuntu系統,壓縮之后的路徑是/backup/dvt5.tar,/datavolume1是需要壓縮備份的目錄): 將一個包含數據卷的容器中的數據,通過一個容器執行一個壓縮命令,從而將數據備份出來。 解壓縮命令實現備份數據的還原:$docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar [container data volume]