Docker vai da compreensão da prática aos princípios subjacentes (7) | Volume de armazenamento do Docker

Insira a descrição da imagem aqui

Prefácio

Então o blogueiro aqui tem algumas colunas cheias de informações úteis!

O primeiro é um resumo dos blogs de alta qualidade do blogueiro. Os blogs nesta coluna são todos escritos pelo blogueiro com muito cuidado. Eles estão cheios de informações úteis. Espero que seja útil para todos.

Depois, há a coluna na qual o blogueiro passou mais tempo recentemente, "Docker da realização à prática e aos princípios subjacentes".Espero que todos prestem mais atenção a ela!


Capítulo 7 – Volume de armazenamento do Docker

1. Introdução do volume Docker

Referência: Classe de Emprego Bit

1.1 O que é um volume de armazenamento?

Um volume de armazenamento estabelece diretamente um relacionamento de ligação entre um diretório que existe no sistema de arquivos local do host e um diretório no sistema de arquivos dentro do contêiner. Isso significa que quando gravamos dados neste diretório no contêiner, o contêiner gravará seu conteúdo diretamente no diretório do host que está vinculado ao contêiner. O diretório no host vinculado ao contêiner é chamado de volume de armazenamento. A essência de um volume é um arquivo ou diretório. Ele pode ignorar o sistema de arquivos conjunto padrão e existir diretamente no host na forma de um arquivo ou diretório.

O diretório /data/web do host está vinculado ao diretório /container/data/web no contêiner. Quando o processo no contêiner grava dados nesse diretório, eles são gravados diretamente no diretório do host, ignorando o contêiner. o sistema de arquivos estabelece uma associação com o sistema de arquivos do host, de modo que o conteúdo do banco de dados pode ser compartilhado entre o host e o contêiner, permitindo que o contêiner acesse diretamente o conteúdo no host, e o host também pode gravar conteúdo no contêiner, e os dados do contêiner e do host A leitura e a gravação são síncronas.

1.2 Por que são necessários volumes de armazenamento

1.2.1 Problema de perda de dados

Os contêineres geralmente podem ser divididos em duas categorias de acordo com o tipo de negócio:

  • Sem estado (os dados não precisam ser persistidos)

  • Stateful (os dados precisam ser persistidos)

Obviamente, os contêineres são melhores em aplicações sem estado. Como o ciclo de vida do diretório raiz do contêiner sem dados persistentes é o mesmo que o ciclo de vida do contêiner, a essência do sistema de arquivos do contêiner é uma camada de leitura e gravação criada sobre a camada espelhada. As modificações em quaisquer arquivos pelo O contêiner em execução existe nesta camada de leitura e gravação. Quando o contêiner é excluído, a camada de leitura e gravação no contêiner também desaparece. Embora o contêiner espere que todas as empresas permaneçam sem estado tanto quanto possível para que o contêiner possa ser usado imediatamente e possa ser agendado arbitrariamente, as empresas reais sempre têm vários cenários que exigem persistência de dados, como empresas com estado como MySQL e Kafka. . Portanto, para atender às necessidades dos negócios com estado, Docker propôs o conceito de volume.

1.2.2 Problemas de desempenho

UnionFS é geralmente muito ineficiente para modificação, exclusão, etc. Se for um aplicativo com requisitos de E/S relativamente altos, como redis, ao implementar armazenamento persistente, os requisitos de desempenho para o armazenamento subjacente são relativamente altos.

1.2.3 É inconveniente para o host e o contêiner acessarem um ao outro

O host acessa o contêiner, ou o acesso ao contêiner deve ser docker cpconcluído por meio

1.2.4 Contêineres e compartilhamento de contêineres são inconvenientes

2. Classificação do volume de armazenamento

