Aula 09 - Kubernetes - Dockerizar o App e Implantar na OCI

Oracle: https://cloud.oracle.com/ Documentação do Kubernetes: https://kubernetes.io/docs/home/ Github do Kubernetes: https://github.com/kubernetes/kubernetes Github do Script: https://github.com/HotNoob/Oracle-Free-Arm-VPS-PS/tree/main Introdução Nessa aula vamos dockerizar uma aplicação. Usamos até agora, só a imagem do nginx para os exemplos. Pode ser qualquer uma que você queira, pode ser um simples hello world. Mas aqui na aula, só pra ficar menos monótono, vou dockerizar um jogo 2D chamado Flappy Bird. Tô usando no meu windows o Docker QuickStart Terminal, nesse vídeo avulso do Código Fluente, eu ensino a instalar o Docker no windows: https://www.youtube.com/watch?v=7esQ92ehji4. Vou deixar o link do repositório no github para vocês clonarem o repositório do jogo. https://github.com/toticavalcanti/Flappy-Bird 

Clone o Flappy-Bird, aproveite para deixar uma estrela no repositório.

git clone git@github.com:toticavalcanti/Flappy-Bird.git

Entre na pasta do Flappy-Bird com:

cd Flappy-Bird

Instale as Dependências

npm i

Rode a Aplicação Localmente para Testar

npm start

Acesse no Browser em: localhost:3000

Faça o Build do Flappy-Bird

npm run build
Pronto, agora temos a pasta build do Flappy-Bird, que será colocada no container docker.

Configuração da Máquina Virtual do Docker QuickStart Terminal

Abra o seu hipervisor, isto é, seu software de virtualização, no meu caso, eu o VirtualBox Em Adaptador 1 clique em Redirecionamento de Portas. Clique no botão "Adicionar", o ícone com o sinal de mais à direita +.

Crie o redirecionamento

Em "Nome", você pode colocar algo descritivo como "flappy-bird". Para "Protocolo", escolha "TCP". Em "Endereço IP do Hospedeiro", você pode deixar em branco ou colocar 127.0.0.1. Em "Porta do Hospedeiro", coloque 5000. Em "Endereço IP do Convidado", você também pode deixar em branco. Isso permitirá que a regra seja aplicada independentemente do IP atual da máquina virtual. Em "Porta do Convidado", coloque 5000. Reinicie a máquina virtual Docker novamente para que as regras de redirecionamento de portas tenham efeito.

Docker Hub

Se ainda não tiver uma conta no Dockerhub crie uma. Com uma conta no Dockerhub você vai conseguir subir, ou seja, empurrar (Push) imagens docker no Dockerhub.

Faça o Login

Abra o Docker QuickStart Terminal  ou qualquer outro terminal que esteja usando, e nele, acesse a pasta do Flappy Brid. Já dentro da pasta, no meu caso:  ~/my_projects/react/Flappy_bird Execute o comando: docker login

Crie a Imagem Dockerizada do App

Para dockerizar esse game 2d, que feito com nodejs/reactjs, eu tentei rodar o build dentro do container, através do Dockerfile, mas, não funcionou. Por isso, optei por fazer o build do jogo na minha máquina local, depois disso, a pasta build é criada na pasta raiz do projeto. Dentro do Dockerfile eu só fiz COPY ./build/ ./ ao invés de RUN npm install --omit=dev, ou RUN npm ci --only=production.

Diferenças entre npm install e npm ci

Os comandos npm install e npm ci servem para instalar dependências em um projeto Node.js, mas, eles operam de maneira ligeiramente diferente. npm install : instala as dependências definidas no package.json. Se o package-lock.json estiver presente, o npm install usará as versões lá definidas, mas, se houver alguma incompatibilidade ou o arquivo de bloqueio não existir, o npm atualizará o package-lock.json. O comportamento do comando pode ser modificado com diferentes flags, como --omit=dev para não instalar as dependências de desenvolvimento. npm ci (Continuous Integration): este comando é destinado a ambientes de integração contínua (CI) onde você deseja instalar dependências de forma consistente e confiável. O comando requer que um package-lock.json ou npm-shrinkwrap.json exista e será falho se esses arquivos não estiverem presentes ou se não estiverem em sincronia com o package.json. Ele apaga a pasta node_modules e reinstala todas as dependências do zero, de acordo com as versões exatas especificadas em package-lock.json. O comando npm ci tem um flag --only=production que fará com que apenas as dependências de produção sejam instaladas, ignorando as dependências de desenvolvimento. Se você quer ter certeza de que está instalando exatamente o que está definido no seu package-lock.json, npm ci é a melhor escolha, especialmente para construções de produção ou testes de CI onde a consistência é crucial. No entanto, se você está desenvolvendo e pode precisar atualizar suas dependências com base no que está definido em package.json, npm install é mais apropriado.

Criando a Imagem Docker do Flappy-Bird

Vamos colocar uma tag, e essa tag incluirá o username da sua conta no dockerhub. No meu caso toticavalcanti/flappy-bird. docker build . --progress=plain -t toticavalcanti/flappy-bird

Teste Localmente

docker run -p 5000:5000 toticavalcanti/flappy-bird

Acesse o App no Container em: localhost:5000

Subindo a Imagem para o DockerHub

docker push toticavalcanti/flappy-bird

Deployment

deployment.yaml


apiVersion: apps/v1
kind: Deployment
metadata:
  name: flappy-bird
spec:
  replicas: 3  # Definido para corresponder ao número de nós
  selector:
    matchLabels:
      app: flappy-bird
  template:
    metadata:
      labels:
        app: flappy-bird
    spec:
      containers:
      - name: flappy-bird
        image: toticavalcanti/flappy-bird:latest
        ports:
        - containerPort: 80

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: flappy-bird-service
spec:
  selector:
    app: flappy-bird
  ports:
    - protocol: TCP
      port: 80          # A porta que será exposta pelo serviço e acessível externamente.
      targetPort: 5000  # A porta do contêiner no pod onde o aplicativo está escutando.
  type: LoadBalancer
  Execute alguns comandos kubectl get nodes kubectl apply -f deployment.yaml --request-timeout='2m' kubectl get pods kubectl apply -f service.yaml --request-timeout='2m' kubectl get service Lembre-se que pode levar alguns minutos para que o LoadBalancer forneça um IP externo. Depois que tiver o IP, você poderá acessar seu aplicativo através do navegador utilizando o IP fornecido.

Por essa aula é só.

Até a próxima! 🚀

Mantenha a curiosidade e continue praticando!

Meu github:

https://github.com/toticavalcanti

Novamente deixo meus link de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado e bons estudos. ;)