运维docker07-docker数据管理
1、持久化和非持久化
- docker数据主要分为两类:持久化的与非持久化的。
1、容器非持久化存储
- 每个Docker容器都有非持久化存储。
- 非持久化存储是创建容器时自动创建的,因此从属于容器,生命周期与容器相同,即删除容器也会删除全部非持久化数据。
- 默认情况下,非持久化存储是容器全部文件和文件系统保存的地方。
- 非持久化存储的位置:
- 在Linux系统中,位于/var/lib/docker/<storage-driver>/。
- 在Windows系统中,位于C\ProgramData\Docker\windowsfilter\。
示例:
1 2 3 4 5 6 7 8 | ] # docker container run --name web1 -d nginx:latest ] # docker container exec -it web1 bash root@6d70626c1af2:/ # touch /tmp/hh.txt ] # docker container inspect -f {{".GraphDriver.Data.UpperDir"}} web1 #查看容器在本地的非持久化存储 /var/lib/docker/overlay2/d95da2578a36387a3eddb0f42a78f547fe471505352e0c37165527482b3208ec/diff ] # ls /var/lib/docker/overlay2/d95da2578a36387a3eddb0f42a78f547fe471505352e0c37165527482b3208ec/diff/tmp/ hh.txt |
2、容器持久化存储
- 在生产环境中使用Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
- 如果希望持久化容器数据,则需要将数据存储在卷上。卷与容器是解耦的,从而可以独立地创建并管理卷,并且卷并未与任意容器生命周期绑定。最终效果即用户可以删除一个关联了卷的容器,但是卷并不会被删除。
- 容器数据的持久化有两种方式:
- 数据卷(Data Volumes):容器内数据直接映射到本地主机。
- 数据卷容器(Data Volume Containers): 使用特定容器维护数据卷。
2、管理普通数据卷
- 数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
- 数据卷的特性:
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便。
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。
- 对数据卷的更新不会影响镜像,解耦应用和数据。
- 卷会一直存在,直到没有容器使用,可以安全地卸载它,即被容器使用的数据卷无法删除。
- 基本语法格式如下:
1 2 3 4 5 6 | docker volume COMMAND inspect 显示一个或多个卷的详细信息 ls 列出所有卷 create 创建卷 prune 删除所有未使用的本地卷 rm 删除一个或多个卷 |
1、查看数据卷
- 基本语法格式如下:
1 2 3 4 5 6 | 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模板格式化输出 |
2、创建数据卷
- 基本语法格式如下:
1 2 3 4 | docker volume create [OPTIONS] [VOLUME] -d, --driver string 指定卷驱动器名称 (default "local" ) --label list 设置卷的元数据 -o, --opt map 设置驱动程序特定选项(default map[]) |
- 默认情况下,Docker创建新卷时采用内置的local驱动。恰如其名,本地卷只能被所在节点的容器使用。使用-d参数可以指定不同的驱动。
- 普通数据卷在宿主机的/var/lib/docker/volumes/目录下。
- 第三方驱动可以通过插件方式接入。这些驱动提供了高级存储特性,并为Docker集成了外部存储系统。驱动集成了外部存储系统到Docker环境当中,同时能使用其高级特性。
- 块存储:相对性能更高,适用于对小块数据的随机访问负载。目前支持Docker卷插件的块存储例子包括HPE 3PAR、Amazon EBS以及OpenStack块存储服务(Cinder)。
- 文件存储:包括NFS和SMB协议的系统,同样在高性能场景下表现优异。支持Docker卷插件的文件存储系统包括NetApp FAS,Azure文件存储以及Amazon EFS。
- 对象存储:适用于较大且长期存储的、很少变更的二进制数据存储。通常对象存储是根据内容寻址,并且性能较低。支持Docker卷驱动的例子包括Amazon S3、Ceph以及Minio。
- 下图展示的就是外部存储系统被用作卷存储。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ] # docker volume create test #等价于docker volume create -d local test ] # docker volume ls DRIVER VOLUME NAME local test ] # docker volume inspect test [ { "CreatedAt" : "2021-09-15T17:34:58+08:00" , "Driver" : "local" , #Driver和Scope都是local。这意味着卷使用默认local驱动创建,只能用于当前Docker主机上的容器 "Labels" : {}, "Mountpoint" : "/var/lib/docker/volumes/test/_data" , #Mountpoint属性说明卷位于Docker主机上的位置。 "Name" : "test" , "Options" : {}, "Scope" : "local" } ] |
3、删除数据卷
- 基本语法格式如下:
1 2 3 4 5 | docker volume rm [OPTIONS] VOLUME [VOLUME...] #删除一个或多个卷。不能删除容器正在使用的卷。 -f, --force 强制移除一个或多个卷 docker volume prune [OPTIONS] #删除所有未使用的本地卷 --filter filter 提供过滤值(e.g. 'label=<label>' ) -f, --force 不提示确认 |
- docker volume prune会删除未装入到某个容器或者服务的所有卷,所以谨慎使用!
- docker volume rm允许删除指定卷。
- 两种删除命令都不能删除正在被容器或者服务使用的卷。
示例:
1 2 | ] # docker volume rm test1 test2 ] # docker volume prune -f |
3、使用数据卷
- 基本语法格式如下:
1 2 3 4 5 6 7 8 | 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] #绑定数据卷 Common Options: src, source : 绑定宿主机目录或挂载数据卷 dst, destination, target: 挂载目标,即容器中的目录。 ro, readonly :只读(默认读写)。 |
- --mount选项支持三种类型的数据卷:
- volume:普通数据卷,映射到主机var/lib/docker/volumes路径下。
- 如果指定了已经存在的卷,Docker会使用该卷。
- 如果指定的卷不存在,Docker会创建一个卷。
- bind:绑定数据卷,映射到主机指定路径下。
- 宿主机目录的路径必须是绝对路径,使用前必须存在。
- 容器内路径可以为相对路径。如果不存在,Docker会自动创建。
- tmpfs:临时数据卷,只存在于内存中。
- volume:普通数据卷,映射到主机var/lib/docker/volumes路径下。
- 可以在创建容器时将宿主机的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
示例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ] # docker container run --name web1 --mount source=test1,target=/tmp -d nginx:latest #创建一个容器,并使用数据卷 ] # docker container exec -it web1 /bin/bash #进入容器,并创建文件 / # ls /tmp/ / # echo '210917-1119' > /tmp/hello.txt / # ls /tmp/ hello.txt ] # cat /var/lib/docker/volumes/test1/_data/hello.txt #在容器外查看在容器中创建的文件 210917-1119 ] # docker volume rm -f test1 #被容器使用的数据卷不能被删除 Error response from daemon: remove test1: volume is in use - [7e7ef3b13be7e763728acd6042837f6e8b95899c980f465252c1a7a47f7c1f1f] ] # docker container rm -f web1 ] # ls /var/lib/docker/volumes/test1/_data #删除容器后,数据卷依然存在 hello.txt ] # docker volume rm test1 #删除数据卷 test1 ] # ls /var/lib/docker/volumes/test1/_data ls : 无法访问 /var/lib/docker/volumes/test1/_data : 没有那个文件或目录 |
示例2:
1 2 3 4 5 6 7 8 | ] # mkdir /test2 ] # docker container run --name web2 --mount type=bind,source=/test2,target=/tmp -d nginx:latest ] # docker container exec -it web2 bash / # echo '210917-1245' > /tmp/hh.txt ] # cat /test2/hh.txt 210917-1245 |
4、数据卷容器
1、使用数据卷容器
- 如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
- 数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
- 可以多次使用--volumes-from参数来从多个容器挂载多个数据卷
- 使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 | ] # docker container create --name volume1 --mount type=bind,src=/data1/,dst=/data1 busybox:latest #创建一个数据卷容器 ] # docker container run --name web1 --volumes-from volume1 -d nginx:latest #创建容器web1,并使用数据卷容器 ] # docker container run --name web2 --volumes-from volume1 -d nginx:latest #创建容器web2,并使用数据卷容器 ] # docker container exec -it web1 bash #进入容器web1,并创建文件 / # echo '210917-1431' > /data1/hh.txt ] # docker container exec -it web2 bash #进入容器web2,并查看在web1中创建的文件 / # cat /data1/hh.txt 210917-1431 ] # cat /data1/hh.txt #在宿主机查看在web1中创建的文件 210917-1431 |
2、利用数据卷容器来迁移数据
1 2 3 4 5 | ] # docker container run --volumes-from volume1 --mount type=bind,src=$(pwd),dst=/backup --name worker busybox:latest tar cvf /backup/backup.tar /data1/ ] # tar vft backup.tar drwxr-xr-x root /root 0 2021-09-17 14:33 data1/ -rw-r--r-- root /root 12 2021-09-17 14:33 data1 /hh .txt |
- 首先利用busybox:latest镜像创建了一个容器worker。
- 使用--volumes-from volume1参数来让worker容器挂载volume1容器的数据卷(即/data1数据卷);
- 使用--mount type=bind,src=$(pwd),dst=/backup参数来挂载本地的当前目录到worker容器的/backup目录。
- worker容器启动后,使用tar cvf /backup/backup.tar /data1/命令将/data1/下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器