天津建站软件,网站恶意刷新,网站用图片做背景,计算机培训班学什么目录 前言docker数据持久化的2种方式数据卷 bind mount #xff0c;即-v参数匿名数据卷 docker manager volume-v参数和匿名卷的区别docker volume 命令的使用数据卷容器孤儿volume总结 前言
环境#xff1a;centos7.9 docker version 20.10.14 本篇我们来介绍docker的数据卷… 目录 前言docker数据持久化的2种方式数据卷 bind mount 即-v参数匿名数据卷 docker manager volume-v参数和匿名卷的区别docker volume 命令的使用数据卷容器孤儿volume总结 前言
环境centos7.9 docker version 20.10.14 本篇我们来介绍docker的数据卷数据卷是用于实现docker数据的持久化。
docker数据持久化的2种方式
使用docker过程中我们需要持久化容器中产生的数据以及容器与容器之间、容器与主机之前进行数据共享、备份等操作这里就需要到容器的数据持久化管理。 docker的数据持久化管理目前提供如下两种方式
1、数据卷 data volumes
2、数据卷容器 data volumes containers数据卷 bind mount 即-v参数
数据卷数据卷其实就是一个目录或文件类似linux下对目录或文件进行mount挂载操作即在宿主机和容器之间建立一个或多个目录文件亦可来相互映射文件其具有如下特点 1 数据卷可以在容器之间进行共享和重用即多个容器可以挂载同一个目录 2对数据卷的更改会立即生效即对宿主机目录下的文件的修改会立即反应到容器的挂载点目录文件 3对数据卷的更新不会影响到镜像 镜像只读 4卷会一直存在即使容器被删除即宿主机目录不会因为容器的删除而删除宿主机目录
注意 1删除容器的时候数据卷不会删除。如果要删除容器的时候同时删除数据卷需加上-v参数。比如: docker rm os456 -v /homedata 2默认数据卷挂载以后文件的权限为rw如需单独设置可以容器数据卷后边设置ro只读。
docker run -v参数语法
-v host_path:container_path[:rw/ro]
host_path是宿主机的目录或单个文件
container_path是容器的目录或单个文件
rw/ro 表示挂载后容器的数据读写权限rw表示读写ro表示数据只读不写默认就是rw读写权限演示示例
#使用数据卷挂载宿主机目录到容器中去
mkdir /root/nginx/html -p
docker run -d --name nginx -p 8081:80 -v /root/nginx/html:/usr/share/nginx/html nginx:latest#使用数据卷挂载但个文件到容器中去
docker run -d --name nginx -p 8081:80 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html nginx:latest
#综合案例
mkdir -p /root/nginx/html echo good /root/nginx/html/index.html
mkdir -p /root/nginx/logs -p
docker run -d --name nginx2 -p 8081:80 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html nginx:latestdocker inspect nginxMounts: [{Type: bind, #可以看到类型是bind所以没有产生volumeSource: /root/nginx/html,Destination: /usr/share/nginx/html,Mode: ,RW: true,Propagation: rprivate}],匿名数据卷 docker manager volume
使用-v参数时可以不指定host_path部分只需指定容器的挂载点即可如-v container_path container_path必须是一个容器目录不能是单个文件了数据权限不能设置均为读写权限。这时docker会自动创建一个匿名的数据卷这个匿名数据卷的名字是自动生成的一个很长串的字符。使用docker volume ls命令可以看到这个数据卷的名称我们称这种卷为匿名数据卷。
演示示例
使用-v挂载匿名卷docker会默认给我们在宿主机上找一个目录进行挂载
docker run -d --name nginx2 -p 8081:80 -v /usr/share/nginx/html -v /var/log/nginx nginx:latest#查看容器的详细信息就可以发现docker将我们的卷挂载到哪里了
[rootdocker ~]# docker inspect nginx2
Mounts: [{Type: volume, #类型是volumeName: 8d1d766c65d3b3cddafd20f25d,Source: /var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25d/_data, #上面一行可见docker将卷挂到了这里这个很长串的ID其实就是数据卷的名称Destination: /usr/share/nginx/html,Driver: local,Mode: ,RW: true,Propagation: },{Type: volume, #类型是volumeName: ef17aa81669f4ef7704182061164bce,Source: /var/lib/docker/volumes/ef17aa81669f4ef7704182061164bce/_data,Destination: /var/log/nginx,Driver: local,Mode: ,RW: true,Propagation: }],
[rootdocker ~]# ls -l /var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25d/_data/
total 8
-rw-r--r--. 1 root root 497 Dec 28 2021 50x.html
-rw-r--r--. 1 root root 615 Dec 28 2021 index.html
# 所以我们修改/var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25d/_data/下的index.html文件就能实现容器的nginx页面的变更-v参数和匿名卷的区别
不同点bind mountdocker manager volumevolume位置可挂载宿主机任意位置的目录或文件仅挂载宿主机固定位置的目录目录一般为/var/lib/docker/volumes/xxx/_data/对容器挂载点影响挂载后容器内的挂载点目录会被覆盖如果此时宿主机目录上没有文件那么容器的挂载点也没有文件使用匿名数据卷时如果volume是空的而container中的目录有内容那么docker会将container目录中的内容拷贝到volume中但是如果volume中已经有内容则会将container中的目录覆盖是否支持单文件支持挂载目录或单文件仅支持挂载目录权限控制权限默认rw可设置为ro只能默认rw移植性移植性弱与宿主机路径绑定移植性强无需指定宿主机目录
匿名数据卷 docker manager volume 使用-v参数时不指定host_path部分只需指定容器的挂载点即可如-v container_path 这是docker默认会创建目录如/var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25dcaf304a96b9c89d005d30226a7b815a6b5ecbf/_data/目录这个目录就是容器持久化数据的目录这一串很长的ID就是卷名docker自动帮我们生成的通过docker volume ls命令可以查看卷。
注意 使用数据卷 bind mount 即-v参数挂载后容器内的挂载点目录会被覆盖如果此时宿主机目录上没有文件那么容器的挂载点也没有文件 使用匿名数据卷时如果volume是空的而container中的目录有内容那么docker会将container目录中的内容拷贝到volume中但是如果volume中已经有内容则会将container中的目录覆盖。
docker volume 命令的使用
[rootdocker ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove all unused local volumesrm Remove one or more volumes#列出全部的volume
docker volume ls
#查看指定名字的volume的详细信息
docker volume inspect a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8
#移除全部未使用的本地volume
docker volume prune
#删除指定的volume
docker volume rm a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8示例
#创建一个数据卷名称叫做nginx
[rootdocker ~]# docker volume create nginx
nginx
[rootdocker ~]# docker volume ls | grep nginx
local nginx
[rootdocker ~]# docker volume inspect nginx
[{CreatedAt: 2023-08-27T14:40:4308:00,Driver: local,Labels: {},Mountpoint: /var/lib/docker/volumes/nginx/_data,Name: nginx,Options: {},Scope: local}
]#容器使用数据卷,-v参数时加上卷名即可
[rootdocker ~]# docker run -d --name nginx -p 8081:80 -v nginx:/usr/share/nginx/html nginx:latest
57022b423ec03bdb1a7a178544d422b262daa1b2861ba8a509a20962ed3051cf
[rootdocker ~]# docker inspect nginx Mounts: [{Type: volume,Name: nginx,Source: /var/lib/docker/volumes/nginx/_data,Destination: /usr/share/nginx/html,Driver: local,Mode: z,RW: true,Propagation: }
#可以看到nginx已经使用了nginx数据卷
#注意
#使用数据卷 bind mount -v参数不会产生volume如下
docker run -d --name nginx -p 8081:80 -v /root/nginx/html:/usr/share/nginx/html nginx:latest
docker inspect nginxMounts: [{Type: bind, #可以看到类型是bind所以没有产生volumeSource: /root/nginx/html,Destination: /usr/share/nginx/html,Mode: ,RW: true,Propagation: rprivate}],数据卷容器
所谓数据卷容器其实就是一个为其他容器提供volume的容器即包含数据的容器然后其他多个容器可以通过--volumes-from 数据卷容器名参数来挂载数据卷容器从而实现多个容器共享同一份数据。
1、不使用数据卷容器之前多个容器共享相同的数据只需使用-v参数挂载同一个宿主机目录即可如下实现
docker run -d --name nginx1 -p 8081:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx2 -p 8082:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx3 -p 8083:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
echo good /root/nginx/html/index.html
curl 127.0.0.1:8081
good
curl 127.0.0.1:8082
good
curl 127.0.0.1:8083
good#以上使用的是bind mount的形式挂载当然也可以手动创建一个volume如下
docker volume create nginx
docker volume inspect nginx
[{CreatedAt: 2023-08-27T14:40:4308:00,Driver: local,Labels: {},Mountpoint: /var/lib/docker/volumes/nginx/_data,Name: nginx,Options: {},Scope: local}
]echo good /var/lib/docker/volumes/nginx/_data/index.html
docker run -d --name nginx11 -p 8001:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx12 -p 8002:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx13 -p 8003:80 -v nginx:/usr/share/nginx/html nginx:latest
curl 127.0.0.1:8001
I am good
curl 127.0.0.1:8002
I am good
curl 127.0.0.1:8003
I am good#以上就说明多个容器共享了相同的数据
#注意不能使用匿名卷匿名卷会自动创建volume那么多个容器都各自创建自己的匿名卷这样做不到数据共享了2、使用数据卷容器之后多个容器共享相同的数据如下实现
#创建一个数据卷容器名称叫做nginx-data数据卷容器可以不用run其只是提供数据而已
echo I am good man /root/nginx/html/index.html
docker create --name nginx-data -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
#使用volume亦可docker create --name nginx-data -v nginx:/usr/share/nginx/html nginx:latest
#其他nginx容器共享数据卷容器数据
#nginx容器的挂载和数据卷容器的挂载是一样的
docker run -d --name nginx1 -p 8001:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx2 -p 8002:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx3 -p 8003:80 --volumes-from nginx-data nginx:latest
curl 127.0.0.1:8001
I am good man
curl 127.0.0.1:8002
I am good mancurl 127.0.0.1:8003
I am good man#删除数据卷容器
docker rm nginx-data
# nginx3 容器依然可以访问
curl 127.0.0.1:8003
I am good man
#查看nginx3 的挂载目录Mounts: [{Type: bind, #bind类型因为nginx-data数据卷容器就是使用bind类型Source: /root/nginx/html, #宿主机目录Destination: /usr/share/nginx/html,Mode: ,RW: true,Propagation: rprivate}],
#我们可以看到即使数据卷容器被删除了使用数据卷容器的其他nginx容器依然能正常持久化数据
#这说明其他nginx容器其实本质上还是挂载宿主机上的目录这其实和多个容器使用相同的-v /root/nginx/html/:/usr/share/nginx/html 没说
#明区别
#以上只演示了使用bind mount 类型的卷其实手动创建一个数据卷docker volume create nginx-data然后多个容器都使用该nginx-data数据
# 卷亦可以共享数据或者数据卷容器挂载的是nginx-data数据卷然后多个容器都使用该nginx-data数据卷也是可以的.孤儿volume
所谓孤儿volume是指没有被任何容器使用的volume。 删除volume 1、对于直接使用-v /root/nginx/html/:/usr/share/nginx/html指定宿主机目录挂载的当删除容器时宿主机上的目录并不会被删除这也是数据持久化的含义所以如果需要永久删除宿主机目录可以在确认数据不再需要后删除宿主机目录即可。 2、对于使用docker manager volume管理的如果是匿名卷在删除容器的时候加上-v可以直接删除容器和匿名卷docker rm命令如下
[rootdocker ~]# docker rm --help
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Remove one or more containers
Options:-f, --force Force the removal of a running container (uses SIGKILL)-l, --link Remove the specified link-v, --volumes Remove anonymous volumes associated with the container #-v参数删除分配给容器的匿名卷
#删除容器的同时删除容器的匿名卷
docker rm nginx1 -v -f3、对于不管是匿名卷还是有名卷都可以使用docker volume rm 命令删除卷。 4、孤儿volume是指没有被任何容器使用的volume。在确定volume不再使用后可以使用docker volume rm 命令删除卷。
总结
docker容器实现数据持久化一般有以下几种方式
1、-v参数以bind mount方式挂载宿主机目录或文件到容器
docker run -v参数语法
-v host_path:container_path[:rw/ro]
host_path是宿主机的目录或单个文件
container_path是容器的目录或单个文件
rw/ro 表示挂载后容器的数据读写权限rw表示读写ro表示数据只读不写默认就是rw读写权限示例
mkdir /root/nginx/html -p
docker run -d --name nginx1 -p 8081:80 -v /root/nginx/html:/usr/share/nginx/html nginx:latest
docker run -d --name nginx2 -p 8082:80 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html nginx:latest
docker inspect nginx1 Mounts: [{Type: bind, #类型是bindSource: /root/nginx/html,Destination: /usr/share/nginx/html,Mode: ,RW: true,Propagation: rprivate}],2、-v 不指定host_path部分时docker默认使用匿名卷docker manager volume
使用-v参数时可以不指定host_path部分只需指定容器的挂载点即可如-v container_pathcontainer_path必须是一个容器目录不
能是单个文件了数据权限不能设置均为读写权限。因为没写host_path部分这时docker会自动创建一个数据卷这个数据卷的名字是自动生成
的一个很长串的字符所以叫匿名卷。
docker run -d --name nginx -p 8082:80 -v /usr/share/nginx/html nginx:latest
docker inspect nginx
Mounts: [{Type: volume, #类型是volumeName: 58b3689c8256a8d33d9114c52b,Source: /var/lib/docker/volumes/58b3689c8256a8d33d9114c52b/_data,Destination: /usr/share/nginx/html,Driver: local,Mode: ,RW: true,Propagation: }],
[rootdocker ~]# docker volume list | grep 58b3689c8256a8d33d9114c52b
local 58b3689c8256a8d33d9114c52b
[rootdocker ~]# 3、使用创建好的数据卷
#docker volume命令用于管理数据卷
#创建一个数据卷名称叫做nginx
[rootdocker ~]# docker volume create nginx
nginx
[rootdocker ~]# docker volume ls | grep nginx
local nginx
[rootdocker ~]# docker volume inspect nginx
[{CreatedAt: 2023-08-27T14:40:4308:00,Driver: local,Labels: {},Mountpoint: /var/lib/docker/volumes/nginx/_data,Name: nginx,Options: {},Scope: local}
]
#创建一个容器并使用名称叫做nginx的volume卷使用-v参数时指定volume卷名即可
[rootdocker ~]# docker run -d --name nginx -p 8081:80 -v nginx:/usr/share/nginx/html nginx:latest
57022b423ec03bdb1a7a178544d422b262daa1b2861ba8a509a20962ed3051cf
[rootdocker ~]# docker inspect nginx Mounts: [{Type: volume, #类型是volumeName: nginx, #卷的名称Source: /var/lib/docker/volumes/nginx/_data,Destination: /usr/share/nginx/html,Driver: local,Mode: z,RW: true,Propagation: }
#列出全部的volume
docker volume ls
#查看指定名字的volume的详细信息
docker volume inspect a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8
#移除全部未使用的本地volume
docker volume prune
#删除指定的volume
docker volume rm a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf84、数据卷容器
1、不使用数据卷容器之前多个容器共享相同的数据只需使用-v参数挂载同一个宿主机目录即可如下实现
docker run -d --name nginx1 -p 8081:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx2 -p 8082:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx3 -p 8083:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
echo good /root/nginx/html/index.html
#以上使用的是bind mount的形式挂载当然也可以手动创建一个volume如下
docker volume create nginx
docker volume inspect nginx
[ {.......Mountpoint: /var/lib/docker/volumes/nginx/_data,Name: nginx,......}
]
echo good /var/lib/docker/volumes/nginx/_data/index.html
docker run -d --name nginx11 -p 8001:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx12 -p 8002:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx13 -p 8003:80 -v nginx:/usr/share/nginx/html nginx:latest#以上就说明多个容器共享了相同的数据
#注意不能使用匿名卷匿名卷会自动创建volume那么多个容器都各自创建自己的匿名卷这样做不到数据共享了2、使用数据卷容器之后多个容器共享相同的数据如下实现
#创建一个数据卷容器名称叫做nginx-data数据卷容器可以不用run其只是提供数据而已
echo I am good man /root/nginx/html/index.html
docker create --name nginx-data -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
#使用volume亦可docker create --name nginx-data -v nginx:/usr/share/nginx/html nginx:latest
#其他nginx容器共享数据卷容器数据,使用--volumes-from指定数据卷容器
#nginx容器的挂载和数据卷容器的挂载是一样的
docker run -d --name nginx1 -p 8001:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx2 -p 8002:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx3 -p 8003:80 --volumes-from nginx-data nginx:latest5、孤儿卷
所谓孤儿volume是指没有被任何容器使用的volume。
删除volume
1、对于直接使用-v /root/nginx/html/:/usr/share/nginx/html指定宿主机目录挂载的当删除容器时宿主机上的目录并不会被删除这也是
数据持久化的含义所以如果需要永久删除宿主机目录可以在确认数据不再需要后删除宿主机目录即可。
2、对于使用docker manager volume管理的如果是匿名卷在删除容器的时候加上-v可以直接删除容器和匿名卷docker rm命令如下
[rootdocker ~]# docker rm --help
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Remove one or more containers
Options:-f, --force Force the removal of a running container (uses SIGKILL)-l, --link Remove the specified link-v, --volumes Remove anonymous volumes associated with the container #-v参数删除分配给容器的匿名卷
#删除容器的同时删除容器的匿名卷
docker rm nginx1 -v -f
3、对于不管是匿名卷还是有名卷都可以使用docker volume rm 命令删除卷。
4、docker volume prune #移除全部未使用的本地volume