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:
Novamente deixo meus link de afiliados:
Obrigado e bons estudos. ;)