Atualmente, o Docker oferece três maneiras de montar dados do host para o contêiner.

  • A janela de encaixe de volume gerencia volumes, que são mapeados para o diretório do host /var/lib/docker/volumes(nós mudamos) por padrão.Você só precisa especificar o ponto de montagem do contêiner no contêiner, e o diretório sob o host vinculado é determinado pelo próprio daemon do mecanismo de contêiner . Crie um diretório vazio ou use um diretório existente para estabelecer um relacionamento de armazenamento com o volume de armazenamento. Este método alivia muito o relacionamento de acoplamento do usuário ao usar o volume. A desvantagem é que o usuário não pode especificar quais diretórios usar e o armazenamento temporário é mais adequado;

  • A montagem de ligação vincula o volume de dados e o mapeia para o caminho especificado no host. O caminho no host deve ser especificado manualmente como um caminho específico. No contêiner, um caminho específico também deve ser especificado. Dois caminhos conhecidos estão associados.

  • O volume de dados temporários de montagem tmpfs é mapeado para a memória do host . Assim que o contêiner parar de funcionar, as montagens tmpfs serão removidas e os dados serão perdidos. Ele é usado para armazenamento de dados temporários de alto desempenho.

3. Gerenciar volume

3.1 Lista de comandos de volume

Ordem Função
docker volume create Criar volume de armazenamento
docker volume inspect Mostrar detalhes do volume de armazenamento
docker volume ls Listar volumes de armazenamento
docker volume prune Limpe todos os volumes de dados inúteis
docker volume rm A exclusão de volumes e volumes em uso não pode ser excluída.

3.2 criação de volume do docker

parâmetro chave

-d, --driver :指定驱动,默认是 local
--label :指定元数据

Insira a descrição da imagem aqui

Só não forneça nenhum parâmetro, é apenas um nome aleatório dado pelo sistema.

Claro, também podemos verificar em qual diretório ele está montado na máquina host.

[root@ALiCentos7:~]$ docker volume inspect fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
[
    {
    
    
        "CreatedAt": "2023-09-19T18:54:13+08:00",
        "Driver": "local",
        "Labels": {
    
    
            "com.docker.volume.anonymous": ""
        },
        "Mountpoint": "/data/var/lib/docker/volumes/fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306/_data",
        "Name": "fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306",
        "Options": null,
        "Scope": "local"
    }
]
[root@ALiCentos7:~]$

Crie um com um nome.

[root@ALiCentos7:~]$ docker volume create myboltest1
myboltest1
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
local     myboltest1
[root@ALiCentos7:~]$ 

3.3 inspeção do volume do docker

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

parâmetro

-f:指定相应个格式, 如json

3.4 volume da janela de encaixe ls

parâmetro.

--format:指定相应个格式,如 json,table
--filter,-f: 过滤
-q: 仅显示名称

Insira a descrição da imagem aqui

3,5 volume da janela de encaixe rm

parâmetro.

-f, --force : 强制删除

3.6 redução de volume do docker

Limpe volumes locais não utilizados.

parâmetro.

--filter : 过滤
-f, --force : 不提示是否删除
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
local     myboltest1
[root@ALiCentos7:~]$ docker volume prune 
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306

Total reclaimed space: 0B
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     myboltest1
[root@ALiCentos7:~]$

3.7 Método de criação de volume de gerenciamento 2 -vparâmetros e --mountparâmetros

Tanto -v quanto -mount podem completar a criação de volumes de gerenciamento

3.7.1 -vParâmetros

Função: Mapeamento completo de diretório

docker run -v name:directory[:options] ...

parâmetro

第一个参数:卷名称
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

Prática.

docker run -d  --name myvolnginx1 -v volnginx1:/usr/share/nginx/html/ nginx:1.21.4

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Agora vamos entrar neste contêiner e tentar deletar essa coisa para ver como é o fenômeno.

Insira a descrição da imagem aqui

E se você trouxer -roopções? (somente leitura)

Insira a descrição da imagem aqui

[root@ALiCentos7:~]$ docker exec -it myvolnginx1 bash
root@838d01664db5:/# cd /usr/share/nginx/html/
root@838d01664db5:/usr/share/nginx/html# ls
50x.html
root@838d01664db5:/usr/share/nginx/html# rm 50x.html 
rm: cannot remove '50x.html': Read-only file system
root@838d01664db5:/usr/share/nginx/html# rm 50x.html 
rm: cannot remove '50x.html': Read-only file system
root@838d01664db5:/usr/share/nginx/html# 
root@838d01664db5:/usr/share/nginx/html# 

