volumen de datos de Docker, persistencia de datos de Docker

prefacio

Entorno: centos7.9 docker version 20.10.14
en este artículo, presentaremos el volumen de datos de Docker, que se utiliza para lograr la persistencia de los datos de Docker.

2 formas de conservar datos en la ventana acoplable

En el proceso de uso de Docker, necesitamos conservar los datos generados en el contenedor, así como realizar operaciones de intercambio de datos, copias de seguridad y otras operaciones entre contenedores y entre contenedores y el host, aquí necesitamos la gestión de persistencia de datos del contenedor. La gestión de persistencia de datos de Docker actualmente proporciona los dos métodos siguientes:

1、数据卷 data volumes
2、数据卷容器 data volumes containers

Montaje de enlace de volumen de datos, es decir, el parámetro -v

Volumen de datos: un volumen de datos es en realidad un directorio o archivo, similar a la operación de montaje de un directorio o archivo en Linux, es decir, se establecen uno o más directorios (también se pueden usar archivos) entre el host y el contenedor. para asignar archivos entre sí. Tiene las siguientes características:
(1) Los volúmenes de datos se pueden compartir y reutilizar entre contenedores, es decir, varios contenedores pueden montar el mismo directorio
(2) Los cambios en el volumen de datos tendrán efecto inmediatamente, es decir es decir, los cambios en los archivos en el directorio del host Las modificaciones se reflejarán inmediatamente en el archivo del directorio del punto de montaje del contenedor
(3) Las actualizaciones del volumen de datos no afectarán la imagen (la imagen es de solo lectura)
(4) El volumen siempre existe, incluso si el contenedor se elimina, es decir, el directorio del host no cambiará debido a La eliminación del contenedor elimina el directorio del host

Nota:
(1) Cuando se elimina el contenedor, el volumen de datos no se eliminará. Si desea eliminar el volumen de datos al eliminar el contenedor, debe agregar el parámetro -v. Por ejemplo: docker rm os456 -v /homedata
(2) Los permisos de archivo predeterminados después de montar el volumen de datos son rw. Si necesita configurarlos por separado, puede configurarlos detrás del volumen de datos del contenedor ro只读:.

docker run -vSintaxis de parámetros:

-v <host_path>:<container_path>[:rw/ro]
<host_path>是宿主机的目录或单个文件
<container_path>是容器的目录或单个文件
rw/ro 表示挂载后容器的数据读写权限,rw表示读写,ro表示数据只读,不写默认就是rw读写权限

Ejemplo de demostración:

#使用数据卷挂载宿主机目录到容器中去
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:latest

