什麼是數據卷(Data Volume)
數據卷是經過特殊設計的目錄,可以繞過聯合文件 UFS,爲一個或者多個容器提供訪問。
其設計目的在於數據的永久化,數據卷是存在於宿主機中的文件或者目錄,因此它與Docker容器的生命週期是完全分離的,Docker不會在容器刪除時刪除其掛載的數據卷,也不會存在類似的垃圾收集機制,對容器引用的數據捲進行處理。
數據卷的特點:
- 數據卷在容器啓動時初始化,如果容器使用的鏡像再掛載點包含了數據,這些數據會拷貝到新初始化的數據卷中。
- 數據卷可以在容器之間共享和重用
- 可以對數據卷裏的內容直接進行修改
- 數據卷的變化,不會影響鏡像的更新
- 卷會一直存在,即使掛載數據卷的容器已經被刪除
數據卷的架構:
數據卷的使用
在容器啓動時,爲容器添加數據卷需要用到 docker run 命令的 -v 選項:
docker run -v <宿主機文件或目錄>:<對應的容器目錄>[:ro ] [image]
操作示例:
# 查看宿主機中 /usr/local/src/dockerfiles/ 文件夾下的內容
[root@localhost ~]# ls /usr/local/src/dockerfiles/
dockerfile01 nginx-1.16.1.tar.gz
# 將 /usr/local/src/dockerfiles/ 作爲數據卷掛載到 容器的 /usr/local/src/volume 下
[root@localhost ~]# docker run -it -v /usr/local/src/dockerfiles/:/usr/local/src/volume --name nginx_server5 centos_nginx:1.0 /bin/bash
# 若報錯:ls: cannot access /usr/local/src/volume/dockerfile01: Permission denied
# 使用如下命令:增加 --privileged=true 選項
[root@localhost ~]# docker run -it -v /usr/local/src/dockerfiles/:/usr/local/src/volume --privileged true --name nginx_server5 centos_nginx:1.0 /bin/bash
# 查看數據卷的內容
[root@427a4e5b4089 /]# ls /usr/local/src/volume/
dockerfile01 nginx-1.16.1.tar.gz
數據卷容器
命名的容器掛載數據卷,其它容器通過掛載這個容器實現數據共享,掛載數據卷的容器,就叫做數據卷容器。
使用Dockerfile 的 VOLUME 指令可以構建一個包含數據卷的鏡像,例如:
# 註釋:包含數據卷的Centos鏡像
FROM centos:7.6.1810
# 標明作者的名字和聯繫方式
MAINTAINER pengjunlee [email protected]
VOLUME ["/usr/local/volume"]
CMD /bin/bash
使用上面的 Dockerfile 構建鏡像:
[root@localhost dockerfiles]# docker build -t centos_volume:1.0 -f ./dockerfile02 .
[root@localhost dockerfiles]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_volume 1.0 ee4ccab4731b 26 minutes ago 202 MB
啓動一個數據卷容器,將其命名爲 volume1:
[root@localhost dockerfiles]# docker run -it --name volume1 centos_volume:1.0
# 查看數據卷目錄是否存在
[root@e12534f3d46b /]# ls /usr/local/
bin etc games include lib lib64 libexec sbin share src volume
使用數據卷容器
使用數據卷容器共享數據的架構:
通過 docker run 命令的 --volumes-from 選項來指定容器要掛載的數據卷容器。
[root@localhost dockerfiles]# docker run -it --name centos1 --volumes-from volume1 centos /bin/bash
[root@9ac6ea27725c /]# ls /usr/local/
bin etc games include lib lib64 libexec sbin share src volume
數據卷的備份和還原
數據卷的備份和還原本質上就是系統文件的備份和還原。
例如,在容器啓動時對數據卷的內容做備份:
[root@localhost dockerfiles]# docker run --volumes-from volume1 -v ~/backup:/backup --privileged=true centos tar cvf backup/volume.tar usr/local/volume
usr/local/volume/
還原數據:
[root@localhost dockerfiles]# docker run --volumes-from volume1 -v ~/backup:/backup --privileged=true centos tar xvf backup/volume.tar usr/local/volume
usr/local/volume/