Salve, das Beleza! Continuando a nossa saga aqui no nosso módulo de Docker. Na última aula, nós configuramos ali um ambiente de desenvolvimento, vimos algumas boas práticas e dicas, e o objetivo que é criar um container que seja propício para poder desenvolver aplicações. Nós não estamos preocupados com publicar essa aplicação em produção, que daqui a pouco a gente vai ver que um Dockerfile vai ser totalmente diferente. A ideia já é outra, é otimizar as ferramentas, usar a menor imagem possível, enfim. Mas nessa aula nós vamos ver uma extensão do VS Code que eu falei lá atrás, lá nas primeiras aulas, se eu não me engano, quando a gente começou a trabalhar com o Docker. Eu mostrei duas extensões ali no VS Code que seriam legais para ter uma boa integração com o Docker. A primeira delas é a própria extensão Docker mantida pela Microsoft, daquele autocomplete lá no Dockerfile, também no Docker Compose, mas tem o DevContainer, que a gente vai trabalhar nessa aula. Então, se você quiser brincar com essa extensão, vou relembrar mais uma vez, você pode instalar o DevContainer aqui. Vamos pegar essa aplicação, eu copiei ela para a nova aula aqui, a mesma aplicação que nós fizemos na aula passada, ela está bem legal, com o Dockerfile, com o Zshell, tem aqui as ferramentas que são úteis para desenvolvimento, mas quando eu abro, eu estou usando o exemplo aqui do caso do VSCode, eu estou usando o exemplo aqui do caso do VS Code. Aí eu rodo isso aqui. Aí vamos supor que eu tenho algumas extensões instaladas aqui no meu VS Code que vão depender de enxergar o container, de ver ali a versão do Node que eu estou rodando especificamente, de ver questões lá dentro. As extensões aqui só vão enxergar o meu WSL, vão enxergar o meu Windows, meu Linux aqui. Então, existe essa deficiência no caso do VS Code. Outras ideias, porque eu não tenho ideia de como se comporta muito, mas normalmente quando você faz a integração com o docker, muitas coisas também acabam não, algum plugin que você coloca ali na IDE, ele não consegue enxergar lá dentro do container. Outras já conseguem fazer isso, mas no caso do best code, a extensão não consegue enxergar. Então, a ideia do Dev Container é justamente instalar um VS Code dentro do container. Eu não sei se vocês sabem que o VS Code funciona numa arquitetura cliente-servidor. o VS Code funciona numa arquitetura cliente-servidor. Então, esse camaradinho que a gente está rodando aqui, a interface gráfica é o cliente, e nós vamos ter um camaradinho, você pode olhar na sua pasta de usuário, que tem um VS Code server. Então, o que o DevContainer vai fazer é vai jogar um VS Code server dentro do container, ele vai instalar também várias ferramentas básicas para desenvolvimento por padrão. Tem você pedir, o que é legal, na verdade, porque ele habilita o Curr, Git. A gente vai conversar sobre isso no decorrer aqui da aula. Então, é como se o VS Code estivesse rodando lá dentro do container. E aí todas as nossas extensões têm acesso irrestrito lá ao ambiente do container. Então, a ideia é justamente essa. Hoje, o DevContainer, que é mantido na Microsoft, já disponibiliza opções de, ah, quero instalar um VShell, então ele já dá essa disponibilidade também, além dele já fornecer um ambiente padrão para você poder desenvolver. Então, vamos supor que você não quer criar aqui o seu Dockerfile para a sua linguagem de programação, não tem tempo para isso, ele já vai ter ali uma imagem para as suas principais linguagens de programação, então tem Java, Python, Golang, PHP, Node. Vamos dar uma brincadinha aqui com ele. A gente faz aqui o comando do VS Code, faz o Open Folding Container. Aí, ele está perguntando aqui qual que é a pasta, eu vou colocar essa aqui por enquanto, porque aí ele faz aqui uma pergunta. Opa, consegui identificar. Ele pega um Dockerfile ou um Docker Compose que você já tenha, ou você pode escolher aqui uma pré-definição dele. Então, ele te dá ali imagens mais básicas como o Alpine, como o Debian, mas lembrando, ele já te dá uma série de ferramentas para desenvolvimento, o terminal, ele já acrescenta ali cores e mais um monte de outras coisas. Mas desenvolvimento, terminal, ele já acrescenta cores e mais um monte de outras coisas, mas se a gente colocar aqui show all definitions, se eu quiser uma imagem Golang, eu tenho Golang, eu tenho Java, Python, .NET também a gente vai ter, inclusive .NET que tem várias opções, inclusive já vem ali uma imagem com SQL Server, com Postgres, tem Inclusive já vem ali uma imagem com SQL Server, com Postgres, tem Ruby também. Enfim, tem linguagem aqui para tudo que é gosto. Essas imagens são mantidas pela Microsoft. São imagens bem maiores justamente porque o objetivo é desenvolvimento. Você não vai usar essas imagens aqui em produção. Então você pode pegar um projeto zerado que você tenha na sua máquina e habilitar isso aqui. Você vai colocar ali o diretório. Ele já configura tudo para você e já abre ali. Então, isso é bem legal. Mas a gente vai fazer aqui, na verdade, a gente vai pegar exatamente essa pasta AppNode.js aqui para poder trabalhar. Então, vamos fazer aqui pra poder trabalhar, tá? Então, vamos fazer aqui um open folder. Aí eu quero abrir, na verdade, essa aqui e essa aqui. Quero que ele abra o meu projeto todo ali. Então, eu vou dar um ok. Aí, ele vai perguntar, você quer usar alguma imagem pré-definida? Ele já identificou ali o meu Docker Compose Dev. Aí tem um detalhe que eu lembrei agora que eu tenho que fazer, como o WSL não está trabalhando com o IPv6, na hora que ele vai instalar algumas coisas lá dentro do container, ele puxa usando o IPv6, então a gente tem que desabilitar a primeira vez só quando eu habilito no projeto. Então, eu vou puxar aqui essa janelinha. Essa é a dica somente para quem está no Windows. Então, desabilita aqui a princípio. Aí, eu vou selecionar Docker Compose Dev YAML. Lembrando que isso aqui, se você não fizer, aí no caso do WSL, na hora que iniciar ali vai dar um erro. Pode ser que futuramente, não sei até quando, essa aula vai ser verdadeira nesse ponto, que a Microsoft às vezes pode habilitar IPv6 no WSL, mas no momento que eu estou gravando aqui, em 2023, não está. E acredito que pelos próximos bons meses também não vai estar disponível. Aqui ele vai perguntar qual o serviço que eu quero rodar ali como projeto. Ele vai acabar levantando o DB, que é o banco de dados, porque ele está ali no Docker Compose, mas é o app que eu quero levantar. Aí aqui eu posso selecionar vários plugins, coisas que vão acabar instalando ferramentas ali dentro da imagem que vão servir no container, como auxiliares para o nosso desenvolvimento. Inclusive a gente pode fazer uma coisa aqui antes de eu seguir, a gente não vai precisar mais disso. Eu posso tirar aqui o wget, que eu não vou precisar, porque eu já dá para poder fazer o download. O zshell, ele já consegue colocar para a gente. Então, vou imaginar um cenário aqui que você tem um projeto, todo mundo usa o vfcode, aí você pode deixar que ele faça a configuração do zshell. Essa configuração aqui, que eu tinha colocado na aula anterior, é mais através de várias ideias que você quer disponibilizar um ambiente padronizado. Mas todo mundo usa o VS Code, então cabe aqui muito bem. Então, vamos lá. Aí eu tenho que selecionar aqui a última pasta, terceira aula, aqui. Aí ele vai identificar o Docker Compose Dev, e a gente vai colocar aqui ZShell. Eu gosto de habilitar essa aqui que são ele vai instalar alguns plugins do ZShell, o Common aqui, os utilitários, os padrões que vai habilitar o ZShell, vai configurar com o usuário no root, e o histórico dos comandos que a gente vai digitando, então ele vai dando ali, ele vai guardando tudo, e aí eu consigo ter um auto-complete, uma experiência bem melhor. Beleza, então vou dar um ok, não quero fazer mais nenhuma configuração, então agora aqui, ele vai criar uma pastinha dev container aqui na raiz do projeto. Essa pastinha você mantém, ela é um controle de versão, então todo mundo vai conseguir só baixar para o VS Code ali e rodar o dev container e vai abrir tudo bonitinho lá. Aí aqui ele vai instalar uma série de coisas, ele fica baixando ali umas ferramentas, na verdade, do lá do GitHub, que tem várias imagens. O GitHub também tem um repositório de imagens, eu já tinha falado disso. Agora aqui, eu vou colocar para abrir a questão é porque a gente tem o home node aqui e ele vai ter a pasta... uma opção seria a gente colocar a workspace home node app, que é o workgear lá deixa ele abrir aí. Eu tenho só o projeto aqui, ele vai descartar aquela parte que tinha o volume do banco de dados, então seria uma opção para trabalhar. Mas o problema é que a gente perde acesso ao DevContainer. Vamos retornar para o projeto aqui. Então ele sobe o container automaticamente. Se eu fizer um Docker PS, ele está rodando ali ainda, eu vou fazer um Docker Stop aqui para poder parar tudo. Então, vamos fazer uma configuraçãozinha aqui. Nesse caso, como eu tenho aqui o project que está aqui, ele pegou somente essa parte, ele colocou Workspaces aqui. No caso do diretório, eu vou colocar aqui barra home, barra node, barra app, que é o lugar que a gente quer pegar, mas aí ele cria um outro Docker Compose que ele vai juntar. A gente consegue ter vários Dockers Composes que são mesclados. Então, aqui ele está configurando um novo volume para poder habilitar uma pastinha chamada de Workspaces. Então, a gente consegue pegar tudo o projeto. Aí eu posso colocar aqui um nome também, tipo MyAppNode.js, porque aí serve, ele vai aparecer aqui embaixo, não sei se vocês viram quando ele abriu, ele aparece aqui. Inclusive, deixa eu voltar o meu IPv6, que não tem necessidade mais de ficar desabilitado. IPv6 volta para cá. Fizemos as modificações. Agora, deixa eu pegar uma outra modificação, que é uma configuração adicional que a gente pode passar aqui nos plugins, para ter uns plugins melhores, para justamente trabalhar com o autocomplete. Eu tenho essa configuração aqui. Então, eu vou sobrescrever esses SH plugins. Então, eu vou pegar aqui o plugin de Git, GitFlow, aí você vai ter ali uma ajuda, porque veja só, você vai usar diretamente o terminal do container. Eu vou abrir isso daqui a pouquinho. Aí esses três plugins aqui é para melhorar o autocompletar ali do terminal. Então como eu fiz uma mudança nesse JSON, a gente faz aqui o rebuild e reopen. aqui o rebuild e reopen. Aí eu vou pedir para... O problema é que eu tenho tanta pasta, se fosse num projeto normal, aqui é para definição, não quero, tem tanta pasta aqui. Deixa eu ver se eu consigo identificar. Eu só vou ter que abrir diretamente a pasta. Eu vou ter que abrir a pasta aqui, pessoal. Deixa eu abrir. Aqui, Docker. Aí vai ser o CAP. Oito. Aula três. aqui docker, aí vai ser o cap 8, aula 3 e o app node. Então a gente abriria, estaria ali só com a pasta do projeto, né? Ali o dev container na raiz, aí agora eu posso fazer o rebuild aqui, que não vai ter problema. Então, no caso do rebuild, ele destrói o container, vai recriar a imagem de novo, aqui a gente vê os logs, e às vezes você pode ter feito alguma coisa errada, ele pode não ter conseguido subir, então ele mostra os erros aqui. Então, vamos lá. Ele vai instalar, aqui ele está compilando a imagem, ele está fazendo lá aquele update, o update. Mas ele instala várias coisas também para deixar o container propício para desenvolvimento. Aqui ele já está fazendo algumas coisas aqui na pasta temporária. Vamos aguardar o resultado dele aqui, que não deve demorar muito. Eu não vou cortar o vídeo para a gente poder ver como funciona todo o processo aqui agora sim ele está para finalizar, está vendo? ele está pegando os plugins do ZShell que a gente colocou e agora está terminando de levantar. A gente fez essa configuração que levantou. Agora eu consigo abrir o terminal lá direto do container. Aí ele abriu aqui somente o nosso projeto. Agora eu vou fazer a última configuração aqui. Cuidado que às vezes ele pode deixar o container aberto, aí você pode matar a execução dele. Você pode fazer um docker-compose-down aqui na raiz. Eu quero que ele pegue todo o projeto, então na verdade eu vou colocar aqui que a minha workspace folder vai ser workspaces porque a gente está criando um outro volume compartilhando todo o projeto. Então vamos ver como é que vai funcionar isso aqui. Então eu vou fazer o rebuild como eu fiz essa modificação aqui. Toda vez que eu faço modificação no JSON eu tenho que fazer rebuild. Para eu poder adequar as informações. Eu tenho outras configurações que eu posso passar também. Aqui. Ele vai fazer o processo de novo. E aqui está o resultado. Então, ele pegou a pasta app node, então eu tenho todo o projeto e o project aqui. Mas, olha só que interessante quando a gente abre aqui o terminal. Eu estou no volume workspaces, que acaba tendo o projeto que eu compartilhei. Se eu vou para home barra node barra app, aí ele vai ter somente daqui para cá. Então, aí você pode escolher a forma de trabalhar. Essa configuração ficou dessa forma justamente por conta que a gente está colocando aqui o project e o Dockerfile está aqui dentro e eu tenho configurações de Docker aqui fora. Então, aí acaba ficando dessa forma para ficar mais acessível que o DevContainer. É bom que a gente tenha acesso a ele, faça aqui configurações, porque senão eu estou aqui no estado de estar conectado dentro do contexto e eu tenho que voltar lá para o projeto no modo normal para poder fazer edições. Tudo bem que com o passar do tempo você não vai ficar fazendo edições isso aqui toda hora, mas enfim, isso já virou as duas formas de trabalhar. Às vezes não precisa fazer essa configuração mais específica, você passa aqui o seu workdir, igualzinho o seu workdir, e aqui, se você quiser fazer igual o seu workdir, vou até deixar como que ficaria, você coloca .2. barra home, barra node, barra app, cached. Já está vendo aqui o cached? A gente já falou dele, porque como a gente quer deixar o container no modo read only para o volume as edições vão acontecer somente na nossa máquina você pode deixar dessa forma aqui e colocar aqui também, que seria a configuração mais direta, o workspace é apenas uma pasta que ele está criando ali para poder montar melhor essa opção de montagem. Mas, então, como a gente tem esse terminal, eu sempre abro o terminal do container, a gente teria que fazer o controle de versão, trabalhar com o Git, sem voltar lá para o projeto original para a nossa máquina. Então, tem que trabalhar com o Git aqui sem voltar lá para o projeto original para a nossa máquina, então tem que trabalhar com Git aqui. Ele instala o Git dentro do container e ele compartilha as configurações do Git da sua máquina com o container. Então, eu posso fazer aqui os meus commits, normal, fazer pull, push, vai funcionar tudo bonitinho. Você até consegue fazer, se você estiver trabalhando com Git mais chaves e GPGs, para poder ter mais segurança, você consegue também, mas é necessário fazer mais uma pequena configuração na imagem. Eu tenho um vídeo disso no canal Full Cycle, você pode dar uma pesquisadinha de GPG com Dev Container, que vai cair lá. Então, a gente tem esse ambiente totalmente dentro do container, qualquer extensão vai conseguir enxergar. Nós levantamos a aplicação automaticamente, não precisa mais fazer docker compose up. Acaba se tornando uma opção bem interessante. Além disso, eu consigo colocar aqui, por exemplo, customizations, VS Code. Aqui eu consigo... Sabe aquele settings.json que fica aqui na raiz do projeto, que define opções ali de como o VSCode vai se comportar, eu consigo colocar opções e também extensões padrões. Porque quando a gente tem esse ambiente dentro do container, algumas extensões você teria que instalar de novo, principalmente essas de linguagem de programação, algumas específicas. Então, você já pode colocar o ID da extensão aqui. Todo mundo que iniciar o DevContainer ali, o BSCode abaixa aquela extensão. Então, você pode colocar extensões básicas para poder trabalhar ali com aquele projeto. Então, você vai unificando mais o ambiente de trabalho. Além disso, você consegue chegar aqui e colocar extensões comuns. Todo container que iniciar, eu quero que coloque essas determinadas extensões. Então, eu tenho as minhas aqui. Eu tenho o Co-Pilot, alinhamento de código, que é o Prior, que está por aqui. Está aqui o Prior, que está por aqui. Está aqui o Prior. Git Lens, enfim. Então, isso aqui é muito bom. E é uma extensão relativamente nova. A Microsoft cada vez... Isso aqui é novo. A Microsoft cada vez mais tem dado um cuidado melhorado, adicionado novas features. Eu utilizo basicamente o DevContainer para qualquer projeto que eu queira trabalhar. Se eu estou trabalhando com outras pessoas, elas podem usar a ideia delas também, isso não impede. Então, está aí uma boa opção para você poder trabalhar com o Docker, mas a princípio, se você estiver estudando o Docker, cuidado para usar o dev container, porque ele abstrai grande parte do trabalho ali e vai tirar o seu contato com os comandos, que é importante. Então, pessoal, fechado esse capítulo, agora vamos para o último, que é criar imagens otimizadas para a produção. Então, é isso aí. E até a próxima.