volume de dados do docker, persistência de dados do docker

Prefácio

Ambiente: centos7.9 docker version 20.10.14
Neste artigo apresentaremos o volume de dados do docker.O volume de dados é usado para obter a persistência dos dados do docker.

2 maneiras de persistir dados no docker

No processo de utilização do docker, precisamos persistir os dados gerados no container, bem como realizar compartilhamento de dados, backup e outras operações entre containers e entre containers e o host.Aqui precisamos do gerenciamento de persistência de dados do container. O gerenciamento de persistência de dados do Docker fornece atualmente os dois métodos a seguir:

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

Montagem de ligação do volume de dados, ou seja, o parâmetro -v

Volume de dados: Um volume de dados é na verdade um diretório ou arquivo, é semelhante à operação de montagem de um diretório ou arquivo no Linux, ou seja, um ou mais diretórios (arquivos também podem ser usados) são estabelecidos entre o host e o contêiner para mapear arquivos entre si. Possui as seguintes características:
(1) Os volumes de dados podem ser compartilhados e reutilizados entre contêineres, ou seja, vários contêineres podem montar o mesmo diretório
(2) As alterações no volume de dados terão efeito imediato, ou seja, isto é, as alterações nos arquivos no diretório host As modificações serão refletidas imediatamente no arquivo do diretório do ponto de montagem do contêiner
(3) As atualizações no volume de dados não afetarão a imagem (a imagem é somente leitura)
(4) O volume sempre existir, mesmo que o contêiner seja excluído, ou seja, o diretório host não será alterado devido a A exclusão do contêiner exclui o diretório host

Nota:
(1) Quando o contêiner for excluído, o volume de dados não será excluído. Se quiser excluir o volume de dados ao excluir o contêiner, você precisará adicionar o parâmetro -v. Por exemplo: docker rm os456 -v /homedata
(2) As permissões de arquivo padrão após a montagem do volume de dados são rw, se precisar defini-las separadamente, você pode defini-las atrás do volume de dados do contêiner: ro只读.

docker run -vSintaxe do parâmetro:

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

Exemplo de demonstração:

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

Volume de dados anônimos do docker manager

Ao usar -vparâmetros, você não precisa especificar <host_path>nenhuma parte. Você só precisa especificar o ponto de montagem do contêiner, como: -v <container_path>container_path deve ser um diretório do contêiner, não um único arquivo, e as permissões de dados não podem ser definidas. Elas são todas as permissões de leitura e gravação. Neste momento, o docker criará automaticamente um volume de dados anônimos. O nome desse volume de dados anônimos é uma longa sequência de caracteres gerada automaticamente. Você pode usar docker volume lso comando para ver o nome deste volume de dados. Chamamos esse volume de volume de dados anônimo.

Exemplo de demonstração:

使用-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页面的变更

A diferença entre o parâmetro -v e volumes anônimos

diferença montar montagem volume do gerenciador do docker
posição do volume Pode montar diretórios ou arquivos em qualquer lugar do host Monte o diretório apenas em um local fixo no host, que geralmente é /var/lib/docker/volumes/xxx/_data/
Impacto nos pontos de montagem do contêiner Após a montagem, o diretório do ponto de montagem no contêiner será sobrescrito. Se não houver arquivos no diretório host neste momento, não haverá arquivos no ponto de montagem do contêiner. Ao usar um volume de dados anônimo, se o volume estiver vazio e o diretório no contêiner tiver conteúdo, o docker copiará o conteúdo do diretório do contêiner para o volume. No entanto, se já houver conteúdo no volume, o diretório no contêiner será sobrescrito.
Se deve suportar arquivo único Suporta montagem de diretórios ou arquivos únicos Suporta apenas diretórios montados
controle de acesso A permissão padrão é rw, que pode ser definida como ro Somente rw padrão
Portabilidade Portabilidade fraca, vinculada ao caminho do host Forte portabilidade, sem necessidade de especificar o diretório host


Ao usar o parâmetro -v do volume de dados anônimos docker manager volume, não especifique <host_path>a parte.Você só precisa especificar o ponto de montagem do contêiner, como: -v <container_path>Este é o diretório que o docker criará por padrão, como /var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25dcaf304a96b9c89d005d30226a7b815a6b5ecbf/_data/diretório . Este diretório é o diretório para os dados persistentes do contêiner. Essa sequência de IDs muito longos é o nome do volume, que é gerado automaticamente pelo docker para nós, e o volume pode ser visualizado por meio do comando docker volume ls.

Nota: Depois de
usar 数据卷 bind mount ,即-v参数, o diretório do ponto de montagem no contêiner será substituído. Se não houver arquivos no diretório host neste momento, não haverá arquivos no ponto de montagem do contêiner; ao usar volumes de dados anônimos, se o
volume está vazio e se o diretório no contêiner tiver conteúdo, o docker copiará o conteúdo do diretório do contêiner para o volume. No entanto, se já houver conteúdo no volume, o diretório no contêiner será substituído.

Uso do comando docker volume

[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"
            }
        ],

contêiner de volume de dados

O chamado contêiner de volume de dados é na verdade um contêiner que fornece um volume para outros contêineres, ou seja, um contêiner que contém dados.Então, outros contêineres podem --volumes-from 数据卷容器名montar o contêiner de volume de dados por meio de parâmetros, para que vários contêineres possam compartilhar os mesmos dados.

1. Antes de usar contêineres de volume de dados, vários contêineres compartilham os mesmos dados. Você só precisa usar o parâmetro -v para montar o mesmo diretório host, como segue:

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. Depois de usar o contêiner de volume de dados, vários contêineres compartilham os mesmos dados, como segue:

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

volume órfão

O chamado volume órfão refere-se ao volume que não é utilizado por nenhum contêiner.
Excluir volume:
1. Para aqueles -v /root/nginx/html/:/usr/share/nginx/htmlmontados diretamente usando o diretório do host especificado, quando o contêiner for excluído, o diretório no host não será excluído. Este também é o significado da persistência de dados, portanto, se você precisar excluir permanentemente o diretório do host , você pode simplesmente excluir o diretório host após confirmar que os dados não são mais necessários.
2. Para aqueles gerenciados usando o volume do docker manager, se for um volume anônimo, adicionar -v ao excluir o contêiner pode excluir diretamente o contêiner e o volume anônimo. O comando docker rm é o seguinte:

[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. Quer seja um volume anônimo ou nomeado, você pode usar docker volume rmo comando para excluir o volume.
4. Um volume órfão refere-se a um volume que não é usado por nenhum contêiner. Depois de determinar que o volume não está mais em uso, você poderá usar docker volume rmo comando para excluir o volume.

Resumir

Os contêineres Docker geralmente implementam a persistência de dados das seguintes maneiras:

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. Contêiner de volume de dados

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. Volume Órfão

所谓孤儿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 

Acho que você gosta

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