Olá, beleza? Continuamos a nossa saga aqui no nosso módulo de Docker. Agora, nós vamos falar sobre um fundamento de imagens que você precisa saber. É muito fundamental que você entenda sobre as camadas. Lá naquela aula que a gente estava usando lá o run, o command, o cmd, o workdir, eu falei o tempo inteiro em camadas para você já se acostumar. A gente vai ver nessa aula, por debaixo dos panos, como que funciona essa ideia de camadas, como que é armazenado ali, como que o Docker utiliza essas camadas para poder otimizar, para poder entregar uma imagem mais eficiente. Então, vamos pegar aqui aquele My Site que a gente tinha criado antes. Eu estou aqui justamente no repositório do My Site, na parte de tags. Então, aqui no Latest, nós temos o Image Layers, que são as camadas dessa imagem. Então, toda a instrução lá naquele Dockerfile acaba gerando camadas. Camadas nada mais são do que subimagens, que vão ter um hash atribuído ali para o nome da pasta, que é um SHA-256, e ali dentro eu vou ter o armazenamento dos arquivos e pastas que foram modificados naquela instrução. Então, se é um run que eu estou executando, que eu instalei o Nginx, então eu vou ter uma sub-imagenzinha com todos os arquivinhos do Nginx que foram instalados. Ah, eu fiz um copy? Então ele vai gerar uma nova sub-imagem com aqueles arquivinhos ali. E sempre essas subimagens são apenas para leitura. E aí, a junção dessas subimagens vai formar a minha imagem, que depois, quando o Docker gerar um container a partir dessa imagem, ele também vai gerar esse container que vai ser subdividido nessas camadinhas para ele poder controlar também o armazenamento das coisas do container. Inclusive, tem como até a gente pegar as modificações de um container e gerar uma nova imagem a partir dele com o comando docker commit. Dá uma olhadinha aí no comando docker commit. E aí ele vai gerar novas camadas, ou uma camada de acordo com as alterações que foram feitas. Então tudo em imagens funciona em camadas. A gente consegue ver isso muito bem ao rodar aqui o build-t. Vamos voltar lá para aquela pasta que a gente estava. 03... Então se eu fizer aqui um build-t, aí ele vai mostrar as seis camadas que eu tenho na minha imagem. Algumas instruções não vão gerar camadas, como o expose e o cmd que estão aqui no final, por isso que normalmente a gente joga eles para o final, mas essas seis camadas, um, dois, três, quatro, cinco, seis, vão gerar todas elas sub-imagens. E aí acontece que, como eu tenho essas sub-imagens, se eu faço uma alteração, por exemplo, agora eu vou expor que é a porta 81, se eu rodar novamente isso, as outras já foram geradas. Eu não preciso regerar novamente, o que faz com que a minha imagem é gerada mais rápido, e também esse reaproveitamento dessas sub-camadas faz com que se eu vou gerar outras imagens que é baseado nessa, baseado no Node, então ele reaproveita esses layers. Então eu tenho essa eficiência para poder gerar uma nova imagem, mas também de armazenamento. Porque se eu estou reaproveitando as camadas entre várias imagens diferentes, eu estou armazenando menos no disco. Pense que você é um image registry da vida, quanto mais você otimizar o disco, é melhor, porque você está tendo redução de custo. Mas vamos voltar ao que estava aqui antes. A gente consegue ver essas camadas muito bem se eu quiser fazer um backup da minha imagem. Eu consigo fazer um docker save, passo o nome aqui da minha imagem, coloco o sinal de maior e aonde que eu quero salvar. Mas na verdade aqui, vamos salvar isso aqui na raiz, porque isso não vai afetar a minha pasta com o git. Então, vou copiar aqui. Ele vai gerar um tar da minha imagem. Está aqui o meu tar. Eu posso gerar uma pastazinha em uma g aqui e fazer um tar xfv apontando aqui para essa pasta. Então, ele vai gerar um monte de coisa. Olha só que interessante. Dentro aqui, então, eu tenho as minhas camadas. As minhas camadas. Tem o manifesto com o JSON que vai mostrar aqui qual é o nome da minha imagem, quais são as camadas disponíveis, e também o outro JSON, que é muito parecido com o que a gente já viu lá do manifesto de imagens, mas aqui ele vai ter o histórico da imagem e algumas outras informações. Eu posso abrir isso aqui com o InRar? Deixa eu pegar... Na verdade, dá para fazer aqui o seguinte, um Explorer aqui, e eu posso abrir isso com o InRar. Olha só que legal. Cada pastinha dessa representa uma camada. A gente vai ver que tem um layer.tar dentro de cada uma, como se a gente tivesse a manifestação dela. Também tem um JSON aqui, que eu posso dar uma olhada nele. Eu tenho informações sobre aquela imagem, então é uma sub-imagem também. Vamos ver o que representa isso aqui. Abre o TAR. Ele tem um etc, um root. Vamos ver o que tem dentro de etc. Não tem nada. Deixa eu ver aqui. Ele tem um sr, então talvez seja a aplicação. Aqui que ele fez o npm install. Foi gerado ali a NodeModules e o package.json. Então, aquele run npm install. Voltando para cá, outra camada, etc. Aqui é o Nginx. Então, a gente consegue perceber justamente a ideia do que foi... que é feito aqui. Então, essa linha gerou aquela nova sub-imagem. Essa linha aqui acabou gerando aquela sub-imagem. Então, são as camadinhas. A gente consegue ver essas imagens geradas fazendo aqui um ls em docker overlay 2 tem que ser com sudo para que a gente consiga ver. Inclusive, vamos fazer com o "-l", que vai ficar com uma visualização melhor. Tem que ser com sudo mesmo, porque está vendo que tudo pertence ao root, então não conseguiria ver os arquivos. Cada uma dessas passas aqui representa a organização dos layers das imagens. Como que a gente consegue encontrar a da nossa imagem? Eu consigo fazer com o inspect. Então, inspect my node. A gente vai ver que no graph driver vai ter aqui o laudir, que são as camadas. Então, se eu pegar essa linha aqui, esse set alguma coisa, esse hash que foi gerado, a gente tem mais. Barra USR, tirei o F. Barra Sourcing, então aqui provavelmente é aquela da NodeMod. Tem App, justamente. Essa aqui foi a que a gente copiou. Essa aqui foi essa linha que acabou gerando aquela partezinha ali então a gente entra isso aqui está no documento que eu coloquei aqui, tá? a gente entra aqui num outro conceito que ele é muito importante, você não precisa entender, ser especialista em nada do tipo, é só saber que ele existe e entender esse funcionamento das camadas. Nós temos um tipo de sistema de arquivos utilizado pelo Docker, que é o Union File System, que ele utiliza para poder gerar os layers dessa imagem e também ele acaba gerando os layers do armazenamento dos containers. Então, nesse Unir File System, o padrão é o Overlay File System versão 2. Hoje, se você utiliza um Docker atualizado na sua máquina, é a versão 2 que tem melhorias em relação à versão 1, mas justamente essa situação de a gente ter suas pastas separadas, imagina que você tem as camadas de leitura, suas pastas separadas, e aí ele consegue montar o sistema de arquivos, a nossa userland ali, mas essas caras continuam separados. Então, a gente tem várias formas de montar. Posso ter... Uma parte do que eu quero montar pode estar num lugar totalmente diferente e ele consegue fazer essa montagem. Então, tudo que a gente tiver ali em overlay 2 são esses layers utilizando o Overlay File System. Por isso que a gente tem que entender que Linux é muito dinâmico, porque a gente tem lá... Eu estou acessando esse diretório aqui, não que ele está representando ali uma estrutura direta ou uma partição mesmo do disco. Ele pode ser uma montagem de vários outros lugares que eu nem tenho ideia do que está acontecendo. Então, se a gente até faz aqui um ls dessa pasta, olha que tem o committed, o diff, o link, o lower e o work. Cada uma das pastinhas dos layers, a gente vai encontrar esse padrão. Você pode dar uma olhadinha lá na documentação, se você quiser ver mais detalhes. Mas ele vai organizando as mudanças e vai... Ele tem um ponto aqui de montagem que ele cria um link para tudo isso e a gente tem ali a imagem e depois ele monta lá o container. Mas de uma forma geral, a questão das layers, elas otimizam o armazenamento no disco e otimizam também a montagem das imagens, montagem tanto em questão do container, mas a criação dessa imagem, fazendo com que ela seja criada mais rápida e também reaproveitando entre imagens diferentes, fazendo com que ela seja criada mais rápida e também reaproveitando entre imagens diferentes, fazendo com que quando a gente faça lá o push, se ele já tem essas camadas que ele organiza com os hashes lá no Image Registry, ele não precisa subir. Então, esse conhecimento aqui é muito importante, pessoal. Então, vamos seguir na nossa saga. É isso aí. E até a próxima.