[Artigo do Docker] Compreensão profunda do volume de dados do contêiner, montagem anônima e montagem nomeada, contêiner de volume de dados

volume do contêiner de dados

1. O que é um volume de dados de contêiner

Todos sabemos que através do Docker, nosso ambiente de tempo de execução de software e software desenvolvido com base no ambiente de tempo de execução podem ser empacotados em imagens, e a operação de imagem é acompanhada por contêineres, e o ciclo de vida dos arquivos de dados internos também é o mesmo que o ciclo de vida do recipiente. Mas em nosso aplicativo real, queremos poder persistir alguns dados.

Por exemplo, se você instalar um MySQL e deletar o container, é equivalente a deletar o banco de dados e fugir, essa TM é muito ridícula!

Os dados gerados pelo contêiner do Docker, se uma nova imagem não for gerada pelo docker commit, para que os dados sejam salvos como parte da imagem, então quando o contêiner for excluído, os dados naturalmente desaparecerão! Isso não vai funcionar!

Portanto, esperamos ter uma tecnologia que possa realizar o compartilhamento de dados. Assim nasceu a tecnologia do rolo de contêiner.

Para poder salvar dados no Docker, podemos usar volumes! Deixe os dados serem montados em nosso local (disco que pode persistir dados)! Desta forma, os dados não serão perdidos devido à exclusão do contêiner!

insira a descrição da imagem aqui

Função :

Um volume é um diretório ou arquivo que existe em um ou mais contêineres e é montado no contêiner pelo docker, mas não pertence ao Union File System, portanto, pode contornar o Union File System e fornecer alguns recursos para armazenamento persistente ou compartilhamento de dados.

Os volumes são projetados para persistência de dados e são completamente independentes do ciclo de vida do contêiner, portanto, o Docker não excluirá o volume de dados montado quando o contêiner for excluído.

Características :

  1. Volumes de dados para compartilhar ou reutilizar dados entre contêineres
  2. Alterações no volume podem ter efeito direto
  3. As alterações nos volumes de dados não serão incluídas nas atualizações espelhadas
  4. O ciclo de vida de um volume de dados dura até que nenhum contêiner o use

Resumindo, a persistência de dados de container e o compartilhamento de dados entre containers são realizados através de volumes de dados.

2. Usando volumes de dados

Agora que sabemos que há muitas vantagens em usar volumes de dados, como podemos usá-los?

Método 1: Usamos o comando para adicionar diretamente.

Montagem :

# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名

# 测试
[root@jiangnan ~]# docker run -it -v /home:/home centos /bin/bash

-v é para montar nosso host e contêiner.

Podemos docker inspect 容器idverificar se a montagem foi bem sucedida, principalmente olhando para a seção Montarias.

"Mounts": [
            {
    
    
                "Type": "bind",
                "Source": "/home",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

Origem é o caminho para a máquina virtual correspondente. Destino é o caminho dentro do contêiner correspondente.

Teste :

Primeiro, criamos um novo arquivo hello.txt no diretório /home da máquina virtual para ver se ele pode ser sincronizado com o diretório /home no contêiner.

insira a descrição da imagem aqui

Descoberta: Os arquivos criados no host também podem ser vistos no contêiner.

Modificamos o arquivo dentro do container. Veja se os arquivos no computador host também podem ser modificados.

insira a descrição da imagem aqui

Descoberta: Modifique os arquivos no container, os arquivos do host também são modificados e os dados são sincronizados em ambas as direções .

Como dissemos acima, a montagem do volume de dados é para obter a persistência dos dados e evitar que o banco de dados seja excluído e executado, então isso pode ser feito?

Paramos o recipiente.

insira a descrição da imagem aqui

Encontrado: Embora o contêiner esteja parado, o hello.txt local ainda existe. A persistência dos dados é alcançada.

Neste momento, se modificarmos o arquivo local novamente, quando reiniciarmos o contêiner, descobriremos que os arquivos no contêiner são mantidos em sincronia com nossos arquivos modificados localmente, o que realmente realiza a sincronização e o compartilhamento de dados.

insira a descrição da imagem aqui

Método 2: Usar o Dockerfile

Aqui está um Dockerfile simples para você, sobre o qual falaremos em uma postagem de blog posterior.

  1. Agora criamos uma nova pasta /tomcat-volume no diretório host /home
[root@jiangnan home]# mkdir tomcat-volume
[root@jiangnan home]# ll
total 12
-rw-r--r-- 1 root root   12 Feb 22 22:53 hello.txt
drwxr-xr-x 4 root root 4096 Feb 22 23:16 tomcat
drwxr-xr-x 2 root root 4096 Feb 23 19:25 tomcat-volume   # 新建一个tomcat-volume文件夹
[root@jiangnan home]# 
  1. Escreva um Dockerfile
[root@jiangnan ~]# cd /home/tomcat-volume/
[root@jiangnan tomcat-volume]# vi Dockerfile
[root@jiangnan tomcat-volume]# cat Dockerfile 
FROM centos
VOLUME ["/volume1","/volume2"]
CMD echo "-------end------"
CMD /bin/bash
[root@jiangnan tomcat-volume]# 

Use o comando VOLUME no arquivo DockerFile para adicionar um ou mais volumes de dados à imagem

  1. Gere uma imagem chamada mycentos

Observe que o nome da imagem não pode ter letras maiúsculas

[root@jiangnan tomcat-volume]# docker build -f /home/tomcat-volume/Dockerfile -t mycentos . 
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["/volume1","/volume2"]
 ---> Running in a9dcdbdb111e
Removing intermediate container a9dcdbdb111e
 ---> 6811c813ce47
Step 3/4 : CMD echo "-------end------"
 ---> Running in 92c7e1ef5987
Removing intermediate container 92c7e1ef5987
 ---> e58a5176b91d
Step 4/4 : CMD /bin/bash
 ---> Running in 3f1310167f22
Removing intermediate container 3f1310167f22
 ---> 91f16e4a921e
Successfully built 91f16e4a921e
Successfully tagged mycentos:latest
[root@jiangnan tomcat-volume]# 

-f: Especifica Dockerfile. -t: Nomeie a imagem. Há um comando no final que .não pode ser omitido.

insira a descrição da imagem aqui

O espelhamento foi criado com sucesso.

  1. Inicie a imagem que você acabou de criar e visualize a estrutura de diretórios
[root@jiangnan tomcat-volume]# docker run -it 91f16e4a921e /bin/bash
[root@1fabdfdf4803 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Feb 23 11:38 dev
drwxr-xr-x   1 root root 4096 Feb 23 11:38 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
drwxr-xr-x  12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x  20 root root 4096 Sep 15 14:17 var
drwxr-xr-x   2 root root 4096 Feb 23 11:38 volume1  # 数据卷目录
drwxr-xr-x   2 root root 4096 Feb 23 11:38 volume2  # 数据卷目录
[root@1fabdfdf4803 /]# 
  1. Visualize o diretório de montagem local
[root@jiangnan home]# docker inspect 1fabdfdf4803

insira a descrição da imagem aqui

Isso também permite a montagem. Novos arquivos são visíveis localmente e no contêiner.

3. Combate real

Todos nós sabemos que o arquivo do projeto de implantação do tomcat precisa ser colocado em webapps para ser acessível, mas precisamos iniciar o tomcat toda vez que o arquivo for atualizado? Obviamente não, só precisamos pendurar o diretório webapps em um diretório local, colocar os arquivos necessários nele, e ele será automaticamente sincronizado com o diretório webapps do tomcat.

[root@jiangnan home]# docker run -d -v /home/tomcat/webapps:/usr/local/tomcat/webapps -p 8081:8080 --name tomcat01 tomcat

Após a inicialização, coloco o projeto preparado no /home/tomcat/webappsdiretório da máquina host.

insira a descrição da imagem aqui

Descoberta: Ele existe no contêiner.

Vamos visitar e ver o efeito.Eu usei a porta 8081 para mapear a porta 8080 do container, então preciso usar a porta 8081 para acessar.

insira a descrição da imagem aqui

sem problemas.

Em aplicações práticas, também podemos montar alguns arquivos de configuração, o que é mais conveniente para modificar.

Como compartilhar dados entre contêineres ?

Também mencionamos o compartilhamento de dados entre contêineres acima. Como fazer isso?

Iniciamos outro tomcat03, que também é montado localmente /home/tomcat/webapps. Exponha a porta 8082.

[root@jiangnan webapps]# docker run -d -v /home/tomcat/webapps:/usr/local/tomcat/webapps -p 8082:8080 --name tomcat03 tomcat
9aacff8773bc1ee92acc2c598fd497cde18e9c44192a9942906ae16c5e0ead2e
[root@jiangnan webapps]# 

Acesso direto sem fazer nada.

insira a descrição da imagem aqui
insira a descrição da imagem aqui

Nenhum problema também.

Como os dois tomcats são montados no mesmo diretório local, ambos compartilham os recursos no diretório local. Esse método realiza indiretamente o compartilhamento de dados entre contêineres.

4. Montagens anônimas e montagens nomeadas

# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls

[root@jiangnan webapps]# docker run -d -p 80:80 --name nginx01 -v /etc/nginx nginx
d270788d32058ffbd9dbbd9a98133f42b05dbf3881d25b8d482d36c12c0279d5
[root@jiangnan webapps]# docker volume ls
DRIVER    VOLUME NAME
local     4b595f9bdc43c312f982c594a3f3087920e08d53b9f9e090779509d14f0f4638

# 查看挂载的路径
[root@jiangnan webapps]# docker volume inspect 4b595f9bdc43c312f982c594a3f3087920e08d53b9f9e090779509d14f0f4638
[
    {
    
    
        "CreatedAt": "2022-02-22T23:49:12+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/4b595f9bdc43c312f982c594a3f3087920e08d53b9f9e090779509d14f0f4638/_data",
        "Name": "4b595f9bdc43c312f982c594a3f3087920e08d53b9f9e090779509d14f0f4638",
        "Options": null,
        "Scope": "local"
    }
]
[root@jiangnan webapps]# 
# 具名挂载
-v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx

[root@jiangnan webapps]# docker run -d -p 81:80 --name nginx02 -v nginxconfig:/etc/nginx nginx
6e3a6b44c49c5b656c9a0dc838c66c2614537b4b00503b8a567140d1fde4adfb

# 查看挂载的路径
[root@jiangnan webapps]# docker volume inspect nginxconfig
[
    {
    
    
        "CreatedAt": "2022-02-22T23:50:48+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
        "Name": "nginxconfig",
        "Options": null,
        "Scope": "local"
    }
]
[root@jiangnan webapps]# 

Nomeado e anônimo é dar um nome ao nosso volume montado. Obviamente, montagens nomeadas são mais convenientes.

Como julgar que o nome do volume está montado em vez do nome do diretório local?

is/begins é o nome do volume, is/begins é o nome do diretório

Altere as permissões de leitura e gravação do arquivo
ro: readonly
rw: readwrite

Especifique as permissões de leitura e gravação do contêiner para o conteúdo que montamos

docker run -d -p 81:80 --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -p 81:80 --name nginx02 -v nginxconfig:/etc/nginx:rw nginx  

5. Contêiner de Volume de Dados

O contêiner nomeado monta o volume de dados e outros contêineres realizam o compartilhamento de dados montando isso (contêiner pai), e o contêiner que monta o volume de dados é chamado de contêiner de volume de dados.

No exemplo anterior, criamos a imagem mycentos, e usamos isso como modelo para executar os contêineres mycentos01, mycentos02, mycentos03

Vamos testar, transferir o compartilhamento entre contêineres

  1. Inicie o contêiner pai mycentos01

Processo de fundo.

[root@jiangnan tomcat-volume]# docker run -d -it --name mycentos01 mycentos
[root@9ba991b24352 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Feb 23 11:50 dev
drwxr-xr-x   1 root root 4096 Feb 23 11:50 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
drwxr-xr-x  12 root root 4096 Sep 15 14:17 usr
drwxr-xr-x  20 root root 4096 Sep 15 14:17 var
drwxr-xr-x   2 root root 4096 Feb 23 11:50 volume1
drwxr-xr-x   2 root root 4096 Feb 23 11:50 volume2
[root@9ba991b24352 /]# 
  1. Crie mycentos02 e mycentos03 e deixe-os herdar mycentos01

--volumes-from

[root@jiangnan tomcat-volume]# docker run -d -it --name mycentos02 --volumes-from mycentos01 centos
c804e323d49c7203809069ed413c692e637adc02f3797957f1b6537c7d1bbf5c

[root@jiangnan tomcat-volume]# docker run -d -it --name mycentos03 --volumes-from mycentos01 centos
2306661ebddd801550a20765ce7dc123cdff7d60cfebe3dc6287a8d659cf58cd
[root@jiangnan tomcat-volume]# 
  1. Agora vamos para mycentos03 e criamos o arquivo.
[root@jiangnan tomcat-volume]# docker exec -it 2306661ebddd /bin/bash
[root@2306661ebddd /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@2306661ebddd /]# cd volume1
[root@2306661ebddd volume1]# ls
[root@2306661ebddd volume1]# touch mycentos03.txt
[root@2306661ebddd volume1]# 

Então entramos em mycentos01 e mycentos02, e também podemos ver os arquivos criados por mycentos03.
insira a descrição da imagem aqui

De fato, o compartilhamento de dados é realizado e os arquivos ou modificações criadas em qualquer container podem ser atualizados de forma síncrona em outros containers associados.

Mesmo que alguns desses contêineres sejam excluídos, outros contêineres ainda poderão ver o status atualizado dos arquivos.

Conclusão :
A transferência de informações de configuração entre contêineres, o ciclo de vida do volume de dados continua até que nenhum contêiner o utilize.
Os arquivos armazenados neste computador serão sempre preservados!

6. Resumo

  1. Os volumes de dados de contêiner são, na verdade, tecnologias que implementam operações de persistência de dados de contêiner.
  2. A persistência de dados de contêiner e o compartilhamento de dados entre contêineres são realizados por meio de volumes de dados.
  3. Ao iniciar o contêiner, você pode montar o volume do contêiner por meio do comando ou pode adicioná-lo no Dockerfile.
  4. is/begins é o nome do volume, is/begins é o nome do diretório. Montagens nomeadas têm nomes, montagens anônimas não têm nomes.
  5. docker volume lsUsado para visualizar e manter volumes de dados.
  6. O contêiner que monta o volume de dados é chamado de contêiner de volume de dados.
  7. A essência do compartilhamento de dados entre contêineres é montar em um diretório local para realizar o compartilhamento de dados .
  8. O ciclo de vida de um volume de dados dura até que nenhum contêiner o use.
  9. Os arquivos armazenados nesta unidade são sempre retidos.

insira a descrição da imagem aqui
Minha conta pública do WeChat foi aberta primeiro, você pode me seguir e os artigos serão sincronizados posteriormente para facilitar a visualização.
insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_45842494/article/details/123098436
Recomendado
Clasificación