您现在的位置是:首页 >技术教程 >八、Docker存储网站首页技术教程
八、Docker存储
Docker存储
默认情况下,Docker容器里产生的数据,如果不通过docker commit 生成新的镜像,使数据作为镜像的一部分保存下来,就会在容器删除后丢失。为了能够持久化保存和共享容器的数据,Docker 提出了两种管理容器内部以及容器之间管理数据方式:数据卷和(Volumes)和数据卷容器,下面分别说明。
数据卷
1、数据卷介绍
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UnionFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除
注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。
增加新数据卷
docker
2、创建一个数据卷
[root@k8s-m1 ~]# docker volume create test-vol
test-vol
3、查看所有的数据卷
[root@k8s-m1 ~]# docker volume ls
DRIVER VOLUME NAME
local test-vol
在主机上使用以下命令可以查看某个数据卷的详细信息
[root@k8s-m1 ~]# docker inspect test-vol
[
{
"CreatedAt": "2023-05-26T08:46:12+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
"Name": "test-vol",
"Options": {},
"Scope": "local"
}
]
4、启动一个挂载数据卷的容器
在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷。
下面创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /usr/share/nginx/html 目录。
[root@k8s-m1 ~]# docker run -d -P --rm --name web --mount source=test-vol,target=/usr/share/nginx/html nginx
#下面这条命令与上面的效果一样
[root@k8s-m1 ~]# docker run -d -P --rm --name web1 -v /var/lib/docker/volumes/test-vol/_data:/usr/share/nginx/html nginx
#下面这条docker会在/var/lib/docker/volumes/目录下自己创建一个本地目录挂载到容器内部
[root@k8s-m1 ~]# docker run -d -P --rm --name web1 -v /usr/share/nginx/html nginx
5、查看数据卷的具体信息
在主机里使用以下命令可以查看 web 容器的信息
[root@k8s-m1 ~]#
数据卷信息在 “Mounts” Key 下面
“Mounts”: [
{
“Type”: “volume”,
“Name”: “test-vol”,
“Source”: “/var/lib/docker/volumes/test-vol/_data”,
“Destination”: “/usr/share/nginx/html”,
“Driver”: “local”,
“Mode”: “z”,
“RW”: true,
“Propagation”: “”
}
],
6、删除数据卷
[root@k8s-m1 ~]# docker volume rm test-vol
test-vol
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在删除容器后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。所以如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
没有被挂载的数据卷可能会占据很多空间,如果需要清理请使用以下命令(慎用)
[root@k8s-m1 ~]#docker volume prune
数据卷容器
如果用户需要在容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器。数据券容器其实就是一个普通的容器,专门用它提供数据券供其他容器挂载使用。方法如下:
1、创建数据卷容器
docker run -idt -v /dbdata --name dbdata centos
2、其他容器使用
docker run -idt --volumes-from dbdata --name db1 centos
docker run -idt --volumes-from dbdata --name db2 centos
3、测试
容器db1和容器db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一个更新,其他容器都可以看到。如:
[root@k8s-m1 ~]# docker exec -it 36 /bin/bash
[root@3677058f3b62 /]# cd /dbdata/
[root@3677058f3b62 dbdata]# touch test
[root@3677058f3b62 dbdata]# exit
[root@k8s-m1 ~]# docker exec -it b6 /bin/bash
[root@b67a7a7db344 /]# ls /dbdata/
test
注意:使用–volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
4、利用数据卷备份迁移数据
#备份
[root@k8s-m1 ~]#docker run --volumes-from dbdata -v $(pwd):/backup --name databackup centos tar cvf /backup/backup.tar /dbdata
说明:首先利用centos镜像创建了一个容器databackup。使用–volumes-from dbdata参数来让databackup容器挂载dbdata容器的数据卷(即dbdata数据卷);使用-v $(pwd):/backup参数来挂载本地的当前目录到databackup容器的/backup目录。databackup容器启动后,使用tar cvf /backup/backup.tar /dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup. tar。(有点绕)
#恢复
如果要恢复数据到一个容器,可以按照下面的操作。首 先创建一个带有数据卷的容器dbdata2:
[root@k8s-m1 ~]#docker run -v /dbdata --name dbdata2 centos/bin/bash
然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所
挂载的容器卷中即可:
[root@k8s-m1 ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /backup