Montar um volume para persistir dados
Nesta etapa, você aprenderá como usar volumes Docker para persistir dados gerados e usados por contêineres Docker. Por padrão, os dados dentro de um contêiner são efêmeros; eles são perdidos quando o contêiner é removido. Volumes fornecem uma maneira de armazenar dados fora do sistema de arquivos do contêiner, permitindo que eles persistam mesmo após o contêiner ser parado ou removido.
Primeiro, vamos parar e remover o contêiner my-nginx da etapa anterior.
docker stop my-nginx
docker rm my-nginx
Agora, criaremos um volume Docker. Volumes são gerenciados pelo Docker e são armazenados em uma área dedicada na máquina host.
docker volume create my-volume
Você deve ver o nome do volume (my-volume) impresso, confirmando que ele foi criado.
Você pode listar volumes existentes usando o comando docker volume ls.
docker volume ls
Você deve ver my-volume na lista de volumes.
Agora, executaremos um novo contêiner nginx e montaremos o my-volume no diretório webroot padrão do Nginx dentro do contêiner, que é /usr/share/nginx/html. Isso significa que quaisquer arquivos colocados em /usr/share/nginx/html dentro do contêiner serão, na verdade, armazenados no my-volume no host.
Executaremos o contêiner em modo detached (-d), publicaremos a porta 80 dentro do contêiner para a porta 8081 no host (-p 8081:80), atribuiremos um nome a ele (my-nginx-volume) e usaremos a flag -v para montar o volume. O formato para montar um volume nomeado é volume_name:container_path.
docker run -d --name my-nginx-volume -p 8081:80 -v my-volume:/usr/share/nginx/html nginx
Você deve ver o ID do contêiner impresso, indicando que o contêiner está em execução.
Agora, vamos colocar um arquivo HTML simples no volume montado. Podemos fazer isso executando um comando dentro do contêiner em execução usando docker exec. Criaremos um arquivo chamado index.html em /usr/share/nginx/html com algum conteúdo simples.
docker exec my-nginx-volume sh -c 'echo "<h1>Hello from the volume!</h1>" > /usr/share/nginx/html/index.html'
Este comando executa um shell (sh -c) dentro do contêiner my-nginx-volume e executa o comando echo para criar o arquivo index.html.
Agora, vamos acessar o servidor web na porta 8081 no host para ver o conteúdo do arquivo index.html que acabamos de criar.
curl http://localhost:8081
Você deve ver <h1>Hello from the volume!</h1> na saída. Isso confirma que o arquivo que criamos dentro do contêiner está sendo servido pelo Nginx e, como foi escrito no volume montado, os dados são persistentes.
Para demonstrar a persistência, vamos parar e remover o contêiner my-nginx-volume.
docker stop my-nginx-volume
docker rm my-nginx-volume
Agora, vamos executar um novo contêiner, montando o mesmo volume. Vamos nomear este novo contêiner my-nginx-volume-new e publicar sua porta 80 para a porta 8082 do host.
docker run -d --name my-nginx-volume-new -p 8082:80 -v my-volume:/usr/share/nginx/html nginx
O novo contêiner está em execução e está usando o mesmo my-volume. Vamos acessar o servidor web na porta 8082.
curl http://localhost:8082
Você ainda deve ver <h1>Hello from the volume!</h1> na saída. Isso ocorre porque o arquivo index.html foi armazenado no my-volume, que persistiu mesmo após a remoção do contêiner original. O novo contêiner, montando o mesmo volume, tem acesso aos dados que foram gravados anteriormente.
Isso demonstra o poder dos volumes para persistir dados independentemente do ciclo de vida do contêiner.