Aprendendo Docker, parte 6: trabalhando com dados

Na parte de hoje da série de traduções sobre Docker, vamos falar sobre trabalho com dados. Em particular, sobre volumes do Docker. Nestes materiais, constantemente comparamos os mecanismos do Docker com diversas analogias alimentares. Vamos manter essa tradição aqui também. Os dados no Docker podem ser considerados como especiarias. No mundo existem muitos tipos de especiarias, assim como no Docker existem várias maneiras de trabalhar com dados.

→ Parte 1: fundamentos
→ Parte 2: termos e conceitos
→ Parte 3: arquivos Dockerfile
→ Parte 4: redução do tamanho das imagens e aceleração da construção
→ Parte 5: comandos
→ Parte 6: trabalho com dados

Aprendendo Docker, parte 6: trabalhando com dados

Observe que este material foi elaborado usando o motor Docker versão 18.09.1 e a versão da API 1.39.

Os dados no Docker podem ser armazenados temporariamente ou permanentemente. Vamos começar com dados temporários.

Armazenamento temporário de dados

Dentro dos contêineres Docker, é possível organizar o trabalho com dados temporários de duas maneiras.

Por padrão, os arquivos criados por uma aplicação em execução dentro do contêiner são salvos na camada do contêiner que suporta gravação. Para que esse mecanismo funcione, não é necessário configurar nada especial. Isso resulta em uma solução simples e eficiente. A aplicação pode simplesmente salvar os dados e continuar com suas tarefas. No entanto, assim que o contêiner deixar de existir, os dados salvos dessa maneira também desaparecerão.

Para armazenar arquivos temporários no Docker, é possível usar mais uma solução, adequada para situações que requerem um nível de desempenho mais alto do que o que pode ser alcançado com o mecanismo padrão de armazenamento temporário de dados. Se você não precisa que seus dados sejam armazenados por mais tempo do que a vida do contêiner, pode anexar ao contêiner um tmpfs — um armazenamento temporário que utiliza a memória RAM do host. Isso permite acelerar as operações de leitura e gravação de dados.

Com frequência, é necessário armazenar dados mesmo após o contêiner deixar de existir. Para isso, precisaremos dos mecanismos de armazenamento permanente de dados.

Armazenamento permanente de dados

Existem duas maneiras de prolongar a vida útil dos dados além da vida útil do contêiner. Uma delas envolve o uso da tecnologia de bind mount. Com essa abordagem, é possível montar, por exemplo, uma pasta que já existe. Os processos fora do Docker poderão trabalhar com os dados armazenados nessa pasta. Veja como parece a montagem do tmpfs e a tecnologia do bind mount.

Aprendendo Docker, parte 6: trabalhando com dados
Montagem do tmpfs e bind mount

As desvantagens do uso da técnica de bind mount incluem a complexidade no backup de dados, migração de dados e compartilhamento de dados entre vários contêineres. É muito melhor utilizar volumes Docker para armazenamento permanente de dados.

Volumes Docker

Um volume é um sistema de arquivos que está localizado na máquina host fora dos contêineres. Os volumes são criados e geridos pelo Docker. Aqui estão as principais características dos volumes Docker:

  • Eles servem como meios para o armazenamento permanente de informações.
  • Eles são independentes e separados dos contêineres.
  • Podem ser compartilhados por diferentes contêineres.
  • Eles permitem organizar a leitura e gravação de dados de forma eficiente.
  • Os volumes podem ser alocados em recursos de um provedor de nuvem remoto.
  • Podem ser criptografados.
  • Podem receber nomes.
  • Um contêiner pode pré-preencher um volume com dados.
  • Eles são convenientes para testes.

Como você pode ver, os volumes Docker possuem características notáveis. Vamos falar sobre como criá-los.

Criação de volumes

Os volumes podem ser criados usando ferramentas do Docker ou através de solicitações à API.

Aqui está uma instrução no Dockerfile que permite criar um volume ao iniciar um contêiner.

VOLUME /my_volume

Ao usar essa instrução no Docker, após a criação do contêiner, um volume será criado contendo os dados que já estão no local especificado. Note que ao criar um volume usando o Dockerfile, isso não isenta você de precisar especificar o ponto de montagem do volume.

É possível criar volumes no Dockerfile usando o formato JSON.

Além disso, volumes podem ser criados usando a linha de comando durante a operação do contêiner.

Trabalhando com volumes pela linha de comando

▍Criação de um volume

Para criar um volume independente, use o seguinte comando:

docker volume create --name my_volume

