容器非持久化存储
每个Docker容器都有非持久化存储。
非持久化存储是创建容器时自动创建的,因此从属于容器,生命周期与容器相同,即删除容器也会删除全部非持久化数据。
默认情况下,非持久化存储是容器全部文件和文件系统保存的地方。
创建
使用 docker run -v 命令可以在创建容器时直接挂载一个数据卷。这个数据卷是临时性的,它随着容器的生命周期而存在,容器停止后会自动删除。
使用这种方法创建的数据卷与特定容器紧密绑定,只能由该容器使用,并且在容器停止后会自动删除。
这种方法适用于需要在容器生命周期内临时共享数据的情况。
docker run -it -v /HostVolume:/ContainerVolume mynginx
docker run -it -v /HostVolume:/ContainerVolume:ro mynginx # 容器对这个目录中的文件有只读权限
docker run -it -v /HostVolume:/ContainerVolume:ro --privileged=true mynginx
--privileged=true 让容器获得宿主机的root权限
数据卷的指定,冒号后边的容器路径要使用绝对路径
宿主机可以使用相对路径,路径为/var/lib/docker/volumes/指定的路径
如果 -v没有指定宿主机目录,默认路径为/var/lib/docker/volumes/docker随便起的名
如果指定的主机目录不存在,目录自动创建
非持久化存储的位置:
在Linux系统中,位于/var/lib/docker/<storage-driver>/
在Windows系统中,位于C:\ProgramData\Docker\windowsfilter\
容器的持久化存储
数据卷
数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
特点:
1.数据卷可以在容器之间共享或重用数据
2.对数据卷中的数据进行更改会立即生效
3.数据卷中的更改不会影响镜像
4.数据卷的生命周期一直持续到没有容器使用它为止,之后可以卸载它。被容器使用的数据卷无法删除
docker volume create:
使用 docker volume create 命令可以在 Docker 中独立地创建一个数据卷。这个数据卷可以在多个容器之间共享,并且可以手动管理其生命周期。
使用这种方法创建的数据卷是独立于容器的,它们可以在容器之间共享,甚至在容器停止或删除后仍然存在。
这种方法适用于需要持久性存储并且希望手动管理数据卷的情况。
基本语法格式
docker volume COMMAND
inspect 显示一个或多个卷的详细信息
ls 列出所有卷
create 创建卷
prune 删除所有未使用的本地卷
rm 删除一个或多个卷
查看数据卷
docker volume ls [OPTIONS]
-f, --filter filter 提供过滤值 (e.g. 'dangling=true')
-q, --quiet 只显示卷名
--format string 使用给定的Go模板格式化输出
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
-f, --format string 使用给定的Go模板格式化输出
创建数据卷
docker volume create [OPTIONS] [VOLUME]
-d, --driver string 指定卷驱动器名称 (default "local")
--label list 设置卷的元数据
默认情况下,Docker创建新卷时采用内置的local驱动。即本地卷只能被所在节点的容器使用。
使用-d参数可以指定不同的驱动。
普通数据卷在宿主机的/var/lib/docker/volumes/目录下。
删除数据卷
#删除一个或多个卷。不能删除容器正在使用的卷
docker volume rm [OPTIONS] VOLUME [VOLUME...]
-f, --force 强制移除一个或多个卷
#删除所有未使用的本地卷
docker volume prune [OPTIONS]
--filter filter 提供过滤值(e.g. 'label=<label>')
-f, --force 不提示确认
#删除容器卷并删除卷
docker rm mynginx -v
docker volume prune会删除未装入到某个容器或者服务的所有卷,所以谨慎使用!
docker volume rm允许删除指定卷。
两种删除命令都不能删除正在被容器或者服务使用的卷。
使用数据卷
docker container run --name 容器名 --mount type=volume,source=数据卷名,destination=容器路径 -d image[:tag] #普通数据卷
docker container run --name 容器名 --mount type=tmpfs,tmpfs-size=512M,destination=容器路径 -d image[:tag] #临时数据卷
docker container run --name 容器名 --mount type=bind,source=宿主机路径,destination=容器路径 -d image[:tag] #绑定数据卷
--mount选项支持三种类型的数据卷:
volume:普通数据卷,映射到主机var/lib/docker/volumes路径下。
如果指定了已经存在的卷,Docker会使用该卷。
如果指定的卷不存在,Docker会创建一个卷。
bind:绑定数据卷,映射到主机指定路径下。
宿主机目录的路径必须是绝对路径,使用前必须存在。
容器内路径可以为相对路径。如果不存在,Docker会自动创建。
tmpfs:临时数据卷,只存在于内存中。
可以在创建容器时将宿主机的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
使用dockerfile创建数据卷
1.新建文件夹用来放置Dockerfile
mkdir /mydocker
2.编写Dockerfile
vim /mydocker/Dockerfile
FROM nginx:latest
VOLUME ["/ContainerVolume1","/ContainerVolume2"] # 不指定主机路径,目录位于/var/lib/docker/volumes
3.build后生成镜像
docker build -f /mydocker/Dockerfile -t nginx:v2 . # .不能省略,表示当前路径,也就是说要指定Dockerfile文件的路径
-f 指定dockerfile文件
-t 这里是指定镜像的名称和标签
4.run启动容器
docker run -itd --name v1nginx nginx:v2
数据卷容器
1.用于容器间共享数据,本身就是个普通容器,专门用来提供数据卷供其他容器挂载使用
2.删除容器,数据卷不会被自动删除。
3.如果要删除数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v 命令来指定同时删除关联的容器
容器db1、db2挂载同一个数据卷到/dbdata目录,三个容器任何一个在该目录下写入,其他容器都可以看到
docker run -itd -v /dbdata --name volume1 busybox # 创建
docker run -itd --volumes-from volume1 --name web1 nginx # 其他容器挂载
docker run -itd --volumes-from volume1 --name web2 nginx # 其他容器挂载
--volumes-from 指定父容器
利用数据卷容器迁移数据
备份
# 创建要备份的容器test1,备份目录为/dbdata
docker run -itd -v /dbdata --name test1 ubuntu
docker run —rm --volumes-from test1 \
-v $(pwd):/backup ubuntu \
tar cvf /backup/backup.tar /dbdata
利用ubuntu镜像创建备份用容器,备份完成后自动删除
挂载数据卷至/dbdata
挂载主机当前路径到容器的/backup目录
容器启动后将/dbdata目录打包至/backup/backup.tar
恢复
# 创建接收备份数据的容器test2,恢复目录为/dbdata2
docker run -itd -v /dbdata2 --name test2 ubuntu
docker run —-rm --volumes-from test2 \
-v ${pwd}:/backup ubuntu \
tar xvf /backup/backup.tar -C /dbdata2
卷插件-Convoy
单节点卷管理插件,提供创建、删除、备份和还原数据卷的功能
安装
tar zxf convoy.tar.gz
cp convoy/{convoy,convoy-pdata_tools} /usr/local/bin
mkdir -p /etc/docker/plugins/
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
运行
convoy daemon --drivers vfs --driver-opts vfs.path=/data
# convoy支持多种存储驱动,这里选择VFS,并设置路径为/data
使用
dokcer run -it -v volTest:/test --volume-driver=convoy busybox /bin/sh
# volTest为卷名,挂载到容器/test路径
convoy的plugin handler模块会监听一个端口,与docker通信,并响应docker的卷插件REST API。插件在接到API请求后,会通过Volume-Mgr模块将一个远程或本地的存储挂载到服务器端,并将挂载路径发送给Docker,Docker把卷插件返回的路径挂载到容器中。挂载的只是数据卷,卷中的数据还是存储在远程或本地
插件发现
docker通过json文件、套接字文件或*.spec文件来查询插件的地址
查找顺序
/run/docker/plugins/下的套接字
/etc/docker/plugins
/usr/lib/docker/plugins
标签:容器,run,删除,--,Docker03,docker,数据
From: https://www.cnblogs.com/lixunblogs/p/18167359