Salve, beleza? Continuamos a saga aqui no nosso módulo de Docker. Agora nós vamos começar a construir nossas imagens. Isso é uma necessidade muito comum. Dado que nós temos várias imagens lá no Docker Hub, várias imagens existentes que têm banco de dados, linguagem de programação, outras ferramentas, a gente vai acabar tendo a nossa necessidade, principalmente com ferramentas e linguagens de programação, de alterar aquela imagem para que o container já tenha arquivos e ferramentas necessárias para que a gente possa trabalhar. Então, vamos aqui para o VS Code para que a gente possa construir uma nova imagem. Nós temos que declarar o que a gente quer dentro dessa imagem, e para isso existe o arquivo Dockerfile, que é o manifesto da nossa imagem. É interessante que você tenha, no caso do VS Code, a extensão Docker, aquela extensãozinha que eu já falei para vocês, que é mantida aqui pela Microsoft, porque ela vai te dar autocomplete, você consegue até pesquisar imagens. Então, acaba tornando o seu trabalho mais produtivo. Então, vamos simular aqui que eu queira distribuir uma imagem que vai ter o Nginx e o meu site. Para qualquer lugar que eu quiser publicar o meu site, já tenho tudo dentro de uma imagem, não dependo de mais nada. Então, a gente sabe que existe uma imagem do Nginx, mas eu vou colocar ali o HTML do meu site para já ficar pronto, subir o container, já estar disponível lá o meu site. Então, o Dockerfile é feito com instruções. Nós temos aqui uma série de instruções, como from, run, copy, expose, cmd, entry point. A gente vai aprender essas instruções nesse capítulo. O from é a primeira delas, é qual é a imagem que nós vamos nos basear. A gente falou que a Docker provê imagens base para você poder começar o seu trabalho. Então, todas aquelas imagens ali, Node, MySQL, Nginx, começaram com alguma imagem. Então, a gente vai herdar, sempre a gente herda de alguma imagem. Eu vou colocar aqui um Nginx. Deixa eu pegar um Nginx que eu tenho aqui na minha máquina. Vou ter aqui esse 119 alpine. A gente falou que o alpine também é uma imagem muito comum, porque é muito pequeno. Quanto menor a imagem, ela é mais rápida para poder carregar, ocupa menos espaço. Então, aqui eu vou me basear nesse dockerfile. E aí, vamos supor que eu queira gerar a minha imagem baseado nesse dockerfile. E aí vamos supor que eu queira gerar a minha imagem baseado nesse dockerfile aqui. Então a gente vai fazer o comando docker build menos t passando o nome da imagem que eu vou chamar de mysite. Então toda a imagem tem que ter um nome, a gente passa esse menos t aqui e o ponto representa aonde que vai procurar o Dockerfile. Então, colocando o ponto, ele vai tentar pesquisar o Dockerfile no próprio diretório que eu estou. Não sou obrigado a trabalhar dessa forma, se eu quiser passar um Dockerfile que está em outro lugar, eu passo "-f", e aponto onde está esse Dockerfile. Inclusive, ele pode até ter um ponto PRO de dev, depois a gente fala sobre essas questões de ambiente. Então, vamos rodar aqui. Se ele não tivesse essa imagem do Nginx na minha máquina, ele iria baixar, e aqui, como ele já tem a imagem do Nginx, está vendo que ele está como cached, a gente vai entender por que ele tem isso, mas é muito rápido, a construção aqui não demorou nem um segundo. Ele pega e gera aqui a nossa nova imagem, que a gente consegue ver com... Como eu tenho muitas imagens aqui na minha máquina, eu vou usar o próprio Grap. Eu já tinha outras versões aqui desse carinha. Vamos, na verdade, fazer aqui um docker rmi-site. Aí eu vou fazer um v1-f, porque tem container associado. Pronto, agora se eu fizer... Aqui eu não tenho nenhuma. A gente vai poder começar do zero. E agora eu tenho uma. Esse latest aqui representa a tag do Nginx, que é 1.19.10. Como a gente não passou a tag, sempre vai ser uma analogia bem simples para poder entender. Como você não tem o seu repositório Git, tem lá o main ou o master, que é sempre a última versão do seu código. Então, a latest tem o mesmo intuito. Aqui é o ID da imagem. Aqui é o tempo de criação dela, dois anos atrás. É porque nós não modificamos nada do Nginx. Então, na verdade, ela é igual ao Nginx. Então, esse Nginx foi criado dois anos atrás. Ele tem 22 MB de tamanho, que é muito pequeno. O Linux Alpine ali não vem basicamente nada. Então, vamos supor que a gente queira pegar esse nosso HTML aqui E copiar para a imagem, para a gente poder rodar esse container Já com esse site que a gente tem Então nós vamos usar a instrução copy Uma vez que eu estou me baseando no Nginx Eu vou copiar o index.html Para um caminho lá dentro da imagem do Nginx Que é o caminho onde fica o HTML Que é o srshare-nginx-html. Beleza. Aí vocês lembram da lição que imagem é imutável? Ah, é aquela imagem que eu criei. Aquela imagem que você criou, você não consegue modificar. Você vai criar uma nova imagem, ou seja, você vai fazer um novo build. Então, aqui ele vai fazer um novo build. Então, aqui ele vai fazer um novo build. A gente vê que agora existe um passo 2 aqui. Nós tínhamos antes somente um passo, agora temos dois que o copy é uma outra instrução para poder gerar essa imagem. Então, ele gera essa imagem em latest, sobrescrevendo aqui a latest que estava antes, mas com isso atualizado. Vamos dar uma rodada nessa imagem? Vou fazer um docker run. A gente já aprendeu a trabalhar com "-rm", "-name", vou chamar ele de mysite1. Vou expor ele na porta 8080 da minha máquina, batendo na 80 do Nginx, e aqui a gente coloca mysite. Pronto. Eu tenho algum container já? Então a gente remove ele aqui. O bom desses errinhos, se a gente aprendeu que containers não pode ter o mesmo nome, né? Olha, ele está falando que está rodando. Acho que eu estou rodando nesse outro terminal aqui. Deixa eu matar ele. Então, vou rodar aqui. Então, eu não rodei com "-d", só para ver o resultado. Eu não vou nem acessar o browser, a gente pode fazer aqui um curve para poder ver o resultado. Então, essa imagem, se eu criar aqui 10 containers, todos vão ter esse mesmo conteúdo do MBA Full Cycle aqui. Aí se eu alterar essa imagem, se eu alterar essa imagem, ou melhor, se eu alterar o arquivo HTML, eu vou precisar gerar uma nova imagem. Então, faço um build novamente. Tá? Aí agora, quando a gente fizer o run, ele vai ter lá o conteúdo alterado. Fazendo um docker image ls, agora a gente tem uma diferença em relação à criação da imagem há 18 segundos atrás, porque como eu tenho uma instrução que altera a imagem que vai ser gerada, ele está se baseando aqui que isso aqui, então, modificou a imagem do Nginx, então agora o tempo de criação foi alterado, mas aqui os bytes até que não. Vamos pensar aqui numa distribuição desse site. Eu tenho o latest como a última versão, mas eu não quero perder as outras versões que eu tenho. Então nós podemos atribuir uma tag na hora de fazer o build. Se eu colocar aqui dois pontos v1, então, na verdade não aqui, porque eu não estou no diretório correto, tem que ser aqui, porque aqui está o meu Dockerfile. Agora eu tenho um v1, ao rodar o ImageLS eu tenho duas tags. Mas observe que o ID da imagem é o mesmo, porque o Docker consolida as camadas da imagem, as camadas são a mesma, então elas vão ser a mesma imagem. É como se eu tivesse lá a última versão do meu código V1, e no main a mesma corresponde a essa versão. Aí eu fiz uma alteração qualquer aqui, então eu vou deixar o meu v1 lá e faço agora o meu v2. Então eu posso rodar o meu container com essa última versão colocando aqui v2. E ao fazer o curr está lá alterado. última versão colocando aqui v2, e ao fazer o cur, está lá alterado. Mas se eu chegar aqui e fizer um v1, a gente não vai ver aquela alteração que foi feita. Então, eu tenho duas versões, e ainda se eu quiser distribuir como a latest, para todo mundo pegar ali como a última versão, nós podemos fazer aqui o build sem passar nada, ou posso colocar a latest também se eu quiser, porque a versão 2 é a última, mas eu coloco ela como latest também. Então, a gente vai fazendo as tags, a imagem é sempre imutável, a gente tem que pensar nisso. Mas vamos supor que eu esteja aqui desenvolvendo e eu queira fazer uma alteração só para poder testar, isso é muito comum. Então, se eu tiver aqui uma alteração que eu não quero fazer o build da imagem novamente, nós podemos usar uma estratégia de volume que eu não vou colocar aqui agora, mas a gente consegue fazer um comando docker cp, que é o copy mas a gente está copiando aqui para o container, aí eu passo o nome do container ou o id dele e qual o caminho que eu quero copiar, tá? Porém, esse caminho aqui, ele só vai funcionar dentro do diretório correto aqui. Porque senão... Agora sim. Então, eu vou colocar isso aqui. Ele copiou lá para dentro. Então, a gente pode passar a execução do bash. Vou poder entrar. MySite1, na verdade. Ah, não tem bash lá, é SH. Então, se eu fizer um ls, um sr, share nginx.html, vai ter lá a página de erro 500 e o index, fazendo um catch, para que o arquivo é alterado. Não é uma forma muito comum, mas às vezes ela pode ser... resolver algumas questões aí. No momento que você vai evoluindo com o Docker, em algum momento você vai acabar utilizando o Docker CP. Mas também é óbvio, se eu estou aqui dentro do container, a gente pode instalar um Vim da vida. Na verdade, aqui eu tenho um APK, né? APK Update, que é o Pine. Posso fazer APK de Vim. E aí eu poderia fazer lá a modificação, que a gente já viu como que funciona isso, né? Nesse caso lá a modificação, que a gente já viu como funciona isso. Nesse caso, a modificação que a gente está fazendo é dentro apenas do container não modificar a imagem. Então agora, ao fazer o Curl, a gente vai ver essa alteração funcionando. Então é assim que a gente vai fazendo as construções, vai fazendo as tags, vai gerando as imagens conforme a gente precisa. Claro que isso aqui é muito simples, mas é o primeiro exemplo, só para a gente poder ter ideia de como que isso funciona. Agora, para a gente poder fechar aqui a aula, deixa eu desfazer esse container aqui. Os containers foram desfeitos porque a gente está rodando o run com o . Mas na hora que eu faço aqui as minhas imagens, eu tiver que excluí-las, se eu fizer assim, mais site, vamos rodar de novo. Então, a tag 1 e 2 ainda existem. Então, a gente precisa excluir aqui a 2, excluir a 1. Se estiver ligado com algum container, tem que passar o "-f", porque ele vai falar que eu não posso ter um container off, uma lei de uma imagem. Agora eu não tenho mais nada. Show de bola, pessoal. Então, vamos evoluir a nossa saga. É isso aí e até a próxima.