Volume (volume) de uso básico do Docker para gerenciar dados de aplicativos

Os volumes são o mecanismo preferencial para os contêineres do Docker produzir e usar dados persistentes. As montagens do Bind dependem da estrutura do diretório do host e os volumes são completamente gerenciados pelo Docker. Em comparação com a montagem encadernada, os volumes têm várias vantagens:

  • Volumes são mais fáceis de fazer backup ou migrar do que montagens de bind.
  • Você pode usar comandos Docker CLI ou Docker API para gerenciar volumes.
  • Os volumes podem funcionar em contêineres Linux e Windows.
  • Os volumes podem ser compartilhados entre vários contêineres com mais segurança.
  • O driver de volume permite armazenar o volume, criptografar o conteúdo do volume ou adicionar outras funções em um host remoto ou provedor de nuvem.
  • O conteúdo do novo volume pode ser pré-preenchido pelo recipiente. (Novos volumes podem ter seu conteúdo pré-preenchido por um contêiner.)

Além disso, em comparação com dados persistentes para a camada gravável do contêiner, um volume é geralmente uma escolha melhor porque o volume não aumenta o tamanho do contêiner que o usa, e o conteúdo do volume existe fora do tempo de vida de um determinado recipiente.

docker-types-of-mounts-volume

Se o contêiner gerar dados de estado não persistentes, considere o uso de montagem tmpfs para evitar o armazenamento permanente de dados em qualquer lugar e para melhorar o desempenho do contêiner, evitando gravar na camada gravável do contêiner.

Volume usando rprivatepropagação de ligação, propagação para o volume e a ligação não é configurável.

Selecione a sinalização -v ou --mount

Inicialmente, -vou --volumemarcado para contêineres separados, --mountrotulado para serviços de cluster. No entanto, a partir do Docker 17.06, você também pode --mountser usado independentemente do contêiner. Normalmente, a --mountexpressão da marca é mais clara e detalhada. A maior diferença é a -vsintaxe para todas as combinações de opções em um campo e as --mountopções de sintaxe separadas. A seguir está uma comparação de sintaxe de cada tag.

Recomenda-se ao novo usuário o uso de --mountgramática, do que --volumesintaxe mais simples.

Se você precisar especificar opções de driver de volume, você deve usá-los --mount.

  • -vOu --volume: Consiste em três campos, separados por dois pontos (:). Os campos devem ser organizados na ordem correta e o significado de cada campo não é intuitivo o suficiente.
    • Para volumes nomeados, o primeiro campo é o nome do volume, que é exclusivo em um determinado host. Para volumes anônimos, omita o primeiro campo.
    • O segundo campo é o caminho onde o arquivo ou diretório no contêiner é montado.
    • O terceiro campo é opcional e é uma lista de opções separada por vírgulas, por exemplo ro. Essas opções serão discutidas abaixo neste artigo.
  • --mount: Uma pluralidade de chaves - pares de valores, separados por vírgulas, cada chave - o valor de uma das <key>=<value>tuplas. --mountSintaxe do que -vou --volumemais detalhada, mas a ordem das chaves não é importante, o valor da tag também é mais fácil de entender.
    • O tipo de montagem ( type), que pode ser bind, volumeou tmpfs. Este tópico discute o volume, portanto, o tipo ( type) é sempre o volume ( volume).
    • A origem do mount ( source). Para volumes nomeados, é o nome do volume. Para volumes anônimos, este campo é omitido. Você pode ser usado sourceou srcespecificado.
    • Target ( destination), o caminho onde o arquivo ou diretório no contêiner é montado como seu valor. Ele pode ser usado destination, dstou targetespecificar.
    • readonlyA opção (se houver), a montagem de ligação será montada no contêiner como somente leitura .
    • volume-opt As opções podem ser especificadas várias vezes e aceitar pares de valores-chave que consistem no nome da opção e seu valor.

Valores de escape do analisador CSV externo

