文章目录
- 一、基本了解
- 二、存储卷
- 2.1 docker挂载卷
- 2.2 绑定挂载卷
- 2.3 设置容器挂在卷权限
- 三、数据卷容器
- 四、数据卷容器迁移数据
一、基本了解
为什么会有存储卷?
- Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。
- 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中该文件的副本所隐藏,这就是“写时复制(COW)”机制。
- 对于这种方式来说,我们去访问一个文件,修改和删除等一类的操作,其效率会非常的低,因为隔着很多层镜像。而要想绕过这种限制,我们可以通过使用存储卷的机制来实现。
存储卷概念:
- 存储卷就是将宿主机的本地目录文件,与容器内的某一目录建立绑定关系。
- 当在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。
- 在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。
存储卷优缺点:
- 关闭并重启容器,其数据不受影响,但删除Docker容器,则其更改将会全部丢失。
- 存储于联合挂载文件系统中,不易于宿主机访问。
- 容器间数据共享不便。
- 删除容器其数据会丢失。
存储卷分类:
- docker容器挂载卷。docker默认把容器的/目录挂载到本地/var/lib/docker/overlay2/[some volume id]/diff目录下。当容器删除后,本地的挂载目录数据也会被删除。
- 绑定挂载卷。自定义容器挂载目录,不能时容器的/目录,必须是容器/目录下的目录,比如/data目录。自定义本地挂载点。当容器删除后,本地挂载点数据不会被删除。
2种容器数据管理方式:
- 存储卷(Data Volumes)
- 数据卷容器(Data Volumes Containers)
1.测试docker容器挂在卷。当容器停止运行时,本地数据存在;当容器删除时,本地数据消失。
2.测试绑定挂在卷。当容器删除后,本地数据依然存在。
二、存储卷
2.1 docker挂载卷
- 缺点:容器删除后,本地数据随之消失。
- 语法:docker run -it --name CONTAINER_NAME -v VOLUMEDIR IMAGE_NAME
1.不指定容器挂载点,默认将容器的/目录挂载到本地/var/lib/docker/overlay2/…/diff目录。容器删除,本地数据消失。
docker container run -it --rm busybox /bin/sh
2.指定容器挂载点,将容器的/data目录挂载到本地/var/lib/docker/volumes/…/_data目录。容器删除,本地数据消失。
2.2 绑定挂载卷
- 优点:容器删除,本地数据依然存在。
- 语法:docker run -it --name CONTAINER_NAME -v HOSTDIR:VOLUMEDIR IMAGE_NAME
1.将容器内的/data目录挂载到本地/data目录。容器删除,本地数据依然存在。
2.创建一个nginx容器,将nginx网页目录映射到本地,在本地生成网页文件。
docker container run -d -p 80:80 -v /data/html/nginx:/usr/share/nginx/html nginx
2.3 设置容器挂在卷权限
- docker挂载数据卷的默认权限是读写(rw),但一般设置为只读(ro),不让用户在容器内做修改,只能修改本地挂载出来的文件。
1.创建一个nginx容器,将容器内的/data目录映射到本地的/opt/qingjun目录,容器内的目录文件只能读不能写,本地可读可写。
docker run -d --name web -v /opt/qingjun:/data:ro nginx
三、数据卷容器
- 当2个容器之间需要共享持续更新的数据时,可以使用数据卷容器。
- 单独起一个容器作为数据卷容器,专门存放数据,其他两个容器挂载这个容器即可。
1.测试挂在卷容器效果。
//创建数据卷容器db,/dbdata目录为其他容器需要挂载的目录。
docker run -itd -v /dbdata --name db centos /bin/bash
//创建业务容器,指定数据来源,挂载db容器。
docker run -itd --volumes-from db --name qingjun1 centos /bin/bash
docker run -itd --volumes-from db --name qingjun2 centos /bin/bash
//进入第一个业务容器写入数据。
docker exec -it qingjun1 /bin/bash
[root@87b8f5d5f5ce /]# cd dbdata/
[root@87b8f5d5f5ce dbdata]# echo '111' > baimu.txt
//进入第二个业务容器查看数据。
docker exec -it qingjun2 /bin/bash
[root@2c4657f3b70c /]# cd dbdata/
[root@2c4657f3b70c dbdata]# cat baimu.txt
111
四、数据卷容器迁移数据
- 可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。
1.备份数据。
//此时有数据卷容器db,/dbdata目录下有其他业务容器需要数据文件baimu.txt。
docker run -itd -v /dbdata --name db centos /bin/bash
//业务容器qingjun1的数据来自db容器。
docker run -itd --name qingjun1 --volumes-from db centos /bin/bash
//创建备份容器。指定备份数据来源db容器,所以bck容器有数据卷容器目录/dbtada
//bck备份容器里的/dbdata数据进行压缩打包存放到/bck下,并将/bck目录映射到本地当前目录。
//本地生成备份数据压缩包。
docker run -it --name bck -v $(pwd):/bck --volumes-from db centos tar -zcf /bck/test.tar.gz /dbdata
2.恢复数据。
//指定要把数据恢复到哪个容器里,该容器需要提前创建要存放恢复数据的目录。
docker run -it --name backup -v /www centos /bin/bash
//将本地当前目录的备份数据挂载到backup容器中的/data目录,并解压挂载卷容器backup中数据压缩包到/www目录。
docker run -it --volumes-from backup -v $(pwd):/data centos tar xf /data/test.tar.gz -C /www