Neste ponto, ele não pode mais ser excluído.

3.7.2 --mountParâmetros

Mapeamento completo de diretório.

parâmetro.

type : 类型表示 bind, volume, or tmpfs
source, src : 对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
destination, dst, target : 文件或目录挂载在容器中的路径
ro, readonly : 只读方式挂载

Prática.

docker run -d --name mynginxvol3 --mount 'src=nginxvol3,dst=/usr/share/nginx/html' nginx:1.21.4 
[root@ALiCentos7:~]$ docker run -d --name mynginxvol4 --mount 'dst=/usr/share/nginx/html' nginx:1.22.0 
2d04251a15f4a4216a079b798524a1e1c31f841d61417bfcb86aa2956cc63004
[root@ALiCentos7:~]$ docker inspect my
mynginxvol4          mywebsite-yufc:v1.0  
[root@ALiCentos7:~]$ docker inspect mynginxvol4 
[
    {
    
    
        "Id": "2d04251a15f4a4216a079b798524a1e1c31f841d61417bfcb86aa2956cc63004",
        "Created": "2023-09-19T12:05:44.437893015Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],

Insira a descrição da imagem aqui

3.8 Volume anônimo do Dockerfile

Os volumes de gerenciamento do Docker podem ser criados por meio do VOLUME do Dockerfile. Explicaremos isso em detalhes no Dockerfile posteriormente. Também podemos criar um Volume de Dados na imagem através da instrução VOLUME do dockerfile, de forma que qualquer container criado através da imagem terá um ponto de montagem, porém vale ressaltar que o ponto de montagem criado através da instrução VOLUME não pode especificar o diretório correspondente no host. , mas gerado aleatoriamente pelo docker.

3.9 Casos de operação

3.9.1 Caso 1

O que acontece se o conteúdo do contêiner for modificado no host? será sincronizado com o contêiner.

Prepare o ambiente primeiro.

Insira a descrição da imagem aqui

Mude.

Insira a descrição da imagem aqui

Verificou-se que o contêiner também foi modificado simultaneamente.

3.9.2 Caso 2

Se estiver vinculado a ro, ainda poderá ser modificado? A máquina host pode ser modificada? Pode ser modificado no contêiner?

Execute o contêiner primeiro

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Descobri que isso pode ser alterado na máquina host.

Insira a descrição da imagem aqui

Descobri que não pode ser alterado dentro do contêiner.

3.9.3 Caso 3

Usando --mounto método, repita as operações dos dois casos acima para ver se o contêiner e o host podem ser sincronizados.

Insira a descrição da imagem aqui

Usado para--mount iniciar um contêiner.

Faça alterações na página inicial.

Insira a descrição da imagem aqui

Pode ser modificado.

3.10 Ciclo de vida do volume Docker

Conclusão: Mesmo que o contêiner seja excluído, o conteúdo do volume ainda estará lá, afinal, esse volume é originalmente usado para proteger dados.

Insira a descrição da imagem aqui

Mas se docker volume rm test3a coisa definitivamente acabou.

[root@ALiCentos7:~]$ ll /data/var/lib/docker/volumes/test3/_data
total 8
-rw-r--r-- 1 root root 497 Nov  2  2021 50x.html
-rw-r--r-- 1 root root 630 Sep 19 21:09 index.html
[root@ALiCentos7:~]$ docker volume rm test3
test3
[root@ALiCentos7:~]$ ll /data/var/lib/docker/volumes/test3/_data
ls: cannot access /data/var/lib/docker/volumes/test3/_data: No such file or directory
[root@ALiCentos7:~]$ 

3.11 Compartilhamento de Volume

Inicie três contêineres e vincule-os ao mesmo volume para ver o que acontece após a modificação.

Conclusão: Três contêineres serão atualizados ao mesmo tempo.

Não farei demonstração aqui porque o servidor em nuvem não quer abrir tantas portas.

4. Vincular montagem de ligação de volume

Tanto -v quanto -mount podem completar a criação de volumes vinculados.

4.1 -vParâmetros para criar um volume vinculado

docker run -v name:directory[:options] ...

parâmetro

第一个参数:宿主机目录,这个和管理卷是不一样的
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

Se o primeiro parâmetro for o diretório do host, será o volume vinculado. Se não for especificado, será o volume anônimo do volume de gerenciamento. Se for um nome, será o volume de gerenciamento.

Operação prática

docker run -d --name mynginx -v /root/DockerSrc/Volume/:/usr/share/nginx/html f6987c8d6ed5

Insira a descrição da imagem aqui

Faça uma modificação na máquina host.

Descobri que haverá alguns lá também.

Insira a descrição da imagem aqui

4.2 --mountParâmetros para criar um volume vinculado

--mount '<key>=<value>,<key>=<value>'

parâmetro.

type : 类型表示 bind, volume, or tmpfs
source, src : 宿主机目录,这个和管理卷是不一样的。
destination, dst, target : 文件或目录挂载在容器中的路径
ro, readonly : 只读方式挂载

Insira a descrição da imagem aqui

Escreva um arquivo no contêiner e veja se ele aparece no host.

Insira a descrição da imagem aqui

4.3 Exemplos de operação de volumes vinculativos

4.3.1 Caso 1

Método de uso --mountpara criar um contêiner: Crie um contêiner nginx e monte o /webapp1 diretório host no /usr/share/nginx/htmldiretório do contêiner. Observe que se webapp1o diretório não existir, um erro será relatado.

Insira a descrição da imagem aqui

Se o diretório host não existir, um erro será relatado diretamente!

Insira a descrição da imagem aqui

4.3.2 Caso 2: Compartilhamento de volumes vinculados

Conclusão: É o mesmo que gerenciar o compartilhamento de volumes, se o host for alterado, todos os containers serão modificados.

5. Volume temporário tmpfs

Os dados de volume efêmero residem na memória, fora do contêiner e do host.

limitações do tmpfs

  • Ao contrário dos volumes e das montagens de ligação, as montagens tmpfs não podem ser compartilhadas entre contêineres.

  • Este recurso está disponível apenas ao executar o Docker no Linux

5.1 Criar volumes

Método 1: especifique --tmpfsa criação

Insira a descrição da imagem aqui

O experimento neste momento é igual ao anterior, mas se o contêiner parar, as coisas desaparecerão.

6. Prática abrangente - recuperação de desastres do MySQL

Efeito prático, aplicabilidade:

Domine o uso de volumes montados e armazene dados de negócios MySQL externamente

Etapas práticas:

Crie um contêiner usando a imagem MySQL 5.7 e crie um volume de dados comum mysql-data para salvar os dados gerados no contêiner. Você precisa se conectar ao serviço MySQL no contêiner, criar um teste de banco de dados, criar uma tabela simples no banco de dados e inserir alguns dados nela.

Primeiro encontre um mysqlcontêiner de pontos e execute-o.

Insira a descrição da imagem aqui

docker run --name mysql -v /root/DockerSrc/Volume/mysql-test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yfc@test -d mysql:5.7

Conecte isso mysql.

Insira a descrição da imagem aqui

Crie um banco de dados.

Insira a descrição da imagem aqui
Criar a tabela.

Insira a descrição da imagem aqui

Exclua este contêiner em execução.

Insira a descrição da imagem aqui

Agora execute um novo contêiner e vincule-o ao diretório original para ver se as coisas ainda estão lá.

docker run --name mysql-new -v /root/DockerSrc/Volume/mysql-test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yfc@test -d mysql:5.7

Insira a descrição da imagem aqui

Encontrei algo ainda lá.

Acho que você gosta

Origin blog.csdn.net/Yu_Cblog/article/details/133353932
Recomendado
Clasificación