Se o driver de volume aceitar uma lista separada por vírgulas como opções, o valor deve ser escapado do analisador CSV externo. Para escapar volume-opt, use aspas duplas (") para delimitá-lo e aspas simples (') para delimitar todo o parâmetro de montagem.

Por exemplo, um localdriver de parâmetros local ( ) oaceita a montagem como uma opção de lista separada por vírgulas. O exemplo a seguir mostra a maneira correta de escrever a lista de escape.

$ docker service create \
    --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
    --name myservice \
    <IMAGE>

O exemplo a seguir mostra o mais simultaneamente possível --mounte as -vduas sintaxes, e a primeira mostra --mount.

-vE --mounta diferença entre o comportamento

E bind monta volumes diferentes para todas as opções --mounte -vmarcas estão disponíveis.

Quando usado em conjunto com o volume de serviço, apenas --mountsuporte.

Criar e gerenciar volumes

Ao contrário da montagem de ligação, você pode criar e gerenciar volumes fora do escopo de qualquer contêiner.

Crie um volume:

$ docker volume create my-vol

Lista de volumes:

$ docker volume ls
# 输出结果:
DRIVER              VOLUME NAME
local               my-vol

Verifique o volume:

$ docker volume inspect my-vol
# 输出结果:
[
    {
    
    
        "CreatedAt": "2020-07-04T07:06:47Z",
        "Driver": "local",
        "Labels": {
    
    },
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {
    
    },
        "Scope": "local"
    }
]

Excluir volume:

$ docker volume rm my-vol

Comece um contêiner com um volume

Se você iniciar um contêiner com um volume que ainda não existe, o Docker criará o volume para você. O exemplo a seguir myvol2montagem com rolo no contêiner /app/em.

Abaixo --mounte os -vexemplos produzirão os mesmos resultados. A menos que seja removido após executar o primeiro devtestrecipiente de amostra e myvol2volume, ou não pode executá-los ao mesmo tempo.

--mount

$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

-v

$ docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

Use a docker inspect devtestverificação para criar e montar os volumes corretos. Ver Mountsparte:

"Mounts": [
    {
    
    
        "Type": "volume",
        "Name": "myvol2",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

Isso indica que a montagem é um volume, mostra a origem e o destino corretos e a montagem pode ser lida e gravada.

Pare o contêiner e exclua o volume. Observe que a exclusão de um volume é uma etapa separada.

$ docker container stop devtest

$ docker container rm devtest

$ docker volume rm myvol2

Comece o serviço com o volume

Ao iniciar serviços e definir volumes, cada contêiner de serviço usa seu próprio volume local. Se você usar um localdriver de volume local ( ), nenhum contêiner poderá compartilhar esses dados, mas alguns drivers de volume suportam armazenamento compartilhado. Tanto o Docker para AWS quanto o Docker para Azure oferecem suporte ao armazenamento persistente usando o plug-in Cloudstor.

O exemplo a seguir usa quatro cópias para iniciar nginxo serviço, cada cópia usando um myvol2volume local nomeado .

$ docker service create -d \
  --replicas=4 \
  --name devtest-service \
  --mount source=myvol2,target=/app \
  nginx:latest

O docker service ps devtest-serviceserviço de autenticação de uso está em execução:

$ docker service ps devtest-service

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
4d7oz1j85wwn        devtest-service.1   nginx:latest        moby                Running             Running 14 seconds ago

Exclua o serviço, o serviço interromperá todas as suas tarefas:

$ docker service rm devtest-service

A exclusão de um serviço não exclui nenhum volume criado pelo serviço. Excluir um volume é uma etapa separada.

Diferenças gramaticais em serviços

docker service createComando não suporta -vnem --volumemarca, quando o volume de um container montado no serviço, deve-se usar a --mountmarca.

Encha o volume com um recipiente

Se você iniciar um contêiner que cria um novo volume, conforme descrito acima, e o contêiner /app/tiver arquivos ou diretórios no diretório a ser montado (como acima ), o conteúdo do diretório será copiado para o novo volume. Em seguida, o contêiner é montado e usa o volume, e outros contêineres que usam o volume também podem acessar o conteúdo pré-preenchido.

Para ilustrar este ponto, este caso iniciou um nginxcontêiner, e o contêiner é /usr/share/nginx/htmlpreenchido com o novo diretório de conteúdo de volume nginx-vol, o diretório é o local de armazenamento padrão do conteúdo HTML Nginx.

O seguinte --mounte -vexemplo tem o mesmo resultado final.

--mount

$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx:latest

-v

$ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html \
  nginx:latest

Depois de executar qualquer um dos dois exemplos, execute os comandos a seguir para limpar os contêineres e volumes. Nota: a exclusão de um volume é uma etapa separada.

$ docker container stop nginxtest

$ docker container rm nginxtest

$ docker volume rm nginx-vol

Use volumes somente leitura

Para alguns aplicativos de desenvolvimento, o contêiner precisa gravar montagens de ligação para que as alterações sejam propagadas de volta para o host Docker. Em outras ocasiões, o contêiner só precisa de acesso de leitura aos dados. Lembre-se de que vários contêineres podem montar o mesmo volume e alguns deles podem ser montados para leitura e gravação, enquanto outros podem ser montados somente para leitura.

Este exemplo modifica o exemplo acima, mas monta roo diretório como um volume somente leitura , adicionando-o à lista de opções (vazia por padrão) após o ponto de montagem no contêiner . Quando houver várias opções, separe-as com vírgulas.

Aqui --mounte a -vamostra têm os mesmos resultados.

--mount

$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest

-v

$ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx:latest

Use docker inspect nginxtestpara verificar se o correto cria uma montagem somente leitura. Ver Mountsparte:

"Mounts": [
    {
    
    
        "Type": "volume",
        "Name": "nginx-vol",
        "Source": "/var/lib/docker/volumes/nginx-vol/_data",
        "Destination": "/usr/share/nginx/html",
        "Driver": "local",
        "Mode": "",
        "RW": false,
        "Propagation": ""
    }
],

Pare e exclua o contêiner e, em seguida, exclua o volume. Excluir um volume é uma etapa separada.

$ docker container stop nginxtest

$ docker container rm nginxtest

$ docker volume rm nginx-vol

Compartilhando dados entre máquinas

Ao construir aplicativos tolerantes a falhas, você pode precisar configurar várias cópias do mesmo serviço para acessar os mesmos arquivos.
docker-volumes-shared-storage

Ao desenvolver um aplicativo, existem várias maneiras de fazer isso. Uma maneira é adicionar lógica ao seu aplicativo para armazenar arquivos em um sistema de armazenamento de objetos em nuvem, como o Amazon S3. Outro método é usar um driver que ofereça suporte à gravação de arquivos em um sistema de armazenamento externo (como NFS ou Amazon S3) para criar o volume.

Os drivers de volume permitem que você abstraia o sistema de armazenamento subjacente da lógica do aplicativo. Por exemplo, se o seu serviço usa um volume com um driver NFS, você pode atualizar o serviço para usar um driver diferente (por exemplo, armazenar dados na nuvem) sem alterar a lógica do aplicativo.

Usar driver de volume

Quando você usa docker volume createao criar um volume, ou quando você começa a usar o volume do contêiner não foi criado, você pode especificar um driver de volume. O exemplo a seguir usa o vieux/sshfsdriver de volume, o primeiro a ser usado ao criar volumes separados e, em seguida, começa a criar um novo volume no contêiner durante o uso.

configuração padrão

Este exemplo pressupõe que você tenha dois nós. O primeiro nó é o host Docker e você pode se conectar ao segundo nó usando SSH.

Docker no computador host, instale vieux/sshfsplug-ins:

$ docker plugin install --grant-all-permissions vieux/sshfs

Crie um volume usando o driver de volume

Este exemplo especifica uma senha SSH, mas se os dois hosts estiverem configurados com uma chave compartilhada, você pode omitir a senha. Cada driver de bobina pode ter zero ou mais opções configuráveis, cada opção usa -otag especificada.

$ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

Inicie o contêiner que usa o driver de volume para criar o volume

Este exemplo especifica uma senha SSH, mas se os dois hosts estiverem configurados com uma chave compartilhada, você pode omitir a senha. Cada driver de volume pode ter zero ou mais opções configuráveis. Se o driver de volume requer que você passe opções, você deve usar a --mounttag para montar o volume, ao invés de usar -v.

$ docker run -d \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

Crie um serviço para criar volumes NFS

Este exemplo mostra como criar um volume NFS ao criar um serviço. Esta modalidade usada 10.0.0.10como um servidor NFS, usada /var/docker-nfscomo um diretório de saída no servidor NFS. Observe que o driver de volume especificado é local.

NFSV3

$ docker service create -d \
  --name nfs-service \
  --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \
  nginx:latest

NFSV4

docker service create -d \
    --name nfs-service \
    --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt=o=10.0.0.10,rw,nfsvers=4,async"' \
    nginx:latest

Faça backup, restaure ou migre volumes de dados

Os volumes são muito úteis para backup, restauração e migração. Use --volumes-frommarcadores para criar um novo contêiner para montar o volume.

Contêiner de backup

Por exemplo, crie um arquivo chamado dbstorenovo contêiner:

$ docker run -v /dbdata --name dbstore ubuntu /bin/bash

Então, no próximo comando, nós:

  • Inicie um novo contêiner e a partir dos dbstorevolumes montados no contêiner
  • Monte um diretório de host local como /backup
  • Passe um comando para /dbdatao conteúdo do volume para um diretório /backupde backup.tararquivos.
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

Quando o comando é concluído e a embarcação para, ele nos deixa com /dbdataum volume de backup.

Restaurar contêiner do backup

Usando o backup que acabou de criar, você pode restaurá-lo no mesmo contêiner ou em um contêiner criado em outro lugar.

Por exemplo, crie um arquivo chamado dbstore2novo contêiner:

$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

Em seguida, descompacte o arquivo de backup no volume de dados do novo contêiner:

$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

Você pode usar as técnicas acima para automatizar os testes de backup, migração e restauração usando suas ferramentas favoritas.

Apagar o volume

Quando o contêiner é excluído, o volume de dados do Docker ainda existe. Existem dois tipos de volumes a serem considerados:

  • O volume nomeado tem uma fonte específica de fora do contêiner, por exemplo awesome:/bar.
  • Volumes anônimos não têm origem específica, portanto, quando os contêineres são excluídos, o daemon do mecanismo Docker é notificado para excluí-los.

Excluir volume anônimo

Para excluir automaticamente o volume anônimo, use a --rmopção. Por exemplo, este comando cria um /foovolume anônimo . Quando o contêiner é excluído, o mecanismo Docker exclui o /foovolume, mas não exclui awesomeo volume.

$ docker run --rm -v /foo -v awesome:/bar busybox top

Apagar todos os volumes

Para excluir todos os volumes não utilizados e liberar espaço:

$ docker volume prune

Autor:
Tradutor do site oficial do Docker : Technical Zemin
Editor: Links dos Versos Técnicos
: texto em inglês

Número Público: Estação de Tradução Técnica

Acho que você gosta

Origin blog.csdn.net/weixin_47498376/article/details/107321042
Recomendado
Clasificación