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.
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 rprivate
propagaçã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, -v
ou --volume
marcado para contêineres separados, --mount
rotulado para serviços de cluster. No entanto, a partir do Docker 17.06, você também pode --mount
ser usado independentemente do contêiner. Normalmente, a --mount
expressão da marca é mais clara e detalhada. A maior diferença é a -v
sintaxe para todas as combinações de opções em um campo e as --mount
opções de sintaxe separadas. A seguir está uma comparação de sintaxe de cada tag.
Recomenda-se ao novo usuário o uso de
--mount
gramática, do que--volume
sintaxe mais simples.
Se você precisar especificar opções de driver de volume, você deve usá-los --mount
.
-v
Ou--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.--mount
Sintaxe do que-v
ou--volume
mais 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 serbind
,volume
outmpfs
. 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 usadosource
ousrc
especificado. - Target (
destination
), o caminho onde o arquivo ou diretório no contêiner é montado como seu valor. Ele pode ser usadodestination
,dst
outarget
especificar. readonly
A 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.
- O tipo de montagem (
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
local
driver de parâmetros local ( )o
aceita 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 --mount
e as -v
duas sintaxes, e a primeira mostra --mount
.
-v
E --mount
a diferença entre o comportamento
E bind monta volumes diferentes para todas as opções --mount
e -v
marcas estão disponíveis.
Quando usado em conjunto com o volume de serviço, apenas --mount
suporte.
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 myvol2
montagem com rolo no contêiner /app/
em.
Abaixo --mount
e os -v
exemplos produzirão os mesmos resultados. A menos que seja removido após executar o primeiro devtest
recipiente de amostra e myvol2
volume, 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 devtest
verificação para criar e montar os volumes corretos. Ver Mounts
parte:
"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 local
driver 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 nginx
o serviço, cada cópia usando um myvol2
volume local nomeado .
$ docker service create -d \
--replicas=4 \
--name devtest-service \
--mount source=myvol2,target=/app \
nginx:latest
O docker service ps devtest-service
serviç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 create
Comando não suporta -v
nem --volume
marca, quando o volume de um container montado no serviço, deve-se usar a --mount
marca.
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 nginx
contêiner, e o contêiner é /usr/share/nginx/html
preenchido 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 --mount
e -v
exemplo 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 ro
o 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 --mount
e a -v
amostra 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 nginxtest
para verificar se o correto cria uma montagem somente leitura. Ver Mounts
parte:
"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.
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 create
ao 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/sshfs
driver 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/sshfs
plug-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 -o
tag 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 --mount
tag 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.10
como um servidor NFS, usada /var/docker-nfs
como 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-from
marcadores para criar um novo contêiner para montar o volume.
Contêiner de backup
Por exemplo, crie um arquivo chamado dbstore
novo 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
dbstore
volumes montados no contêiner - Monte um diretório de host local como
/backup
- Passe um comando para
/dbdata
o conteúdo do volume para um diretório/backup
debackup.tar
arquivos.
$ 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 /dbdata
um 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 dbstore2
novo 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 --rm
opção. Por exemplo, este comando cria um /foo
volume anônimo . Quando o contêiner é excluído, o mecanismo Docker exclui o /foo
volume, mas não exclui awesome
o 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