fala Pessoal espero que todos estejam bem no vídeo de hoje a gente vai falar um pouco sobre docker tá nos próximos dias a gente vai fazer um projetinho ftec onde a gente vai criar o nosso backend criar o front end vai fazer a integração dos dois e a gente vai utilizar docker por isso eu resolvi trazer primeiro esse vídeo aqui de introdução ao docker para quem não conhece né passar a conhecer aí para quem já conhece dá uma revisado nos conceitos aí que a gente vai utilizar no decorrer do nosso próximo projeto aí full stack Beleza eu vou fazer uma breve explicação zinha aqui para vocês do que que que é o Dock Qual o problema que ele se propõe a resolver mas ainda nesse vídeo a gente vai praticar bastante vamos subir aí nossos contêiners Vamos criar nossas próprias imagens personalizadas então fica tranquilo que a gente vai praticar bastante nesse vídeo beleza Bom primeiramente pessoal o que que é o Dock né o Dock ele é uma plataforma open source né de código aberto que facilita a criação e a administração de ambientes né com doc a gente consegue empacotar uma aplicação ou então um ambiente específico dentro de um contêiner beleza esse conceito de contêiner Pode ser que fique meio abstrato mas no decorer desse vídeo vai ficar bem mais nítido para vocês Beleza não se preocupa porque a gente vai passar por isso mais vezes então vamos falar um pouco sobre o problema né então você tá lá na sua máquina e você cria a sua aplicação lá react com node 16 instalado na máquina é sua aplicação vai consumir lá um backend e esse backend vai utilizar uma my SQL na versão 5. 7 Então você tem o node 16 instalado na máquina e o MySQL 5. 7 instalado na sua máquina também que você instalou configurou lá as senhas e tudo mais Beleza você lá codou o seu projeto show de bola o projeto tá funcionando E você trabalha em equipe né então a sua equipe precisa rodar o seu projeto também então você sobe lá o repositório do seu projeto pro github e esse carinha aqui vai lá e clona beleza na hora que ele vai executar o seu projeto quebrou tudo não executou não funcionou como Tinha que funcionar aí o cara vai lá manda mensagem para você pô projeto aí tá tudo errado não funciona tentei rodar aqui não funcionou e você vai lá e diz para ele que na sua máquina funciona né então qual que é o problema né a acontece que ele tá usando versões aqui Diferentes né pro node pro MySQL e por algum motivo sua aplicação não funcionou com essas versões aqui então ele teria que desinstalar e instalar novamente nas mesmas versões que você agora imagina que você tem um projeto maior que tenha várias outras dependências aqui o cara vai ter que desinstalar todas e ficar instalando nas mesmas versões que você e assim o outro membro da sua equipe também ter que fazer a mesma coisa então isso se torna muito Custoso e meio inviável né pessoal e como que a gente consegue resolver esse problema né utilizando o docker então quando a gente estiver trabalhando com docker a gente vai trabalhar da seguinte maneira você vai est trabalhando na sua aplicação react porém ao invés de ter instalado na sua máquina o node 16 e o MySQL 5.
7 você vai apenas subir dois contêiners né um contêiner para rodar o node e outro contêiner para rodar uma skl 5. 7 e você não precisa ter nenhum desses instalados na sua máquina Claro só precisa ter o docker instalado na máquina para ele poder subir os contêiners inclusive você consegue empacotar todo esse ambiente aqui que você montou na sua máquina em um arquivo de configuração e passar todas essas informações juntas empacotadas para outras pessoas poder executar o seu projeto e assim com uma linha de comando Só ele consegue subir sua aplicação subir todos os contêiners que ela precisa para poder executar corretamente beleza e assim seus companheiros aqui de equipe não vão ter que estar desinstalando da máquina deles instalando maisq ou qualquer outra coisa que seja vão ter que ter apenas o docker instalado e subir os contêiners que a sua aplicação precisa para rodar então beleza show de bola né mas como é que eu faço então para rodar um contêiner como que eu faço para criar um contêiner não sei nem o que que é contêiner como é que eu faço para rodar um contêiner com node beleza é muito simples pessoal basicamente A ideia é a seguinte né Vocês vão ter aqui uma imagem base A partir dessa imagem vocês vão criar um contêiner imagina o seguinte quando a gente quer a gente fazer um pen drive bootável do Ubunto por exemplo a gente vai lá no site do Ubunto E baixa uma imagem ISO né do Ubunto Então tá aqui a gente pega essa imagem ISO e a partir dessa imagem ISO o único arquivo a gente consegue criar um pend drive bootável do Ubunto né e não só um né a gente consegue com essa mesma com esse mesmo arquivo iso aqui onde tem a imagem do bunto a gente consegue criar vários e vários e vários pen drives Bá veis aqui funciona da mesma maneira pessoal Então a partir de uma imagem por exemplo aqui eu tem a imagem do node a gente consegue criar vários e vários contêiners para rodar o o nosso node Beleza então aqui se você for perceber bem Você tem uma imagem ISO do Ubunto quando você cria um pen drive bootável e abre lá acessa lá o pend drive né ele tem vários arquivos lá dentro necessários para rodar o buun beleza aqui funciona basicamente da mesma forma Então você tem a imagem do node ao executar essa imagem para criar um contêiner dentro do contêiner vai ter todos os arquivos necessários todas as configurações necessárias para rodar o node Beleza a gente consegue inclusive criar imagens personalizadas né no caso aqui a gente tá rodando uma imagem do node Mas a gente pode criar uma imagem da nossa própria aplicação e criar um contêiner para rodar a nossa aplicação já a gente vai praticar um pouco isso aqui vamos ver tudo isso aqui acontecendo na prática porém tem um detalhe que eu queria falar para vocês logo né como é que a gente consegue se conectar o contêiner o que que acontece pessoal o contêiner ele vai ficar lá rodando em um ambiente isolado então por exemplo pense na seguinte situação você tem uma aplicação lá beleza que você abriu lá no Browser clicou lá no botão e esse botão vai consumir lá um backend que vai buscar dados no MySQL né e o seu backend vai tentar se conectar num MySQL através da porta 3306 3306 é a porta padrão do MySQL tá pessoal mas não se preocupem com o número aqui propriamente dito Beleza então seu backend vai tentar lá acessar a porta 3306 para tentar se conectar no MySQL Beleza então ele vai lá na sua máquina e tenta se conectar na porta 3306 e dá erro ele não consegue se conectar no MySQL mas o que que tá acontecendo né Você subiu lá um contêiner do My skl mas o seu computador não consegue se conectar num MySQL então o que que tá acontecendo aqui acontece que a gente tem que fazer essa ligação aqui entre as portas né Fazer o bind das portas então como eu falei o contêiner ele é um ambiente lá isolado Então você tem que pedir para o contêiner expor uma porta para você ter acesso né então eu coloquei aqui até um quadradinho para simbolizar uma portinha então o contêiner tá totalmente fechado mas a gente configura lá então a gente abre uma porta no caso a porta 3306 do contêiner para que a nossa máquina consiga se conectar com essa porta e acessar aqui o contêiner Beleza então o que é que vai acontecer depois que a gente faz essa ligação entre as portas esse bind entre as portas Quando a nossa aplicação tentar se conectar e acessar a porta 3306 da nossa máquina ela vai ser redirecionada automaticamente pra porta 3306 do contêiner Beleza então no fim das contas o que vai acontecer é que a nossa aplicação vai se conectar lá diretamente com a porta 3306 do o contêiner e vai conseguir utilizar tranquilamente o MySQL e aqui não precisa ser a mesma porta Beleza então no caso eu poderia fazer o bind da minha porta por exemplo 3002 aqui então quando a minha aplicação fizer uma requisição pra porta 3002 a minha máquina que já vai redirecionar ela diretamente pra porta 3306 que o contêiner liberou pra gente vai funcionar da mesma maneira mas se no caso a minha aplicação continuasse aqui na 3306 não ia conseguir funcionar Porque na minha máquina a porta porta 3306 não tá disponível para mim acessar uma SQL tá disponível aqui a porta 3002 que tá conectada aqui com a porta do contêiner então a gente precisa fazer essa ligação aqui entre as portas da minha máquina com as portas do contêiner beleza Isso aqui vai ficar bem mais claro é bem simples não precisa se preocupar vai ficar mais claro quando a gente fizer aqui na prática Beleza então chega de teoria né então chega de falar vamos lá praticar um pouco tudo isso que a gente viu aqui eu vou entrar no meu vscode é eu tenho uma pasta vazia aqui né eu vou utilizar o terminal do vscode Mas você pode fazer rodar tudo no terminal aí normal do seu computador vou rodar aqui no terminal do vs code porque a gente vai fazer algumas coisas aqui n na pasta do projeto depois beleza e detalhe eu vou estar utilizando aqui duas extensões zinhas interessantes que eu recomendo muito que vocês instalem aí também no caso essa aqui do banco de dados e essa outra aqui do docker olha só aqui tá aqui o nome delas então é esse Database client e essa extensão do docker que que Vai facilitar bastante pra gente visualizar os nossos contêiners beleza por enquanto eu vou fazer o seguinte eu vou entrar aqui na extensão do banco de dados e vou tentar me conectar com MySQL para quem já trabalhou um pouco com MySQL essa extensão é a mesma coisa a gente tá utilizando ali por exemplo o MySQL Workbench onde a gente consegue se conectar no MySQL criar banco de dados e as tabelas enfim eu vou utilizar essa extensão porque ela é bem mais simplificada para questões didáticas Ela é bem mais interessante porque não tem tantas funcionalidades assim que a gente não vai utilizar então eu vou clicar aqui na minha extensão eu vou clicar aqui no botão de criar uma conexão e eu vou tentar me conectar com o MySQL Beleza eu vou clicar aqui deixa eu fechar isso daqui aqui por enquanto pra gente ter mais visibilidade aqui beleza essa é a carinha da extensão e aqui a gente passa algumas informações pra gente se conectar com o banco de dados então o host vai ser 127. 0 p0.
1 que é o local host o username que o meu usuário vai ser o Rot mesmo a porta vai ser 3306 que é a porta padrão Aí default do MySQL beleza e a senha eu vou colocar root aqui vou tentar me conectar vamos lá clicar aqui e olha só deu erro de conexão ele não conseguiu se conectar aqui no local host 3306 por quê Porque porque eu não tenho uma MySQL instalado na minha máquina né não tem como ele se conectar no MySQL se uma MySQL não existe na minha máquina mas como a gente viu a gente não vai instalar uma MySQL na máquina a gente vai apenas subir um contêiner com uma imagem do MySQL pra gente conseguir utilizar o MySQL tranquilamente Beleza então como é que a gente vai poder fazer isso aqui pessoal como eu falei a gente vai executar um contêiner com uma imagem do MySQL Mas onde é que a gente encontra essa imagem né Por exemplo na imagem lá do bunto que você precisa baixar para criar um pend drive ável você vai lá no site do bunto E baixa essa imagem isoe beleza aqui no docker a gente tem o docker Hub que é onde ficam várias várias várias imagens o repositório oficial do docker beleza e lá vocês consegue encontrar várias imagens para executar então eu vou entrar aqui no docker Hub tem essa carinha aqui você pode criar uma conta mas não é necessário aqui por exemplo eu quero rodar uma imagem do MySQL Então posso pesquisar por MySQL Beleza Aqui tem várias tá mas aqui ó tem a imagem oficial né tem algumas imagens que tem um selinho aqui oficial do docker Beleza então eu vou nesse primeiro aqui do MySQL e aqui você pode ver que ele já dá um comando aqui ó docker Pool MySQL para você baixar a imagem pro seu computador beleza da mesma forma que você baixa lá a ISO do bund mas ignora por enquanto esse comando aqui aqui eles trazem algumas referências e algum lugar aqui ele traz Como que você executa essa imagem do MySQL né com o docker beleza para vocês subir um contêiner com essa imagem então ele traz aqui até o comando aqui a gente vai utilizar esse mesmo comando mas eu vou passar por Ele para mostrar para vocês que o que que essas flags aqui significam beleza eu só quero mostrar para vocês que aqui dentro do Hub você encontra Praticamente tudo que você quiser quer rodar uma imagem do node pesquisa aqui o node né vai ter lá quer rodar o bunto uma imagem do bunto tá aqui Vocês conseguem encontrar todas as images todas as informações necessárias para rodar elas aí vou voltar aqui pro meu B code e só lembrando que vocês precisam ter o docker instalado na máquina de vocês para fazer a instalação no Linux é bem tranquilo e para quem usa Windows e Mac também possui o docker para desktop que também é bem tranquilo e fazer a instalação então eu não vou passar por isso aqui Mas dá uma pesquisadinha aí que em CCO minutinhos Vocês conseguem instalar docker na máquina de vocês beleza bem Tranquilo então vamos lá continuando eu quero subir um contêiner com a imagem do MySQL beleza eu quero rodar o MySQL em um container para mim poder utilizar aqui na minha máquina Então a gente vai rodar o seguinte comando docker Run para executar aí você pode não é não é obrigatório Mas você pode passar uma Flag traço traço name para dar um nome a esse contêiner Beleza eu vou chamar ele de my MySQL contêiner por exemplo pode ser o nome que você quiser e agora pessoal aqui no mycell eu preciso configurar a minha senha do usuário Rot né vocês podem ver aqui que no docker Hub Olha só my skl ele já diz aqui que você precisa passar aqui ó a a senha do usuário Rot né para poder ter acesso Isso é coisa do MySQL não são todas as imagens que vai ter essa mesma configuração aqui beleza Então dependendo da imagem que você vai rodar ela vai precisar de umas configurações diferentes mas vai tá tudo na documentação aí então aqui no caso do mycell eu preciso passar uma variável de ambiente para setar a sen do meu usuário rot quando a gente vai passar variáveis de ambiente a gente utiliza a Flag menos e Beleza então eu vou passar a variável mais L root password para setar a senha do meu usuário root que eu vou tá igual a root também tá aqui a senha eu escolho então eu vou colocar a root também beleza show de bola e agora vamos vamos fazer só um teste aqui então depois aqui é só a gente especificar Qual a imagem que a gente quer rodar Beleza tem mais alguns detalhes Mas vamos fazer assim por enquanto já vocês vão entender então eu vou rodar aqui a imagem do MySQL se você quiser é uma versão específica por exemplo aqui nesse exemplo a gente estava rodando na na aplicação uma imagem do MySQL 5. 7 então se você quiser especificamente MySQL 5. 7 basta passar aqui dois pontos e a versão 5.
7 beleza vamos deixar desse jeito aqui Vou dar um enter para ele executar aqui e vamos ver o que que vai acontecer olha só ele disse aqui que não conseguiu encontrar a imagem do MySQL localmente Ou seja você não tinha essa imagem Baixada na sua máquina então ele e vai baixar essa imagem lá do docker HUB beleza e aqui ele vai passar por todas as etapas e baixar essa imagem aí na nossa máquina Beleza depois de baixar ele vai executar o nosso contêiner rodando aquela Imagem Beleza então pessoal ele acabou aqui percebam que ele travou aqui o meu terminal né ele tá executando aqui então pra gente poder mexer vou criar outro terminal aqui mas já a gente passa por esses detalhes aqui beleza então eu vou aqui criar um novo terminal e agora a gente consegue visualizar os nossos contêiners como a gente pode rodar aqui por exemplo o comando docker PS para ele listar os nossos contêiners ativos então eu vou dar um enter aqui olha só deixa eu afastar aqui para ter um pouco mais de espaço tá aqui ele trouxe informações sobre o nosso contêiner então ele trouxe o ID do contêiner ele diz a imagem que a gente tá rodando ele diz aqui quando que foi criado o status né então ele tá up a 55 segundos Então tá rodando a 55 segundos e traz aqui também as portas essas portas tem um detalhe mas já que a gente passa por ela também aqui tem um nome né que a gente deu lá MySQL container beleza a extensão zinha aqui do do docker é muito interessante porque a gente consegue visualizar isso aqui fora do terminal a gente consegue ver os contêineres rodando então vou clicar aqui para executar percebam aqui então Ó que ele já lista as imagens que a gente tem na nossa máquina Então a gente tem uma imagem do MySQL e aqui a gente tem o contêiner rodando beleza traz aqui até o o nome que a gente deu Então ela facilita bastante na hora da gente visualizar o que é que tá acontecendo Beleza se eu quiser então pessoal parar esse contêiner como é que eu faço é simples então para rodar a gente usou o docker Run Beleza então para parar a gente vai usar o docker stop e aqui a gente pode pode passar tanto o nome do nosso contêiner quanto o id e aqui detalhe no ID que não precisa digitar todo o ID beleza basta digitar o começo ali que ele já vai identificar o restante do ID no caso eu botar um D3 já que a gente só tem um contêiner que começa com esse ID ele já vai identificar e já vai conseguir parar o nosso contêiner beleza tanto é que se eu dou agora um docker PS para listar O nossos contêiners ele não vai trazer nenhuma informação porque o nosso contêiner tá parado ele não foi removido tá ele só tá parado tanto é que se a gente rodar um docker PS Men A para listar todos os contêiners ele vai trazer aqui o nosso contêiner porém o status agora ele tá parado a 18 segundos beleza e aqui na extensão a gente consegue visualizar também que agora ele tá parado aqui então vamos lá vamos iniciar esse contêiner de novo e vamos tentar fazer a nossa conexão com o banco de dados né então eu posso vir aqui docker start e colocar o id né do nosso container que era D3 ou eu posso vir aqui pela extensão Zinha também clicar com o botão direito clicar em start beleza tanto faz eu vou fazer aqui pelo terminal mas no decorrer a gente vai trabalhar mais com a extensão beleza Então vou dar um docker PS - a pra gente ver aqui as informações do nosso contêiner Então tá aqui o ID dele e vou dar um docker start D3 que é o começo aqui do id beleza então beleza ele já executou aqui para mim e aqui vocês já podem ver que ele tá rodando Beleza então a gente já tem uma skl rodando aqui no nosso contêiner Então vamos tentar fazer a conexão aqui com o banco de dados Beleza deixa eu fechar aqui esse terminal então aqui vai ser a mesma coisa né local host o username vai ser rood a porta 3306 né vocês podem ver aqui no com as informações do nosso contêiner por exemplo docker PS a porta que ele tá rodando né 3306 então tranquilo né tá na porta a gente basta colocar aqui a senha agora que é aquela senha que a gente definiu na hora de rodar o contêiner né que eu coloquei como Rot tentar conectar aqui agora ó Mas deu erro de novo o que que aconteceu então lembra desse detalhe aqui pessoal da porta na nossa máquina não tem nenhum mais Kel executando aqui na porta 3306 né a gente precisa fazer essa ligação entre a porta da nossa máquina e a porta do contêiner Beleza o contêiner aqui ele expôs a porta mas a gente precisa fazer essa ligação para que a nossa aplicação consiga se conectar aqui na porta do contêiner e não da porta da nossa máquina Beleza então vou voltar aqui a gente vai fazer o seguinte eu vou parar esse contêiner aí aqui eu posso parar aqui pela extensão mesmo parar beleza eu vou limpar aqui o terminal a gente pode inclusive remover esse contêiner tá que a gente vai subir um contêiner novo com a configuração nova percebam que é muito simples né caso a gente erre alguma coisa na configuração basta subir um contêiner de novo ten que desinstalar e baixar coisas de novo Beleza então eu posso remover ele por aqui ou então posso dar um docker RM e ID Beleza então acho que é D3 aquele começo e tá aqui fechou vocês podem perceber que até sumiu aqui ele esse contêiner não existe mais mas percebam que a nossa imagem do skl ainda tá aqui então a gente não vai precisar mais baixar ela do docker HUB para executar um contêiner como a SQL beleza basta a gente usar aquele comando para subir o contêiner de novo então vamos lá vamos usar um docker Run eu vou colocar um name aqui de mais skl mesmo beleza eu vou colocar a variável de ambiente então Traço MySQL root password vou colocar a senha como root beleza e aqui é que mora aquele detalhe A gente precisa fazer a ligação entre as portas né se eu quero definir as portas eu coloco a Flag menos P beleza e aqui primeiro eu digito a porta da minha máquina Então quero que a porta 3306 da minha máquina se conecte com a porta 3306 do contêiner Então é isso aqui que a gente faz é simples assim então aqui poderia como eu já tinha falado a gente poderia bindar qualquer porta tá então a porta 1 2 3 3 da minha máquina vai se conectar com a 3306 do contêiner então quando eu fosse conectar aqui no banco de dados eu teria que passar aqui a porta 1 2 33 beleza mas eu vou deixar igualzinho aqui mesmo então a porta 3306 da minha máquina vai est bandada aqui com a porta 3306 do contêiner e aqui eu vou passar uma Flag menos D que é para rodar em background lembra que quando a gente executou isso daqui ele travou o terminal pra gente então passando essa Flag Men D aqui ele vai rodar em background beleza e vai liberar o terminal pra gente é pr isso que serve Então beleza definido isso agora a gente só precisa definir a imagem que a gente vai rodar aqui no caso é a imagem do MySQL 5. 7 Beleza vou dar um enter para rodar olha só percebam que foi muito mais rápido né porque a gente já tem a imagem aqui então ele não precisou baixar de novo e já executou o contêiner aqui pra gente e percebam que ele ficou aqui em background né ele só retornou a hash aqui pra gente então ele executou e liberou aqui o terminal pra gente de novo e aqui na extensão Vocês conseguem ver que ele tá rodando Beleza então será que agora a gente consegue conectar no no mycel vamos lá aqui já tá tudo certo Rot a porta É essa mesmo e a senha é Rot tá então vou tentar me conectar agora beleza se eu clico aqui em conect tá lá conexão feita com sucesso beleza pessoal show de bola a gente consegue utilizar uma SQL que tá rodando no contêiner e aqui a gente consegue então ó não tem nenhum banco de dados né nessa conexão a gente consegue criar banco de dados aqui trabalhar normalmente como se a gente tivesse trabalhando com uma esl instalada na nossa máquina Então vou executar essa cy aqui olha só ele criou um banco de aqui para mim show demais muito simples utilizar uma SQL com o docker beleza pessoal aqui a gente rodou um contêiner com uma SQL né com a imagem do MySQL que a gente baixou lá do docker HUB mas se eu quiser criar uma imagem personalizada pra minha aplicação como é que a gente pode fazer isso É bem interessante também pessoal vamos fazer o seguinte eu tô aqui na pasta do projeto eu vou deixar aqui o MySQL rodando não tem problema nenhum então aqui na pasta do nosso projeto eu vou abrir aqui o terminal eu vou iniciar uma aplicação react tá só pra gente testar eu não vou fazer nada eu só vou iniciar essa aplicação react então eu vou utilizar aqui o npx Create react app ponto que eu já tô na pasta onde eu quero então eu vou criar uma aplicação react aqui pra gente ver beleza ele vai baixar tudo aí aí eu vou dar uma acelerada aqui porque essa parte demora um pouco beleza então ele terminou aqui como vocês podem ver ele já trouxe todos os arquivos todas as dependências já tá tudo instalado node modulos também tá instalado Beleza então aqui no pack json a gente tem um comando Zinho aqui de start para ele executar Nossa aplicação então eu vou Executar a nossa aplicação com esse comando tá só pra gente poder ver então npm start paraa gente ver a aplicação react rodando aqui então beleza pessoal tá aqui a nossa aplicação rodando a aplicação default react aqui a gente não mexeu nada agora imagina a seguinte situação eu quero compartilhar essa aplicação aqui com outra pessoa mas essa pessoa não tem o node instalado no computador só que a gente precisa do node para rodar aqui a nossa aplicação react né a gente precisa poder rodar quando a gente clona lá o nosso repositório a gente precisa rodar o npm install para instalar as nossas dependências depois a gente precisa iniciar a nossa aplicação rodando o npm start mas essa pessoa não tem um node instalado na máquina dela como é que a gente pode utilizar o docker para facilitar esse processo aqui então vou fazer o seguinte vou parar aqui a minha aplicação beleza e agora a gente vai criar uma imagem personalizada para essa nossa aplicação aqui como é que a gente pode fazer isso primeiro de tudo a gente vai criar um arquivozilla file só assim sem sem extensão sem nada beleza então docker file e aqui a gente vai definir algumas dependências alguns passos que a gente vai precisar ter e fazer para rodar a nossa aplicação Beleza então primeiro de tudo então aqui a gente vai definir um front que vai ser a imagem base pra nossa aplicação né no caso a gente vai precisar de uma imagem do node uma imagem do node para rodar a nossa aplicação então a gente diz aqui ó que a nossa nossa imagem da Nossa aplicação vai utilizar como base a imagem do node e aqui a gente pode passar várias versões do node né a node 16 por exemplo tem uma que é bastante utilizado que é o node Alpine que é uma versão Bem mais leve do node que ele traz ali só as funcionalidades mais essenciais Beleza a gente pode utilizar esse daqui mesmo e aqui a gente vai definir agora um work dear tá é um diretório de trabalho então isso daqui costuma confundir as pessoas mas isso aqui é muito simples pessoal por exemplo aqui eu criei uma pasta docker Lon para trabalhar aqui né onde o meu projeto vai ser salvo eu escolhi salvar o meu projeto aqui mesmo na minha pasta Raiz e aqui Criei uma pasta docker Lon beleza Esse workd é basicamente isso é onde você quer salvar o seu projeto aqui você coloca o nome que você quiser beleza e então o docker vai criar essa pasta aqui dentro do contêiner Inclusive essa extensão zinha aqui é bem interessante que a gente consegue visualizar os arquivos de dentro do contêiner por exemplo aqui a gente tem um contêiner do MySQL rodando Beleza vou expandir aqui ó a gente vai ver aqui que tem os arquivos e percebam que ele tem várias partes aqui como se fos os arquivos da máquina mesmo então tem um arquivos de Butt um arquivo de Dev um arquivo home etc arquivo de sistema né de user beleza nesse workd a gente vai definir a pasta que a gente quer trabalhar por exemplo a gente poderia criar uma pasta aqui dentro do contêiner chamada app por exemplo né então a gente poderia botar barra app aqui ou então você quer salvar sua aplicação dentro de uma pasta user aqui do container e app por exemplo Então você só coloca user na verdade usr bar app Beleza então não tem muito segredo aqui nesse work de é realmente só definir a pasta que você quer trabalhar criar uma pasta para salvar ali o seu projeto dentro do contêiner beleza vamos utilizar aqui só mesmo a pasta barra app agora a gente precisa definir aqui alguns passos né Por exemplo a gente tem aqui o arquivo do nosso projeto né quando a gente clona esse projeto pra nossa máquina ele não vem com a node modulos pode ver aqui que a node modul Está excluída do nosso github né aqui no Git Ignore tá aqui a node modules então quando a gente baixar clonar esse repositório ela não vai vir com a node modules então eu vou até deletar aqui pra gente ver o que que a gente tem que fazer então para rodar aqui a nossa aplicação a gente não pode mais dar só um npm start né dar um npm start ele vai dar erro aqui porque ele não encontrou esse script porque a gente precisa primeiro instalar as dependências do nosso projeto então quando a gente roda o npm install ele vai lá no pack de Jason e vai baixar todas as dependências do nosso projeto ó lembra que a gente definiu uma pasta app lá dentro do contêiner beleza e nesse primeiro momento essa pasta app tá vazia né então pra gente executar o nosso projeto dentro do contêiner a gente precisa dos nossos arquivos do projeto então vou fazer o seguinte eu vou copiar aqui o arquivo package Jason beleza lá pra pasta app do Meu Container beleza e aqui a gente pode copiar tanto o package Jason quanto o package Lock então você poderia fazer assim copiar o package Jason pr pra app e copiar o Packet lock. on Jason paraa app Beleza a gente pode também fazer seguinte forma só coloca um asterisco aqui então ele vai copiar todos os arquivos que começam com package e termina com ponto Jason para dentro do nosso diretório de trabalho tendo esses dois arquivos aqui a gente já consegue executar um comando né então a gente consegue executar o Run o npm install que aí ele vai instalar todas as dependências pra gente dentro do contain beleza da mesma forma que a gente estivesse rodando o npm install aqui fora então beleza rodei o npm install instalou todas as dependências para mim agora eu preciso dos Meus outros arquivos né então eu preciso da minha pasta src com todos os arquivos do meu projeto todos os restos dos arquivos depois deu instalar as dependências Então posso fazer o seguinte eu posso copiar aqui agora tudo então ponto e jogar lá dentro da da pasta do meu projeto beleza e aqui a gente pode usar o seguinte pessoal a gente pode utilizar tanto ponto ou botar o nome como eu já tinha colocado ali beleza que ele vai entender aqui que é para jogar na pasta que a gente definiu aqui para trabalhar depois de instalar as dependências eu copiei todos os arquivos do meu projeto para dentro do contêiner e agora a gente precisa expor porta desse contêiner pra gente poder acessar lembra daquele exemplo que a gente tinha que abrir a portinha lá no contêiner para poder ter acesso então é exatamente isso que a gente vai fazer agora então a gente pode expor então expose aqui a porta 3000 tá que é a porta geralmente padrão que roda o react aqui então a gente vai expor a porta 3000 aqui e agora a gente só precisa rodar o comando que a gente utiliza para iniciar a nossa aplicação e aqui a gente vai passar o CMD A única diferença entre o Run e o CMD é que o CMD só pode ter uma vez para cada dockerfile então geralmente é o comando que a gente usa para iniciar a nossa aplicação beleza e aqui a gente vai passar como Array Como assim aqui no r a gente rodou npm instal então cada um dessas palavras aqui seria um elemento do Array aqui no cmd Beleza então o comando que eu utilizei para iniciar o meu projeto react é npm aí aqui eu vou passar o start beleza e ele vai iniciar Nossa aplicação com isso a gente já criou o arquivo docker file para gerar a nossa imagem do nosso projeto Então como é que a gente faz para executar isso daqui vamos aqui na no terminal na raiz do nosso projeto e primeiro a gente vai ter que construir a nossa imagem baseada nesse arquivo aqui de configuração Beleza então como é que a gente faz a gente vai rodar o docker build e aqui a gente passa o caminho do nosso docker file no caso a gente já tá na raiz a gente pode passar só um ponto que ele vai entender que aqui na raiz do projeto existe um arquivo docker file ele vai utilizar esse arquivo para buildar a imagem pra gente beleza e detalhe aqui pessoal que a gente precisa passar aqui o barra aqui na hora do copy tá quando a gente vai passar um arquivo específico aqui a gente precisa passar o ponto barra aqui vai funcionar perfeitamente que ele vai copiar tudo para lá beleza então o único detalhe aqui acrescentar o barra e aqui antes de d a gente consegue passar uma tag uma Flag né menos menos T pra gente dar um nome pra nossa imagem Beleza eu vou chamar essa imagem de meu App por exemplo beleza e agora a gente passa o ponto indicando que o docker file tá aqui na parte do nosso da nossa raiz Beleza então vou dar um enter aqui vamos ver o que que vai acontecer tá lá então ele vai passar por aqueles passos ó Vejam Só que ele tá baixando a imagem do node lá do docker HUB e vai executar todos os passos aqui que ele precisa para baixar essa imagem do node beleza e aqui a gente consegue ver os outros passos que a gente definiu Então o workd a gente definiu barra app beleza aqui agora ele tá copiando o package Jason lá pra pasta do nosso do nosso container e agora ele tá rodando o npm instal e aqui vai acontecer igual quando a gente roda o npm instal na nossa máquina normal né ele vai baixar lá todas as dependências do nosso projeto vou dar uma acelerada aqui porque esse processo também demora um pouco beleza pessoal ele terminou aqui de buildar a nossa imagem beleza vamos ver aqui na extensão perceba que ele não subiu nenhum contêiner tá mas aqui a gente já pode ver que nas imagens que a gente tem no nosso computador a gente já possui uma imagem aqui meu App que foi o nome que eu dei aqui na hora de buildar a imagem né perceba também que agora a gente tem uma imagem do node né porque a nossa imagem do meu App precisa da imagem do node aqui como base para rodar Beleza então agora a gente consegue rodar um contêiner utilizando a nossa imagem tranquilamente eu vou aqui na aplicação se eu atualizo aqui a página percebam que a nossa aplicação não tá rodando então se eu volto aqui ó a gente nem instalou as dependências aqui no nosso projeto no na nossa máquina Eu precisaria rodar um npm Install e rodar um npm start para executar a nossa aplicação Beleza então vamos tentar agora já que a gente já tem a nossa a imagem do nosso projeto Vamos tentar utilizar o docker Beleza então para rodar um contêiner novo a gente coloca docker Run a gente pode pôr um nome aqui então name vai ser o nosso react app Beleza a gente não precisa mais passar variáveis de ambiente igual a gente fez no MySQL beleza lembra daquele detalhe então que o nosso coner vai ser vai liberar a porta 3.
000 né então a gente precisa fazer o bind da porta 3. 000 da nossa máquina com a porta 3. 000 do conen senão não vai funcionar então a gente passa só a Flag menos P aqui pra gente definir as portas então a porta 3000 da minha máquina vai se conectar com a porta 3.