Salve, Deus, beleza? Continuando, eu vou passar aqui o nosso módulo de Docker. Na última aula, nós aprendemos a lidar com os volumes, vimos que não é difícil também, mas aquela forma de criar volumes ali, ela é mais utilizada em produção ou quando tem uma situação específica em desenvolvimento que a gente precisa criar. A gente está falando aqui também de necessidades para poder usar o Docker desenvolvendo aplicações. Então, vamos aqui para o VS Code, a gente vai ver uma outra forma de criar volumes que ela vai nos ajudar, inclusive, para a questão de desenvolvimento. Na última aula, nós criamos um volume ali pelo comando e ele é totalmente gerenciado lá pelo Docker. A gente não tem nem acesso a ele, tem que fazer acesso lá com sudo e tudo mais. Então, vou imaginar o caso que do Nginx, se eu estivesse desenvolvendo o site, quisesse testar, como é que eu iria desenvolver ele aqui no meu VS Code? Ou até mesmo uma outra situação em relação ao banco de dados. Estou desenvolvendo. O volume está lá, criado bonitinho, não perco mais. Em algum momento, a gente acaba desenvolvimento, rodando ali um comando para poder excluir o volume, acho que eu já falei aqui do comando docker system prune, acaba matando um monte de coisa, enfim. A gente, a uma hora, acaba limpando o nosso docker. E o volume iria por água abaixo também. Então, existe uma outra forma de criar volumes que ela não é necessariamente para desenvolvimento. Ela existe e ela acaba ajudando em desenvolvimento, mas ela pode ser usada em produção também. Então, vamos pegar aqui o caso do banco de dados. Vamos fazer o seguinte aqui. Vamos entrar. vou fazer o seguinte aqui vamos entrar na pasta aqui da aula beleza deixa eu ver esses outros dois inclusive está até coisa rodando aqui eu não parei da última aula. Então, vamos supor que eu quisesse manter o meu banco de dados, eu vou ter o volume, mas a gente vai ter o banco de dados acessível aqui no nosso projeto, olha só, vamos fazer um docker run. Aí, ao invés de passar aqui um volume, que é esse volume criado automaticamente, nós podemos passar desse lado de cá um caminho de pastas. Eu posso passar, por exemplo, barra home, argem, deixa eu até aumentar o terminal para poder ficar um pouco melhor, argem, etc, etc, etc. E aí ele vai criar, ele vai sincronizar isso lá com o container, então, eu consigo ter acesso local a esses arquivos, mas isso aqui não é muito produtivo, ficar passando esse caminho, vamos su mas se eu quisesse criar aqui nesse diretório exatamente, aí eu posso utilizar a expressão aqui do shell do Linux pwd para poder pegar o diretório aqui dentro do cifrão parêntese, e aí ele vai já pegar esse diretório mas eu não quero colocar nele, vamos colocar assim para um parêntese, e aí ele vai já pegar esse diretório, mas eu não quero colocar nele, vamos colocar assim, dbData. Essa pasta nem existe, detalhe importante dela, ela não existe e o Docker vai acabar criando. Então, vamos dar um enter aqui. Ele vai dar um erro, porque esse caminho que eu estou utilizando aqui, que tem espaço e até uma recomendação, não só pra doc, mas na hora que você estiver desenvolvendo alguma coisa, evite esses nomes de passos que eu estou colocando, porque é aula. Com caracteres especiais. Então, dá pra poder fazer, mas eu vou ter que colocar com aspas aqui, né? Por causa desses... Agora sim, ó. Então, vamos lá. Ele vai criar aqui a pastinha de bebeira. Olha só. Então, a gente tem acesso ao banco de dados. Inclusive, essa pasta aqui, o nosso usuário nem tem permissão nela, vai ter permissão nela, porque ele vai criar de acordo com o usuário padrão ali do container. Mas olha só, o banco de dados está ready for connections. Então, isso aqui é interessante, porque olha só, se eu chegar e parar aqui o meu MySQL, vamos abrir aqui um terminal, D873, ou melhor, docker stop. Se a gente parar aqui, vamos rodar o comando docker ls grep mysql. Não tenho nada. E o ls também, normalmente a gente conseguiria ver que não tem. Não tem nada de mysql. normalmente a gente conseguiria ver que não tem. Não tem nada de MySQL. Então, o volume não está mais autogerenciado pelo Docker. Esse aqui é o volume. Ele está na minha máquina, mas ele está nessa pasta. Ele saiu lá daquele lugar onde ele está. Inclusive, a gente pode até fazer um Docker Inspect. Estou rodando ele aqui novamente. fazer um docker inspect, estou rodando ele aqui novamente, a gente vai ver que agora ele vai ter informação do volume. Está vendo o mount? Ele está montando exatamente esse caminho no destino lá. e está montando exatamente esse caminho no destino lá. Não tem um intermediário. Então, esse é um volume que eu tenho controle. Qualquer momento, se eu quiser, eu posso apagar, apesar dele ter sido criado com permissão de outro usuário, que seja com sudo, eu consigo apagar esse cara. Então, eu posso apagar o meu Docker inteiro, se eu recriar o meu banco de dados, os dados das minhas tabelas e as minhas coisas vão estar aqui. Então, isso aqui também é possível e muito útil para desenvolvimento. Vamos pegar esse Docker Compose da última aula e passar ele para cá. Então, como que a gente faria isso aqui com docker-compose? Eu quero passar .barra db data para o var libmySQL. Então eu não preciso mais desse my volume aqui. Agora vamos parar esse carinha aqui novamente. docker ps docker stop 6f5 Então vou fazer um docker compose up Compose Up. A gente vê aqui que o banco de dados já está Ready for Connection. Então já está pronto aqui também para uso. A gente usa dessa maneira. É sempre bom você colocar o ponto barra. E aqui também, como o diretório tem caracteres especiais, não tem problema que aí ele vai saber identificar. Mas aí, quando a gente bate o olho, a gente sabe, se eu ver que eu não tenho um ponto barra, eu sei que é um volume que está lá totalmente gerenciado pelo Docker, dentro da pasta do Docker. Se eu ver o ponto barra, vai ser um volume que a gente está fazendo um armazenamento local aqui no projeto. Então, saber essa diferença é importante. Eu quero aproveitar para pegar esse readme aqui e mostrar que a gente consegue também declarar um volume pelo Dockerfile, mas como eu já falei, não é muito usual. Se você quiser brincar, você pode trabalhar com essa instrução aqui também. Beleza? Agora vamos pegar aqui então um caso do próprio Nginx. A gente está desenvolvendo não só o caso de Nginx, vamos supor qualquer projeto que você tenha, Java, PHP e tudo mais, o que era ruim antes é que, como que eu vou ficar fazendo edição disso aqui, sendo que eu não tenho nem acesso aos arquivos. Então a gente poderia colocar assim, Nginx, aqui o My Site, por exemplo, e aqui viria .barra mysite, apontando lá para o meu caminho. Então, obviamente, quando eu fizer isso aqui, vamos até colocar um port aqui. Eu quero publicar 8080 na minha máquina, 80 lá do Nginx. port aqui, quero publicar 8080 na minha máquina, 80 lá do Nginx, ao subir isso aqui, se eu tentar acessar, pegar o browser aqui do próprio S-code, se eu tentar acessar, vai aparecer um forbidden, porque a pasta lá agora não tem nada, porque ele vai pegar o que, se eu estou colocando esse volume que eu estou controlando, ele vai pegar o que está aqui e mandar para lá. Então, ele apagou tudo, ele sobrescreve o que vem na imagem. Isso é muito importante de a gente entender. Vamos fazer aqui um docker-compose-exec-enginex-sh. Então, se eu fizer um ls usr share-enginex-html, não tenho nada, né? Mas aí agora se eu chegar aqui e declarar um index.html com um MBA ou cycle, ele está montado consistente, né? De forma consistente, então na hora que eu fizer aqui o ls de novo, ele já vai estar lá. E o conteúdo já vai estar totalmente sincronizado. Então, agora, na hora de acessar aqui, ele vai ter o mba full cycle. Então, quando eu estou desenvolvendo, a ideia é sempre essa, que não é... isso aqui não foi criado para desenvolvimento, A ideia é sempre essa, que não é... Isso aqui não foi criado para desenvolvimento, mas é para ficar fácil esse posicionamento das informações. Porque se eu escrever lá no container, vem para cá, se eu escrever aqui, vai para lá. E aí eu posso matar tudo que eu estou mantendo aqui sobre o meu domínio. Isso é uma outra forma também de trabalhar. Então, nós vimos que esses volumes ali são criados automaticamente e ficam aqui no nosso projeto, mas a gente consegue criar um volume de forma automática com o Docker Compose, por exemplo, somente fazendo a declaração com volumes. Então, eu vou duplicar esse camaradinho aqui, vou chamar ele de... Docker Compose... Volumes Named. Vamos supor que eu queira que o Docker gerencie os volumes para mim, mas eu não quero fazer o Docker volume create. Então a gente consegue colocar aqui volumes. Aqui eu passo db data e nginx. Inclusive eu vou até colocar assim, volume, traço, para não confundir, mas poderia deixar o nome simples, e aqui também. Poxa, mas estranho isso no YAML, porque eu coloco um assim abaixo do outro. Se eu quiser passar opções de driver de armazenamento e outras opções eu posso, mas ele vai usar armazenamento convencional, é o padrão que nós temos. Então dessa forma aqui, eu posso chegar e passar o volume data ali, e para cá o NGINX também. É aquela mesma ideia do volume que a gente criou na última aula, mas a gente vai ver agora. Vamos parar aqui o Docker Compose. Eu vou até aumentar o meu terminal. A gente vai executar docker-compose menos f, aí eu tenho que passar o arquivo. Ele não vai me dar o docker-compose achei que ele ia me dar o autocomplete aqui não me deu, aí eu tenho que passar menos f antes e o up aqui eu estou apontando está errado? é volumes Está errado? É volumes. Ele vai criar o volume, pegando o nome da pasta, mais o nome que você colocou lá. Então, nós temos aqui o mesmo resultado, mas o que é interessante agora ao analisar os volumes gerenciados pelo Docker, vamos colocar aqui um grep 03. 03 criando. Na verdade, é porque eu já tinha outras coisas também em numa outra pasta, mas são esses dois aqui. Então, esses volumes estão gerenciados lá pelo Docker. Aqui se torna fácil para poder trabalhar, mas também tão perigoso, porque se a gente quiser fazer a opção é menos... Se eu quiser fazer um down volumes, ele acaba excluindo os meus volumes. Ele é totalmente gerenciado ali, mas como ele está agora plugado no Docker Compose, nós podemos fazer essa exclusão direta. Mas isso aqui é muito comum quando se faz deploy com o Docker. Já entrou para o Seara que eu não quero colocar aqui nessa aula. Mas a história é bem simples ali, aí a gente vai ligando aqui e eu posso ter outros Dockers Composed com seus outros Dockers Composed com seus devidos volumes. Então, pessoal, vamos seguir a nossa saga. É isso aí e até a próxima.