Olá! Me chamo João Victor e serei o seu instrutor ao longo deste curso de Kotlin: preparando a aplicação para Cloud.
João Victor é uma pessoa de pele clara, olhos castanhos escuros e cabelos pretos curtos, usa bigode e cavanhaque. Veste um moletom branco com a sombra de um felino, em preto. Está sentado em uma cadeira e, ao fundo, há uma parede branca com uma iluminação azul gradiente com dois quadros, à direita.
Caso tenha curiosidade em saber como fazer o deploy da nossa aplicação em um ambiente clusterizado, você está no curso certo.
Neste curso, vamos aprender desde a dockerização da aplicação até o momento de executar o deploy na cloud, em um provedor de cloud usado por grandes empresas.
No projeto, criaremos o Dockerfile da aplicação para conseguirmos criar uma imagem para subirmos a aplicação em um Container Docker.
Dockerfile: criação de imagem para subir aplicação em container Docker.
Além de dockerizar a aplicação, vamos orquestrar os Containers. Isso porque trabalharemos com uma aplicação que se comunica com o Redis que, por sua vez, se comunica com o MySQL. Tudo isso deve ser orquestrado através do Kubernetes.
Também criaremos um cluster Kubernetes localmente, ou seja, na nossa máquina. Não vamos precisar subir a aplicação e os containers direto para um provedor de cloud. Conseguiremos fazer todo o teste local, isto é, fazer o acesso à aplicação e garantir que está seguro para subir para a cloud.
Quando estiver pronto, subiremos a aplicação para o OpenShift. Nele, conseguimos visualizar a nossa aplicação com os recursos sendo executados na cloud por uma topologia que fica interessante ao ser finalizada.
Além disso, vamos visualizar a nossa aplicação com toda parte de observabilidade. Para isso, trabalharemos com Spring Actuator, com Grafana e com o Prometheus.
É um curso completo para quem quiser se atualizar para o mercado de trabalho usando ferramentas que grandes empresas usam para seus produtos e serviços.
Caso tenha se interessado, te espero nos próximos vídeos. Até mais!
Finalizamos a parte de desenvolvimento da aplicação, conseguimos fazer a requisição HTTP usando o Retrofit, usamos Coroutines para requisições assíncronas e criamos os testes de unidade com o Co-Teste. Agora, vamos preparar a aplicação para o deploy no ambiente de produção.
Atualmente, na arquitetura de microsserviços e aplicações em cloud, é comum mencionar Aplicações Cloud Native.
A Cloud Native Computing Foundation, é um projeto fundado em 2015 pela Linux Foundation, para contribuir com o avanço da tecnologia de containers e alinhar o setor de tecnologia em torno de sua evolução Wikipédia - Cloud Native Computing Foundation .
Ou seja, é uma fundação que traz recursos que uma aplicação de microsserviço precisa ter para ser considerada uma aplicação implantada com as melhores práticas na cloud.
Um conceito sobre o que é a Cloud Native Computing Foundation que gostaríamos de destacar, é sobre a tecnologia de contêineres.
Na atualidade, falamos bastante em boas práticas, mas não conseguimos ter uma aplicação implantada de forma eficiente na cloud sem usar contêineres.
Há diversas maneiras de criarmos contêineres, temos vários recursos que fornecem tecnologias para gerar contêineres. O mais popular dentre eles, é o Docker .
Muitos confundem o Docker com um contêiner. Porém, ele é um ambiente que auxilia na criação e execução de contêineres. Assim como o Docker, temos outras ferramentas que podem substituí-lo para ser um ambiente de criação e execução de contêineres.
Já usamos o Docker na nossa aplicação para subir os recursos, como o Redis e o MySQL. Isto é, ao invés de instalar o MySQL na máquina, subimos um contêiner rodando um Docker e, com isso, comunicamos a nossa aplicação com esses recursos.
Introduzimos todo esse conteúdo porque, para termos um deploy eficiente da aplicação em produção, precisamos criar o contêiner da aplicação.
Apesar de usarmos o MySQL e o Redis como contêiner, a aplicação em si, continua sendo rodada localmente através do botão de play "▶" da IDE. Assim, fazemos a comunicação com os contêineres. O ideal é termos um contêiner da aplicação, para conseguirmos subir para produção.
Fazemos isso gerando uma imagem da nossa aplicação. Para isso, criamos um arquivo descritivo, em que inserimos uma série de comandos. Assim, depois conseguimos construir essa imagem para ela posteriormente virar um contêiner e a implantarmos em um ambiente produtivo.
Agora, vamos iniciar a construção do arquivo descritivo para conseguirmos construir a imagem da aplicação. Para tal, do lado esquerdo do projeto, selecionaremos a pasta car-service
e clicaremos com o botão direito do mouse. Será exibido um menu com algumas opções, clicaremos nas opções "New > File".
No pop-up seguinte, intitulado "New File", temos um campo para digitarmos o nome. No caso, o nome do arquivo descritivo será "Dockerfile". Após escrever o nome, selecionaremos a tecla "Enter" para criar.
Perceba que já foi gerado um arquivo Dockerfile
do lado esquerdo, na raiz do projeto. No arquivo que acabamos de criar, vamos descrever os comandos que ele precisa executar.
Ao nos referirmos a uma imagem Docker, estamos nos referindo ao arquivo que vai ser executado para criar o nosso contêiner. Este, deve ser auto-contido.
Por exemplo, é necessário que a aplicação car-service
esteja em um contêiner e, dentro dele, é preciso termos tudo o que a aplicação precisa. Ou seja, o JDK (Java Development Kit), os comandos que serão rodados no momento de subir o contêiner, entre outras instruções.
Por precisarmos do JDK, vamos definir o ponto de partida do arquivo Dockerfile
usando uma imagem que vai ser a imagem do OpenJDK. É importante essa imagem estar no contêiner para conseguirmos rodar a aplicação.
Por isso, iniciaremos o arquivo usando o comando from
para definir esse ponto de partida da imagem, e criarmos o dockerfile. Utilizaremos uma imagem em Java já existente na imagem da aplicação.
Assim, no momento de construirmos o contêiner, essa imagem do JDK já estará junto com a imagem da aplicação. Consequentemente, a aplicação será executada com sucesso. Como precisamos usar a imagem JDK e estamos com o Java na versão 17
para a aplicação, usaremos o JDK também na versão 17
.
O instrutor já possui a imagem JDK copiada. Mais adiante no curso, ele irá mostrar onde encontrar essa informação.
Dockerfile
FROM openjdk:17-jdk-slim-buster
Com isso, estamos pegando uma imagem do openJDK, sendo a 17 jdk slim buster
. Na linha seguinte, definiremos o expose
na porta 8080
. Nesse comando, não estamos especificando que a aplicação está rodando no contêiner da porta 8080
ou, que estamos deixando essa porta disponível para o contêiner.
O comando expose
é uma forma de documentar que a aplicação está rodando na porta 8080. Portanto, a ideia não é publicar a porta, e sim fazer a comunicação entre quem escreveu a imagem Docker e quem vai usar essa imagem para rodar o contêiner. Isto é, não significa que estamos expondo a porta 8080
.
A partir disso, precisamos capturar o jar
da aplicação car-service
para colocá-la dentro do contêiner. Isso porque temos o JDK e a aplicação, e agora precisamos inserir a aplicação, que será o jar
.
Ao rodarmos um mvn clean install
, o jar
é gerado na pasta target
. Por isso, usaremos o comando ADD
com o caminho /target/car-service-0.0.1-SNAPSHOT.jar
.
Dockerfile
FROM openjdk:17-jdk-slim-buster
EXPOSE 8080
ADD /target/car-service-0.0.1-SNAPSHOT.jar car-service.jar
Com o comando add
, estamos copiando da pasta target
um arquivo .jar
chamado car-service-0.0.1-SNAPSHOT.jar
, para um repositório car-service.jar
. Ou seja, estamos copiando o arquivo .jar
com outro nome para dentro do contêiner.
Mais para frente, vamos aprender quais comandos precisamos usar para executar esse arquivo .jar
no contêiner.
Após o add
, incluiremos o comando que será executado ao subirmos o contêiner. Ao criarmos a imagem que gerará o contêiner, o que ele precisará executar para a aplicação rodar no contêiner? Conseguimos fazer isso, usando o comando entrypoint[]
.
No colchete, incluímos o comando que será rodado ao subirmos a aplicação. No entrypoint, há uma diferença na sintaxe, precisamos colocar cada comando entre aspas duplas e separado por vírgula.
Logo, podemos colocar ENTRYPOINT ["java",]
e, como estamos trabalhando com o conceito de profiles, e deixamos o profile de dev como padrão, sempre que inicializamos a aplicação localmente, ele sobe com as configurações do application.properties
do desenvolvimento, sendo que tudo está apontando para o localhost.
Para o ambiente produtivo, é necessário apontarmos para o profile de produção, em que temos as configurações do banco de dados disponível para acessar, qual o Redis em produção, entre outras informações. Não é mais o localhost.
Dockerfile
//código omitido
ENTRYPOINT ["java",]
Portanto, após o "java" passaremos a flag do Spring que ativa o profile de prod.
Dockerfile
// código omitido
ENTRYPOINT ["java", "-Dspring.profiles.active=prod",]
Em seguida, colocamos mais uma vírgula e abrimos aspas para incluir o próximo comando a ser rodado, no caso o -jar
e depois informamos qual o jar
que ele irá executar car-service.jar
.
Obs: como copiamos o arquivo
jar
para ocar-service.jar
, usamos ele.
Dockerfile
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "car-service.jar"]
Ao lermos esse comando, temos a seguinte lingua de raciocínio: temos o Java, ativando o profile de produção, o -jar
e o car-service.jar
, sendo o que será executado.
Assim, ficamos com o seguinte arquivo Dockerfile
:
FROM openjdk:17-jdk-slim-buster
EXPOSE 8080
ADD /target/car-service-0.0.1-SNAPSHOT.jar car-service.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "car-service.jar"]
Ao construirmos essa imagem para criar o contêiner, será executado o passo a passo dos comandos descritos no arquivo, e teremos a aplicação rodando.
Com isso, temos o arquivo Dockerfile
criado. Agora, precisamos disponibilizá-lo em algum lugar de fácil acesso na Web. Isso porque não adianta termos uma imagem local, sendo que o objetivo com contêineres é termos acesso a essa imagem e executá-la em qualquer ambiente, seja no produtivo, na cloud ou localmente.
Porém, a ideia desta aula era mostrar como construir o primeiro arquivo. Na sequência, aprenderemos como disponibilizar o arquivo para conseguirmos acessá-lo na web e criarmos os contêineres em vários ambientes.
Te espero no próximo vídeo!
Com o arquivo Dockerfile
, conseguimos visualizar o que vamos precisar construir para gerar a imagem e, posteriormente, o contêiner. Mas verificamos que para gerar a imagem, precisamos disponibilizá-la em algum local que temos fácil acesso.
Por exemplo, como damos acesso à imagem construída na máquina localmente, se posteriormente subiremos ela em um ambiente da cloud? Não tem como fazer isso.
Como disponibilizar a imagem de forma que qualquer pessoa possa baixar e rodá-la no contêiner da própria máquina? Para isso, é necessário algum repositório em que conseguimos construir a imagem localmente. No entanto, que seja possível subirmos a imagem para que qualquer um que quiser fazer o deploy da aplicação tenha acesso.
O Docker possui uma ferramenta similar ao GitHub, chamado Docker Hub , para imagens Docker. Imagens que vamos gerar a partir do arquivo Dockerfile
.
Ao entrarmos no site do Docker Hub, na parte superior direita, temos quatro opções, sendo elas: explore, pricing, sign in e register. Clicaremos no botão "Register".
Será mostrada uma tela com alguns campos para preenchermos, como username, email e password. Abaixo, dois checkboxes perguntando se concordamos com os termos e, em seguida, um botão azul "Sign Up".
Para criar uma conta do Docker Hub, basta preencher os dados solicitados, concordar com os termos, informar que não é um robô e clicar no botão "Sign Up".
O usuário precisa ser um não usado ainda, porque ele será utilizado para referenciar o nosso ambiente para subirmos as imagens para o repositório.
Caso já possua um usuário, basta ir em "Sign In", preencher as credenciais e clicar no botão azul "Continue".
Ao logarmos, somos redirecionados para o Dashboard. Caso já tenha imagens, elas serão listadas já na página inicial.
O instrutor já possui a imagem
car-service
, mas o passo a passo para subir essa imagem para o Docker Hub será feito em aulas posteriores.
O importante entender é que no Docker Hub temos a estrutura das nossas imagens que ficaram disponíveis para outras pessoas. Por exemplo, no campo de busca na parte superior, podemos pesquisar pela imagem que usamos como ponto de partida do Dockerfile
, sendo a openjdk
.
openjdk
Pesquisando por essa imagem no Docker Hub, serão exibidas algumas possibilidades, dentre elas temos uma opção com a tag oficial "DOCKER OFFICIAL IMAGE". Clicando nesse openjdk oficial, e depois na aba "Tags", podemos pesquisar pela versão 17
, nos devolve o 17.0.2-jdk-oracle
.
Estamos com uma versão diferente, mas podemos usar a tag 17.0.2-jdk-oracle
ou usar somente a 17.0.2
. Portanto, o Docker Hub é um repositório de imagens, em que qualquer pessoa que tenha acesso à internet pode pegá-las. Podemos usar as imagens já existentes no arquivo para gerarmos a imagem, como no openjdk ou, podemos subir a imagem no Docker Hub.
Na sequência, seguimos essa última opção de subirmos a imagem para o Docker Hub.
Após entendermos os objetivos do Docker Hub, o próximo passo é construirmos a imagem da aplicação pelo Dockerfile
e subir a aplicação com os comandos Docker que aprenderemos.
Te espero na próxima aula, para fazermos o push da imagem da aplicação no Docker Hub.
Até mais!
O curso Kotlin: preparando a aplicação para Cloud possui 146 minutos de vídeos, em um total de 36 atividades. Gostou? Conheça nossos outros cursos de Kotlin em Programação, ou leia nossos artigos de Programação.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.