什么是數據卷
數據卷?是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
- 數據卷?可以在容器之間共享和享用
- 對?數據卷?的修改立馬生效
- 對?數據卷?的更新,不會影響鏡像
- 數據卷?默認會一直存在,即時容器被刪除
為什么使用數據卷
- 當創建一個容器的時候,容器運行,數據能不能持久化
- 如果能夠持久化,數據存儲在哪?由于 docker 是隔離的,數據能不能存儲在容器外
- 如果部署很多容器,每次都需要進入容器中進行配置嘛?能不能外部進行配置
docker 數據卷呈現給 docker 容器的一個形式就是目錄,該目錄支持多個容器間共享,修改不會影響到鏡像。使用 Docker 的數據卷,類似在系統中使用 mount 掛載一個文件系統。
數據卷掛載操作
三種掛載數據卷格式
- 具體目錄掛載:
docker run [options] -v <宿主機絕對路徑:容器內的路徑[:ro | rw]> <鏡像名>
- 默認目錄掛載:
docker run [options] -v <任意別名:容器內的路徑[:ro | rw]> <鏡像名>
- 匿名目錄掛載:
docker run [options] -v <容器內的路徑[:ro | rw]> <鏡像名>
默認目錄掛載和匿名目錄掛載的目錄默認在?/var/lib/docker/volumes/
?目錄下。
具體目錄掛載?
格式:docker run [options] -v <宿主機絕對路徑 | 任意別名:容器內的路徑[:ro | rw]> <鏡像名>
?
ro
:代表 read-only,容器的路徑只允許讀,不允許寫。不影響宿主機的路徑可讀可寫
rw
:默認值,代表可讀可寫
具名掛載
[root@k8s-master ~]# docker run -d -p 8081:8080 --name tomcat02 -v /opt/aa:/usr/local/tomcat/webapps tomcat:8.5.73
?測試容器和宿主機之間數據共享
#進入tomcat02容器
#進入容器掛載目錄
#創建text.txt文件
[root@k8s-master ~]# docker exec -it tomcat02 bash
root@83751adb2f16:/usr/local/tomcat# cd webapps/
root@83751adb2f16:/usr/local/tomcat/webapps# touch text.txt
root@83751adb2f16:/usr/local/tomcat/webapps# ls
text.txt#在宿主機查看文件
[root@k8s-master ~]# cd /opt/aa/
[root@k8s-master aa]# ls
text.txt#在宿主機添加test2.txt
[root@k8s-master aa]# touch test2.txt
[root@k8s-master aa]# ls
test2.txt text.txt
root@83751adb2f16:/usr/local/tomcat/webapps# ls
test2.txt text.txt
刪除容器
[root@k8s-master ~]# docker rm -f 83751adb2f16
[root@k8s-master aa]# ls
test2.txt text.txt
?默認目錄掛載
格式:docker run [options] -v <任意別名:容器內的路徑[:ro | rw]> <鏡像名>
?
ro
:代表 read-only,容器的路徑只允許讀,不允許寫。不影響宿主機的路徑可讀可寫
rw
:默認值,代表可讀可寫
[root@k8s-master ~]# docker run -d -p 8080:8081 --name tomcat -v aa:/usr/local/tomcat/webapps tomcat:8.5.27
[root@k8s-master ~]# find / -name aa
/var/lib/docker/overlay2/6bd69f1cc95f446236c6a944a059082b3a79f9d8ea76bdf41e30fc7a61f4ff14/diff/usr/lib/.build-id/aa
/var/lib/docker/overlay2/53bde18c658b564d75ec2e18ff485eca8cb8056ae625613e4cecc11a8695dd5d/merged/usr/lib/.build-id/aa
/var/lib/docker/volumes/aa
/usr/share/locale/aa
/opt/aa
#在宿主機中查看[root@k8s-master aa]# cd /var/lib/docker/volumes/aa/_data/
[root@k8s-master _data]# ls
docs examples host-manager manager ROOT
#aa 代表一個數據卷名字,可以是任意,這相當于相對路徑,它會在 /var/lib/docker/volumes 下創建 aa 目錄作為數據卷。
匿名目錄掛載
沒指定名字的掛載都是匿名掛載,-v 只寫了容器內路徑,并沒寫宿主機路徑。
匿名目錄掛載的目錄是:/var/lib/docker/volumes/
,它會在這個目錄生成匿名數據卷目錄。
格式:docker run [options] -v <容器內的路徑[:ro | rw]> <鏡像名>
[root@k8s-master ~]# docker run -d -p 8080:8081 --name tomcat03 -v /usr/local/tomcat/webapps tomcat:8.5.27
#沒有指定宿主機,docker會自動在/var/lib/docker/volumes生成很長的字符串
[root@k8s-master volumes]# ll
total 24
drwx-----x. 3 root root 19 Feb 26 08:03 57228ed1d063b3c66afa84f968018311f3ab5c2e3272d9c7197463981a76df25
#查看數據卷
[root@k8s-master volumes]# docker volume ls
DRIVER VOLUME NAME
local 57228ed1d063b3c66afa84f968018311f3ab5c2e3272d9c7197463981a76df25
?讀寫權限
?啟動 tomcat04 容器,掛載到 kele 數據卷里,并賦予只讀權限
[root@k8s-master ~]# docker run -d -P --name tomcat04 -v frx:/usr/local/tomcat/webapps:ro tomcat:8.5.27
74dbfe31c4a5f47f66c3f2b807d5944d7eefc711d2b576a82fa6485ac8079d69
[root@k8s-master ~]# docker volume ls
DRIVER VOLUME NAME
local frx#到宿主機目錄下查看,并新建文本文件
[root@k8s-master ~]# cd /var/lib/docker/volumes/frx/_data/
[root@k8s-master _data]# touch test1.txt
[root@k8s-master _data]# ls
docs examples host-manager manager ROOT test1.txt
#進入容器查看是否可讀,不允許寫
[root@k8s-master ~]# docker exec -it tomcat04 /bin/bash
root@74dbfe31c4a5:/usr/local/tomcat# cd webapps/
root@74dbfe31c4a5:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager test1.txt
root@74dbfe31c4a5:/usr/local/tomcat/webapps# touch test2.txt
touch: cannot touch 'test2.txt': Read-only file system
?數據卷操作命令
#數據卷查看
docker volume ls
#查看frx數據卷的具體信息
[root@k8s-master ~]# docker volume inspect frx#數據卷創建
docker volume create Myvolume#數據卷刪除
docker volume rm -f Myvolume