▍Verificando informações sobre volumes

Para visualizar a lista de volumes do Docker, use o seguinte comando:

docker volume ls

Para explorar um volume específico, você pode fazer assim:

docker volume inspect my_volume

▍Remoção de volume

Você pode remover um volume assim:

docker volume rm my_volume

Para remover todos os volumes que não estão sendo utilizados por contêineres, você pode usar o seguinte comando:

docker volume prune

Antes de remover volumes, o Docker solicitará sua confirmação para executar esta operação.

Se um volume estiver associado a algum contêiner, este volume não pode ser removido até que o contêiner correspondente seja excluído. Além disso, mesmo que o contêiner tenha sido removido, o Docker nem sempre reconhece isso. Se isso acontecer, você pode usar o seguinte comando:

docker system prune

Este comando é destinado a limpar recursos do Docker. Após a execução deste comando, você deve ter a possibilidade de remover volumes cujos status foram determinadamente reportados como incorretos.

As flags —mount e —volume

Ao trabalhar com volumes, frequentemente você precisará usar as flags ao invocar o comando. dockerPor exemplo, para criar um volume durante a criação do contêiner, você pode usar a seguinte construção:

docker container run --mount source=my_volume, target=/container/path/for/volume my_image

Antigamente (antes de 2017), a flag --volumeera popular. Originalmente, essa flag (que ainda pode ser usada na forma abreviada; nesse caso, aparece como -v) era utilizada para contêineres autônomos, enquanto a flag --mount era usada no ambiente Docker Swarm. No entanto, a partir do Docker 17.06, a flag --mount pode ser usada em quaisquer cenários.

É importante ressaltar que ao usar a flag --mount a quantidade de dados adicionais a serem especificados no comando aumenta, mas, por várias razões, é melhor usar essa flag em vez de --volume. A flag --mount — é o único mecanismo que permite trabalhar com serviços ou especificar parâmetros do driver de volume. Além disso, é mais fácil trabalhar com essa flag.

Nos exemplos existentes de comandos voltados para trabalhar com dados no Docker, você pode encontrar muitos exemplos do uso da flag -v. Ao tentar adaptar esses comandos para sua situação, leve em consideração que as flags --mount e --volume usam diferentes formatos de parâmetros. Ou seja, não é possível simplesmente substituir -v para --mount e obter um comando funcionante.

A principal diferença entre --mount e --volume é que ao usar a flag --volume todos os parâmetros são agrupados juntos, em um único campo, enquanto ao usar --mount os parâmetros são separados.

Ao trabalhar com --mount os parâmetros são representados como pares de chave-valor, ou seja, isso parece com chave=valor. Esses pares são separados por vírgulas. Aqui estão os parâmetros frequentemente usados --mount:

  • tipo — tipo de montagem. O valor para a chave correspondente pode ser bind, volume ou tmpfs. Aqui falamos sobre volumes, ou seja, estamos interessados no valor volume.
  • source — fonte da montagem. Para volumes nomeados, isso é — o nome do volume. Para volumes não nomeados, essa chave não é informada. Ela pode ser abreviada para src.
  • destino — caminho onde o arquivo ou pasta é montado no contêiner. Essa chave pode ser abreviada para dst ou alvo.
  • readonly — monta um volume que é destinado somente para leitura. Usar essa chave não é obrigatório, nenhum valor é atribuído a ela.

Aqui está um exemplo de uso --mount com muitos parâmetros:

docker run --mount type=volume,source=volume_name,destination=\/path\/in\/container,readonly my_image

Resultados

Aqui estão alguns comandos úteis que podem ser usados ao trabalhar com volumes Docker:

  • docker volume create
  • docker volume ls
  • docker volume inspect
  • docker volume rm
  • docker volume prune

Aqui está uma lista de parâmetros frequentemente utilizados para --mount, aplicáveis ao comando do tipo docker run --mount my_options my_image:

  • type=volume
  • source=volume_name
  • destination=\/path\/in\/container
  • readonly

Agora que concluímos esta série de materiais sobre Docker, é hora de dizer algumas palavras sobre para onde aqueles que estudam Docker podem seguir em frente. Aqui um ótimo artigo sobre Docker. Aqui um livro sobre Docker (ao comprar este livro, procure obter a edição mais recente). Aqui outro livro que será adequado para aqueles que acreditam que a prática é a melhor maneira de aprender tecnologias.

Prezados leitores! Quais materiais sobre Docker você recomendaria para iniciantes?

Aprendendo Docker, parte 6: trabalhando com dados

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster