目錄
?Docker數據卷簡介
添加數據卷的命令
容器數據卷的繼承
?Docker數據卷簡介
????????Docker容器產生的數據,如果不備份,當容器實例刪除后,容器中的數據也會消失,為了保存數據可以在Docker中使用數據卷。Docker數據卷是宿主機的一個可以供一個或多個容器使用的特殊目錄,它可以在容器之間共享和重用,使得本地與容器間傳遞數據更高效。對數據卷的修改會立馬生效,在容器內部與本地目錄均可對數據卷進行修改。
添加數據卷的命令
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
[root@localhost ~]# docker run -it --privileged=true -v /tmp/hostData:/tmp/dockerData1 ubuntu /bin/bash
root@0a8bed347ffc:/#
發現宿主機之前不存在的目錄,現在已經自動創建了?
root@0a8bed347ffc:/# exit
exit
[root@localhost hostData]# cd /tmp/hostData
[root@localhost hostData]# ll
總用量 0
在宿主機對應的目錄下創建文件
[root@localhost hostData]# touch hello.txt
[root@localhost hostData]# ls
hello.txt
?在容器目錄中查看
root@0a8bed347ffc:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@0a8bed347ffc:/# cd /tmp/dockerData1
root@0a8bed347ffc:/tmp/dockerData1# ls
hello.txt
在容器中再創建一個文件
root@0a8bed347ffc:/tmp/dockerData1# touch hi.txt
回到宿主機中查看
root@0a8bed347ffc:/# read escape sequence
[root@localhost hostData]# ll
總用量 0
-rw-r--r-- 1 root root 0 12月 9 15:11 hello.txt
-rw-r--r-- 1 root root 0 12月 9 15:22 hi.txt
發現已經同步
把容器停止后再次在宿主機對應的目錄里再次創建文件
[root@localhost hostData]# docker stop 0a8bed347ffc
0a8bed347ffc
[root@localhost hostData]# touch a.java
[root@localhost hostData]# ll
總用量 0
-rw-r--r-- 1 root root 0 12月 9 15:27 a.java
-rw-r--r-- 1 root root 0 12月 9 15:11 hello.txt
-rw-r--r-- 1 root root 0 12月 9 15:22 hi.txt
再次啟動容器進入對應目錄查看
[root@localhost hostData]# docker exec -it 0a8bed347ffc /bin/bash
root@0a8bed347ffc:/# cd /tmp/dockerData1
root@0a8bed347ffc:/tmp/dockerData1# ls
a.java hello.txt hi.txt
即使容器停止了再次啟動容器后,文件仍然可以同步
進行查看數據卷的掛載
[root@localhost /]# docker inspect 0a8bed347ffc
上面的掛載默認在容器的內部都可以進行讀寫操作,如果只想在容器內部進行讀操作,需要加上:ro標識
docker run -it --privileged=true -v /tmp/hostData:/tmp/dockerData1:ro ubuntu /bin/bash
發現創建文件失敗?
root@096812c74cfd:/# cd /tmp/dockerData1
root@096812c74cfd:/tmp/dockerData1# touch b.txt
touch: cannot touch 'b.txt': Read-only file system
如果宿主機寫入內容,容器可以讀到
容器數據卷的繼承
先啟動一個ubuntu容器1
[root@localhost /]# docker run -it --privileged=true -v /tmp/hostData:/tmp/data --name=u1 ubuntu /bin/bash
?再啟動容器1繼承容器2的卷規則
docker run -it --privileged=true --volumes-from 父類 --name u2 ubuntu
[root@localhost /]# docker run -it --privileged=true --volumes-from u1 --name=u2 ubuntu /bin/bash
在容器1中創建文件?
[root@localhost /]# docker exec -it b3f94425fa58 /bin/bash
root@b3f94425fa58:/# cd /tmp/data
root@b3f94425fa58:/tmp/data# touch abc.java
root@b3f94425fa58:/tmp/data# ls
a.java abc.java hello.txt hi.txt
在容器2中查看
[root@localhost /]# docker exec -it ddd332ab820c /bin/bash
root@ddd332ab820c:/# cd /tmp/data
root@ddd332ab820c:/tmp/data# ls
a.java abc.java hello.txt hi.txt
發現容器2中也存在了abc.java文件,這樣就實現了不同容器之間的數據共享