docker inspect nginx
  "Mounts": [
            {
    
    
                "Type": "bind",		#可以看到类型是bind,所以没有产生volume
                "Source": "/root/nginx/html",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

Volumen de datos anónimos Volumen del administrador de Docker

Al usar -vparámetros, no necesita especificar <host_path>ninguna parte, solo necesita especificar el punto de montaje del contenedor, como por ejemplo: -v <container_path>, container_path debe ser un directorio del contenedor, no un solo archivo, y no se pueden establecer permisos de datos. todos los permisos de lectura y escritura. En este momento, Docker creará automáticamente un volumen de datos anónimos, cuyo nombre es una larga cadena de caracteres generada automáticamente. El nombre de este volumen de datos se puede ver usando docker volume lsel comando; llamamos a este volumen volumen de datos anónimo.

Ejemplo de demostración:

使用-v挂载匿名卷,docker会默认给我们在宿主机上找一个目录进行挂载
docker run -d --name nginx2 -p 8081:80 -v /usr/share/nginx/html -v /var/log/nginx  nginx:latest

#查看容器的详细信息就可以发现docker将我们的卷挂载到哪里了
[root@docker ~]# docker inspect  nginx2
"Mounts": [
            {
    
    
                "Type": "volume",	#类型是volume
                "Name": "8d1d766c65d3b3cddafd20f25d",
                "Source": "/var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25d/_data", 
                #上面一行,可见,docker将卷挂到了这里,这个很长串的ID其实就是数据卷的名称
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
    
    
                "Type": "volume", #类型是volume
                "Name": "ef17aa81669f4ef7704182061164bce",
                "Source": "/var/lib/docker/volumes/ef17aa81669f4ef7704182061164bce/_data",
                "Destination": "/var/log/nginx",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
[root@docker ~]# 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页面的变更

La diferencia entre el parámetro -v y los volúmenes anónimos

diferencia enlazar montaje volumen del administrador de Docker
posición de volumen Puede montar directorios o archivos en cualquier lugar del host. Monte el directorio solo en la ubicación fija del host, el directorio generalmente es /var/lib/docker/volumes/xxx/_data/
Impacto en los puntos de montaje del contenedor Después del montaje, se sobrescribirá el directorio del punto de montaje en el contenedor. Si no hay ningún archivo en el directorio del host en este momento, no habrá ningún archivo en el punto de montaje del contenedor. Cuando se utiliza un volumen de datos anónimo, si el volumen está vacío y el directorio del contenedor tiene contenido, Docker copiará el contenido del directorio del contenedor al volumen. Sin embargo, si ya hay contenido en el volumen, el directorio del contenedor será sobrescrito.
Ya sea para admitir un solo archivo Admite directorios de montaje o archivos individuales Solo admite directorios de montaje
control de permisos El permiso predeterminado es rw, que se puede configurar en ro Solo puede usar rw por defecto
Portabilidad Portabilidad débil, ligada a la ruta del host. Gran portabilidad, no es necesario especificar el directorio del host


Cuando utilice el parámetro -v del volumen de datos anónimo del administrador de Docker, no especifique <host_path>la parte, solo necesita especificar el punto de montaje del contenedor, como por ejemplo: -v <container_path>Este es el directorio que Docker creará de forma predeterminada, como /var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25dcaf304a96b9c89d005d30226a7b815a6b5ecbf/_data/el directorio . Este directorio es el directorio para los datos persistentes del contenedor. Esta cadena de ID muy larga es el nombre del volumen, que Docker genera automáticamente para nosotros y el volumen se puede ver mediante el comando docker volume ls.

Nota: Después de
usar 数据卷 bind mount ,即-v参数, se sobrescribirá el directorio del punto de montaje en el contenedor. Si no hay archivos en el directorio del host en este momento, entonces no habrá archivos en el punto de montaje del contenedor; cuando se utilizan
volúmenes de datos anónimos, si el volumen está vacío y si el directorio del contenedor tiene contenido, Docker copiará el contenido del directorio del contenedor al volumen. Sin embargo, si ya hay contenido en el volumen, el directorio del contenedor se sobrescribirá.

Uso del comando de volumen de Docker

[root@docker ~]#  docker volume --help
Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

#列出全部的volume
docker volume ls
#查看指定名字的volume的详细信息
docker volume inspect a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8
#移除全部未使用的本地volume
docker volume  prune
#删除指定的volume
docker volume  rm a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8

示例:
#创建一个数据卷,名称叫做nginx
[root@docker ~]# docker volume create nginx
nginx
[root@docker ~]# docker volume ls | grep nginx
local     nginx
[root@docker ~]# docker volume inspect  nginx
[
    {
    
    
        "CreatedAt": "2023-08-27T14:40:43+08:00",
        "Driver": "local",
        "Labels": {
    
    },
        "Mountpoint": "/var/lib/docker/volumes/nginx/_data",
        "Name": "nginx",
        "Options": {
    
    },
        "Scope": "local"
    }
]

#容器使用数据卷,-v参数时加上卷名即可
[root@docker ~]# docker run -d --name nginx -p 8081:80 -v nginx:/usr/share/nginx/html  nginx:latest
57022b423ec03bdb1a7a178544d422b262daa1b2861ba8a509a20962ed3051cf
[root@docker ~]# 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 nginx
  "Mounts": [
            {
    
    
                "Type": "bind",		#可以看到类型是bind,所以没有产生volume
                "Source": "/root/nginx/html",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

contenedor de volumen de datos

El llamado contenedor de volumen de datos es en realidad un contenedor que proporciona un volumen para otros contenedores, es decir, un contenedor que contiene datos, luego otros contenedores pueden --volumes-from 数据卷容器名montar el contenedor de volumen de datos a través de parámetros, de modo que varios contenedores puedan compartir los mismos datos.

1. Antes de usar contenedores de volumen de datos, varios contenedores comparten los mismos datos. Solo necesita usar el parámetro -v para montar el mismo directorio de host, de la siguiente manera:

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:43+08: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. Después de usar el contenedor de volumen de datos, varios contenedores comparten los mismos datos, de la siguiente manera:

#创建一个数据卷容器,名称叫做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 man
 curl  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数据卷也是可以的.

volumen huérfano

El llamado volumen huérfano se refiere a un volumen que no es utilizado por ningún contenedor.
Eliminar volumen:
1. Para aquellos -v /root/nginx/html/:/usr/share/nginx/htmlmontados directamente usando el directorio de host especificado, cuando se elimina el contenedor, el directorio en el host no se eliminará. Este también es el significado de persistencia de datos, por lo que si necesita eliminar permanentemente el directorio de host , puede simplemente eliminar el directorio del host después de confirmar que los datos ya no son necesarios.
2. Para aquellos administrados mediante el volumen de Docker Manager, si es un volumen anónimo, agregar -v al eliminar el contenedor puede eliminar directamente el contenedor y el volumen anónimo. El comando docker rm es el siguiente:

[root@docker ~]# 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. Ya sea un volumen anónimo o un volumen con nombre, puede usar docker volume rmel comando para eliminar el volumen.
4. Un volumen huérfano se refiere a un volumen que no es utilizado por ningún contenedor. Después de determinar que el volumen ya no está en uso, puede usar docker volume rmel comando para eliminarlo.

Resumir

Los contenedores Docker generalmente implementan la persistencia de datos de las siguientes maneras:

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",		#类型是bind
                "Source": "/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_path>,container_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",		#类型是volume
                "Name": "58b3689c8256a8d33d9114c52b",
                "Source": "/var/lib/docker/volumes/58b3689c8256a8d33d9114c52b/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
[root@docker ~]# docker volume list | grep   58b3689c8256a8d33d9114c52b
local     58b3689c8256a8d33d9114c52b
[root@docker ~]# 
3、使用创建好的数据卷
#docker volume命令用于管理数据卷
#创建一个数据卷,名称叫做nginx
[root@docker ~]# docker volume create nginx
nginx
[root@docker ~]# docker volume ls | grep nginx
local     nginx
[root@docker ~]# docker volume inspect  nginx
[
    {
    
    
        "CreatedAt": "2023-08-27T14:40:43+08:00",
        "Driver": "local",
        "Labels": {
    
    },
        "Mountpoint": "/var/lib/docker/volumes/nginx/_data",
        "Name": "nginx",
        "Options": {
    
    },
        "Scope": "local"
    }
]
#创建一个容器并使用名称叫做nginx的volume卷,使用-v参数时指定volume卷名即可
[root@docker ~]# docker run -d --name nginx -p 8081:80 -v nginx:/usr/share/nginx/html  nginx:latest
57022b423ec03bdb1a7a178544d422b262daa1b2861ba8a509a20962ed3051cf
[root@docker ~]# docker inspect nginx 
  "Mounts": [
            {
    
    
                "Type": "volume",		#类型是volume
                "Name": "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 a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8

4. Contenedor de volumen de datos

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:latest

5. Volumen huérfano

所谓孤儿volume是指没有被任何容器使用的volume。
删除volume:
1、对于直接使用`-v /root/nginx/html/:/usr/share/nginx/html`指定宿主机目录挂载的,当删除容器时,宿主机上的目录并不会被删除,这也是
数据持久化的含义,所以如果需要永久删除宿主机目录,可以在确认数据不再需要后删除宿主机目录即可。
2、对于使用docker manager volume管理的,如果是匿名卷,在删除容器的时候加上-v可以直接删除容器和匿名卷,docker rm命令如下:
[root@docker ~]# 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 

Supongo que te gusta

Origin blog.csdn.net/MssGuo/article/details/126526344
Recomendado
Clasificación