Provisionamento de Aplicações
Agenda
Introdução ao DevOps
Infraestrutura como Código (IaC)
Conteinerização
Provisionamento de Aplicações
(Docker e Ansible)
Criação de Pipelines
#0 Apresentação#1 Introdução ao DevOps
Antes do DevOps - Deploy Tradicional
O que significa disponibilizar uma aplicação para uso em produção?
Arquitetura Tradicional
#1 Introdução ao DevOps
Antes do DevOps - Desafios
Inconsistência de ambientes: "Funciona na minha máquina, mas não no servidor."
Configuração manual: Necessidade de configurar servidores manualmente.
Gerenciamento de dependências: Pacotes e bibliotecas conflitantes.
Escalabilidade limitada: Difícil criar múltiplas instâncias rapidamente.
#1 Introdução ao DevOps
Antes do DevOps - Atividade 0
Preparação da máquina servidor
Instalem o Virtual Box
Baixe/Instalem a última versão LTS do Ubuntu (será disponibilizada)
Preparação servidor de aplicação
Instale uma versão do NGINX no sistema operacional do servidor
Aplicação
Na sua máquina gere uma distribuição da aplicação To Do em angular 17
Copie a aplicação utilizando SCP de sua máquina para o diretório de aplicação do NGINX normalmente na pasta /var/www/html no servidor Ubuntu
Por fim Envie a URL para o professor acessar
#1 Introdução ao DevOps
Antes do DevOps - Atividade 0
Quais foram os maiores desafios no processo?
#1 Introdução ao DevOps #1 Introdução ao DevOps # 1 - Instalar Máquina Virtual Ubuntu com Virtual Box
# 2 - Configurar VM e Redirecionamento de Portas entre HOST e CONVIDADO
# 3 - Acessar máquina por SSH
ssh <usuario>@<endereço_IP_ubuntu>
ssh -p 2222 ubuntu@127.0.0.1
# 4 - Atualizar Pacotes Ubuntu
sudo apt update
# 5 - Instalar NGINX, OpenSSH-Server
sudo apt install openssh-server
sudo apt install nginx
# 6 - Verificar IP da máquina Ubuntu
ip a
# 7 - Copiar arquivos para o servidor Ubuntu na pasta NGINX
scp -P <porta> <origem> <destino>
scp -P 2222 -r /caminho/dist ubuntu@127.0.0.1:/var/www/html#1 Introdução ao DevOps
Antes do DevOps - Problemas comuns
Ambientes inconsistentes: Falta de compatibilidade entre o ambiente local e o servidor.
Configuração manual demorada: Repetitiva e sujeita a erros humanos.
Gerenciamento de versões: Dificuldade em manter controle sobre diferentes versões da aplicação.
Escalabilidade e replicação: Criar novas instâncias requer reconfigurações manuais.
Manutenção complexa: Atualizações ou mudanças na infraestrutura podem causar problemas.
#1 Introdução ao DevOps
Antes do DevOps e Docker
| Aspecto | Deploy Tradicional | Com Docker |
|---|---|---|
| Consistência de ambientes | Sujeito a diferenças no ambiente | Ambiente padronizado com containers |
| Tempo de configuração | Demorado | Rápido (Dockerfiles e imagens) |
| Escalabilidade | Manual e lento | Automático e ágil (Docker Compose) |
| Portabilidade | Limitada | Alta (funciona em qualquer host Docker) |
#1 Introdução ao DevOps
O que é DevOps?
O que é DevOps?
DevOps é um conjunto de práticas, ferramentas e filosofia cultural que integra as equipes de desenvolvimento de software e operações de TI
#1 Introdução ao DevOps
O que siginifica DevOps?
Um composto de Dev (desenvolvimento) e Ops (operações), o DevOps é a união de pessoas, processos e tecnologias para fornecer continuamente valor aos clientes.
#1 Introdução ao DevOps
Surgimento do DevOps
O movimento do DevOps começou a tomar forma entre 2007 e 2008, quando as operações de TI e as comunidades de desenvolvimento de software passaram a expressar o que acreditavam ser um nível fatal de disfuncionalidade no setor.
#1 Introdução ao DevOps
DevOps - A guerra
Desenvolvimento de Software
X
Operações / infraestrutura
#1 Introdução ao DevOps
Unidade
Unidade
DevOps
Unidade
O Desenvolvimento constrói produtos que são instalados em servidores, computadores e nuvens mantidos pelas unidades de Operação.
O começo do fim da Guerra
As equipes atuavam em silos preocupadas apenas com o próprio escopo, horas mais longas de trabalho, versões problemáticas e clientes insatisfeitos. Elas tinham certeza de que deveria ter um jeito melhor. Assim, as duas comunidades se uniram e começaram a conversar, com pessoas como Patrick Dubois, Gene Kim e John Willis conduzindo o debate.
#1 Introdução ao DevOps
Surgimento do DevOps
Patrick Debois, administrador de sistemas, gerente de projetos e especialista em desenvolvimento, propõe discutir métodos sobre como solucionar os eternos conflitos entre as áreas de desenvolvimento e operações de TI. Essa palestra foi feita na Conferência de Agile, em Toronto (você pode ver aqui a apresentação feita no evento).
#1 Introdução ao DevOps
Conceituando DevOps
O DevOps aborda todas as fases do ciclo de vida de desenvolvimento e operações. Do planejamento e criação ao monitoramento e iteração, o DevOps reúne as habilidades, os processos e as ferramentas de todas as facetas de uma organização de engenharia e TI.
#1 Introdução ao DevOps
Conceituando DevOps
#1 Introdução ao DevOps
#1 Introdução ao DevOps Com DevOps teremos:
Colaboração e confiança
Libere versões mais rapidamente e trabalhe de modo mais inteligente
#1 Introdução ao DevOps
O DevOps é uma abordagem ágil à mudança organizacional que busca conectar equipes tradicionais e em silos e estabelecer novos processos que facilitem uma maior colaboração.
#1 Introdução ao DevOps Sem a mentalidade, os rituais e a cultura certos, é difícil cumprir a promessa completa do DevOps.
#1 Introdução ao DevOps #1 Introdução ao DevOps O centro do DevOps
#1 Introdução ao DevOps Você cria, você gerencia.
Supervisionar, testar, controle qualidade
Objetivos empresariais do sistema, definir as necessidades operacionais com o desenvolvimento
#1 Introdução ao DevOps Autonomia das equipes:
#1 Introdução ao DevOps Por exemplo, uma equipe é prejudicada por requisitos como ter que abrir um ticket com uma equipe de operações separada para realizar uma alteração trivial na infraestrutura, como uma nova entrada de DNS. Uma tarefa que deveria ser realizada em segundos acaba levando dias ou semanas. Uma equipe autônoma é capaz de implementar essas alterações por conta própria, seja por ter alguém na equipe que tenha as habilidades e a experiência corretas ou acesso a ferramentas de autoatendimento.
#1 Introdução ao DevOps Em um ambiente em que as equipes de desenvolvimento e operações estão em silos isolados, muitas vezes há lentidão no recebimento do feedback sobre o desempenho e a estabilidade do software aplicativo em produção pela equipe de desenvolvimento, quando chega até ela.
#1 Introdução ao DevOps A integração e a entrega contínuas (CI/CD) são consideradas necessárias para uma cultura de DevOps.
#1 Introdução ao DevOps #1 Introdução ao DevOps Empresas que praticam o DevOps afirmam que lançam entregáveis de maior qualidade (61%), com maior frequência de implementação e tempo de disponibilização no mercado mais rápido (49%). E não são apenas as empresas que têm vantagens: profissionais dizem que aprenderam novas habilidades (78%) e receberam aumentos (48%).
Fonte: Atlassian
#1 Introdução ao DevOps O DevOps é um generalista de TI que deve ter um amplo conhecimento de desenvolvimento e operações, incluindo codificação, gerenciamento de infraestrutura, administração de sistemas e cadeias de ferramentas de DevOps. Os engenheiros de DevOps também devem ter habilidades interpessoais, pois trabalham nos silos da empresa para criar um ambiente mais colaborativo.
#1 Introdução ao DevOps #1 Introdução ao DevOps #1 Introdução ao DevOps #2 Infraestrutura como Código (IaC)O que é IaC?
#2 Infraestrutura como Código (IaC)O que é IaC?
Infraestrutura como código (IaC) refere-se ao gerenciamento e provisionamento da infraestrutura por meio de códigos, em vez de processos manuais. A sigla vem do termo em inglês, "Infrastructure as Code".
O que é IaC?
#2 Infraestrutura como Código (IaC)Automatização: a IaC permite a automação de tarefas repetitivas e manuais, o que economiza tempo e reduz o risco de erro humano.
Agilidade: a IaC permite a criação rápida e fácil de novas infraestruturas, permitindo que as equipes de TI sejam mais ágeis e respondam às necessidades do negócio com mais rapidez.
Escalabilidade: a IaC permite a escalabilidade da infraestrutura, possibilitando que ela cresça ou diminua de acordo com a demanda, sem a necessidade de intervenção manual.
Consistência: a IaC garante que a infraestrutura seja consistente em todas as instâncias, evitando erros causados por diferenças de configuração.
#2 Infraestrutura como Código (IaC)Por que IaC?
A abordagem declarativa define o estado desejado do sistema, incluindo os recursos necessários, as propriedades que eles precisam ter e uma ferramenta de IaC para configurá-lo.
Ferramentas como Terraform e CloudFormation da AWS são exemplos que utilizam este método.
#2 Infraestrutura como Código (IaC)IaC declarativa e imperativa
Este código declara uma instância AWS EC2 desejada, especificando o tipo de instância e a imagem de máquina da Amazon (AMI) a ser usada. O Terraform se encarrega de realizar as etapas necessárias para alcançar esse estado.
#2 Infraestrutura como Código (IaC)IaC declarativa e imperativa
Exemplo de Terraform:
hcl (HashiCorp Configuration Language)
resource “aws_instance” “example” {
ami = “ami-0c55b159cbfafe1f0”
instance_type = “t2.micro”
}A abordagem imperativa define os comandos específicos necessários para alcançar a configuração desejada. Depois, esses comandos precisam ser executados na ordem correta.
#2 Infraestrutura como Código (IaC)IaC declarativa e imperativa
Exemplo de Ansible:
yaml (Yet Another Markup Language)
– name: Instala Apache
yum:
name: httpd
state: present
O provisionamento de infraestrutura sempre foi um processo manual, caro e demorado. Agora, o gerenciamento de infraestrutura migrou do hardware físico em datacenters (ainda que eles ainda sejam um componente da sua organização) para virtualização, containers e cloud computing.
Com a cloud computing, o número de componentes de infraestrutura aumentou, mais aplicações são colocadas em produção diariamente e as infraestruturas precisam ser flexíveis para as frequentes alterações, escalas e desativações. Hoje em dia, sem a implementação de uma prática de IaC, fica cada vez mais difícil gerenciar a escala da infraestrutura.
#2 Infraestrutura como Código (IaC)IaC benefícios
Redução de custos
Aumento na velocidade das implantações
Redução de erros
Melhoria na consistência da infraestrutura
Eliminação de desvios de configuração
#2 Infraestrutura como Código (IaC)IaC benefícios
#2 Infraestrutura como Código (IaC)IaC Ferramentas
Gestão de infraestrutura como código para múltiplos provedores de nuvem
Alguns comandos/ações que o terraform pode realizar:
#2 Infraestrutura como Código (IaC)IaC Ferramenta - Terraform
Ferramenta que automatiza tarefas com foco em atingir o estado desejado em um sistema. Uma tarefa pode ser algo tão simples quanto definir um pacote que precisa ser instalado, declarar configurações de servidor web ou até mesmo configurar uma orquestração de implantação completa.
#2 Infraestrutura como Código (IaC)IaC Ferramenta - Ansible
O AWS CloudFormation é um serviço que ajuda você a modelar e configurar seus recursos da AWS para que você possa gastar menos tempo gerenciando esses recursos e mais tempo focando em seus aplicativos que são executados na AWS. Você cria um modelo que descreve todos os recursos da AWS que você deseja (como instâncias do Amazon EC2 ou instâncias do Amazon RDS DB), e o CloudFormation cuida do provisionamento e da configuração desses recursos para você.
#2 Infraestrutura como Código (IaC)IaC Ferramenta - AWS CloudFormation
#2 Infraestrutura como Código (IaC)IaC Ferramenta - Comparativo
| Características | Terraform | Ansible | AWS CloudFormation |
|---|---|---|---|
| Tipo de IaC | Declarativa | Declarativa (com alguns aspectos imperativos) | Declarativa |
| Linguagem | HCL (HashiCorp Configuration Language) | YAML/INI para playbooks; Python para módulos | JSON ou YAML |
| Provedores de Nuvem Suportados | Multicloud (AWS, Azure, GCP, outros) | Multicloud, servidores locais e containers | Exclusivo para AWS |
| Foco Principal | Provisionamento de infraestrutura | Configuração e gerenciamento de sistemas | Provisionamento de infraestrutura na AWS |
| Curva de Aprendizado | Moderada | Moderada a baixa | Moderada, especialmente para recursos complexos |
| Automação de Configuração | Não nativo (requer integração com outras ferramentas) | Sim, via módulos e playbooks | Limitada (principalmente para infraestrutura) |
| Controle de Estado | Sim (arquivo de estado gerenciado pelo Terraform) | Não | Sim (gerenciado automaticamente pela AWS) |
| Execução Local ou Remota | Local ou remoto | Remoto (via SSH) ou local | Remoto (via serviços AWS) |
| Custo | Gratuito (open-source); Enterprise com custos adicionais | Gratuito (open-source); custos de suporte opcional | Gratuito (mas dependente do custo dos serviços AWS) |
| Exemplo de Comando | terraform apply |
ansible-playbook site.yml | Integração via AWS Console ou CLI (aws cloudformation deploy) |
#2 Infraestrutura como Código (IaC)IaC Ferramenta - Recomendações
Curva de aprendizado: a IaC é uma metodologia complexa que requer conhecimentos de programação e infraestrutura. Isso pode exigir uma curva de aprendizado para equipes de TI que não estão familiarizadas com a metodologia.
Configuração incorreta: se a configuração de um arquivo de código estiver incorreta, pode haver efeitos negativos na infraestrutura, incluindo a possibilidade de paralisações no serviço.
Mudanças frequentes: como o código é usado para gerenciar a infraestrutura, mudanças frequentes no código podem impactar a infraestrutura em tempo real, o que pode exigir cuidados extras e precauções para evitar erros.
#2 Infraestrutura como Código (IaC)Desafios da IaC?
O Vagrant é uma ferramenta de automação para a criação e gerenciamento de ambientes virtuais. Ele simplifica o uso de máquinas virtuais, garantindo consistência e portabilidade para desenvolvedores e equipes. Com o Vagrant, é possível configurar ambientes de desenvolvimento de forma rápida, padronizada e sem dependências complexas no sistema host.
#2 Infraestrutura como Código (IaC)Vagrant
#2 Infraestrutura como Código (IaC)Vagrant - Características
#2 Infraestrutura como Código (IaC)Vagrant - Instalação
# Verifique se a instalação ocorreu executando:
vagrant --version # Output: Vagrant 2.4.6
# Nos exemplos utilizaremos o provedor Virtual Box,
# então garanta que o mesmo já está instalado.#2 Infraestrutura como Código (IaC)Fluxo do Vagrant
#2 Infraestrutura como Código (IaC)Vagrant - Boxes
Link para boxes disponíveis: https://portal.cloud.hashicorp.com/vagrant/discover
#2 Infraestrutura como Código (IaC)VagrantFile
# Configuração básica do Vagrant para uma VM Ubuntu
Vagrant.configure("2") do |config|
# Define a box que será usada (Ubuntu 20.04)
config.vm.box = "ubuntu/focal64"
# Configuração de rede (redireciona a porta 22 da VM para a porta 2222 do host)
config.vm.network "forwarded_port", guest: 22, host: 2222
# Provisionamento da máquina (instala o OpenSSH server)
config.vm.provision "shell", inline: <<-SHELL
apt-get update
SHELL
# Configuração do provedor VirtualBox
config.vm.provider "virtualbox" do |vb|
vb.name = "UbuntuSSH_VM" # Nome da VM no VirtualBox
vb.memory = "1024" # Memória RAM (em MB)
vb.cpus = 2 # Número de CPUs
end
end#2 Infraestrutura como Código (IaC)VagrantFile
# Configuração básica do Vagrant para uma VM Ubuntu
Vagrant.configure("2") do |config|
# Define a box que será usada (Ubuntu 20.04)
config.vm.box = "ubuntu/focal64"
# Configuração de rede (redireciona a porta 22 da VM para a porta 2222 do host)
config.vm.network "forwarded_port", guest: 22, host: 2222
# Provisionamento da máquina (instala o OpenSSH server)
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y openssh-server
systemctl enable ssh
systemctl start ssh
SHELL
# Configuração do provedor VirtualBox
config.vm.provider "virtualbox" do |vb|
vb.name = "UbuntuSSH_VM" # Nome da VM no VirtualBox
vb.memory = "1024" # Memória RAM (em MB)
vb.cpus = 2 # Número de CPUs
end
endAtividade 1 - Vagrant
#2 Infraestrutura como Código (IaC)#2 Infraestrutura como Código (IaC)VagrantFile
# Configuração básica do Vagrant para uma VM Ubuntu
Vagrant.configure("2") do |config|
# Define a box que será usada (Ubuntu 20.04)
config.vm.box = "ubuntu/focal64"
# Configuração de rede (redireciona a porta 22 da VM para a porta 2222 do host)
config.vm.network "forwarded_port", guest: 22, host: 2222
config.vm.network "forwarded_port", guest: 80, host: 88
# Provisionamento da máquina (instala o OpenSSH server)
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y openssh-server
apt-get install -y nginx
chmod -R 777 /var/www/html
systemctl enable ssh
systemctl start ssh
SHELL
# Pastas sincronizadas
config.vm.synced_folder "./site", "/var/www/html"
# Configuração do provedor VirtualBox
config.vm.provider "virtualbox" do |vb|
vb.name = "UbuntuSSH_VM" # Nome da VM no VirtualBox
vb.memory = "1024" # Memória RAM (em MB)
vb.cpus = 2 # Número de CPUs
end
end#2 Infraestrutura como Código (IaC)VagrantFile - Subindo VMS
# Arquivo Vagrantfile-vms
vms = {
'master3' => { 'memory' => '512', 'cpus' => 1, 'ip' => '30' },
'master2' => { 'memory' => '1024', 'cpus' => 1, 'ip' => '20' },
'master1' => { 'memory' => '256', 'cpus' => 1, 'ip' => '10' }
}
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-20.04"
config.vm.box_check_update = false
vms.each do |name, conf|
config.vm.define name do |k|
k.vm.hostname = "#{name}.k8s.cluster"
k.vm.network 'private_network', ip: "172.27.11.#{conf['ip']}"
k.vm.provider 'virtualbox' do |vb|
vb.memory = conf['memory']
vb.cpus = conf['cpus']
vb.name = name
end
k.vm.provision "shell", inline: <<-SHELL
apt-get update -y
apt-get install -y curl
SHELL
end
end
end#2 Infraestrutura como Código (IaC)VagrantFile - Acessando VMS
# Visualizando configurações ssh das máquinas para um vagrantfile fora do nome padrão
VAGRANT_VAGRANTFILE=Vagrantfile-vms vagrant ssh-config
# Output
Host master3
HostName 10.211.55.16
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/vanilton/provisionamento_ambiente_etech/.vagrant/machines/master3/parallels/private_key
IdentitiesOnly yes
LogLevel FATAL
PubkeyAcceptedKeyTypes +ssh-rsa
HostKeyAlgorithms +ssh-rsa
Host master2
HostName 10.211.55.17
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/vanilton/provisionamento_ambiente_etech/.vagrant/machines/master2/parallels/private_key
IdentitiesOnly yes
LogLevel FATAL
PubkeyAcceptedKeyTypes +ssh-rsa
HostKeyAlgorithms +ssh-rsa
Host master1
HostName 10.211.55.18
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/vanilton/provisionamento_ambiente_etech/.vagrant/machines/master1/parallels/private_key
IdentitiesOnly yes
LogLevel FATAL
PubkeyAcceptedKeyTypes +ssh-rsa
HostKeyAlgorithms +ssh-rsa# Acessando VM por ssh via chave privada
ssh vagrant@172.27.11.20 -i .vagrant/machines/master2/virtualbox/private_key
# ou
VAGRANT_VAGRANTFILE=Vagrantfile-vms vagrant ssh master2
# Senha padrão "vagrant"
# Output
vagrant@master2:~$ #2 Infraestrutura como Código (IaC)Vagrant - Comandos
# Provisionar a máquina
vagrant up
# Acessar a máquina por ssh
vagrant ssh
# Verificar configurações SSH das máquina
vagrant ssh-config
# Desligar VM
vagrant halt
# Destruir máquina
vagrant destroy -f
# Instalar plugin para utilizar scp com vagrant
vagrant plugin install vagrant-scp
# Exemplo copiando arquivo para a máquina virtual
vagrant scp arquivo.txt :/home/vagrant/Atividade 2 - Vagrant
#2 Infraestrutura como Código (IaC)Atividade 3
30 Minutos
#2 Infraestrutura como Código (IaC)O que é Conteinerização?
#3 ConteinerizaçãoO que é Conteinerização?
Conteinerização é o empacotamento do código de software com todos os componentes necessários, como bibliotecas, frameworks e outras dependências, para que fiquem isolados em seu próprio "container".
#3 ConteinerizaçãoHistória da Conteinerização
#3 ConteinerizaçãoInício
Chroot (1979): Introduzido no Unix pela Bell Labs, o comando chroot permite criar um ambiente isolado no sistema de arquivos, direcionando um processo para uma raiz específica. Isso foi uma base primitiva para o isolamento de processos.
História da Conteinerização
#3 ConteinerizaçãoHistória da Conteinerização
#3 ConteinerizaçãoAvanço com a virtualização leve
FreeBSD Jails (2000): Um aprimoramento significativo em relação ao chroot, os jails permitem isolar não apenas o sistema de arquivos, mas também redes e usuários. Cada jail opera como um sistema independente dentro do host.
Linux VServer (2001): Introduziu o conceito de particionar recursos como CPU e memória em ambientes isolados no Linux.
História da Conteinerização - Jail x Chroot
#3 ConteinerizaçãoComparando o Jail com o Chroot, observa-se que o segundo não separa a pilha TCP/IP ou controla os acessos de forma tão rígida como o Jail. Quando se usa Jail, o kernel do sistema operacional individualiza as áreas de rede, memória, processos, usuários e arquivos.
O Jail cria um verdadeiro container, o que abre um leque de possibilidades para um ambiente de produção, homologação ou desenvolvimento
História da Conteinerização
#3 ConteinerizaçãoOpenVZ (2004): Focado em servidores Linux, trouxe isolamento e virtualização a partir de um único kernel, sendo uma forma inicial de "containers".
Cgroups e Namespaces (2006-2008): O kernel Linux introduziu tecnologias fundamentais:
Esses dois componentes são a base dos containers modernos.
História da Conteinerização
#3 ConteinerizaçãoO lançamento do Docker revolucionou a conteinerização:
História da Conteinerização -
Virtualização x Containers
#3 ConteinerizaçãoHistória da Conteinerização
#3 ConteinerizaçãoHistória da Conteinerização - Hoje
#3 ConteinerizaçãoA evolução da conteinerização continua, com foco em segurança, desempenho e integração mais profunda com arquiteturas de computação distribuída.
Atividade 4
QUIZ
#3 Conteinerização#4 Provisionamento de Aplicações
#4 Provisionamento de Aplicações
#4 Provisionamento de Aplicações
#4 Provisionamento de Aplicações
O que é Docker?
O Docker é uma plataforma de software que permite criar, testar e implantar aplicativos rapidamente, empacotando software em unidades padronizadas chamadas contêineres
#4 Provisionamento de Aplicações
História do Docker
#4 Provisionamento de Aplicações
O que é container
#4 Provisionamento de Aplicações
Container Docker
#4 Provisionamento de Aplicações
Imagens Docker
Imagens dockers são aplicações completas construídas por meio de comandos isolados ou organizados em um Dockerfile
#4 Provisionamento de Aplicações
Imagens Docker
#4 Provisionamento de Aplicações
Componentes do Docker
#4 Provisionamento de Aplicações
Componentes do Docker
#4 Provisionamento de Aplicações
Componentes do Docker
#4 Provisionamento de Aplicações
Dockerfile
#4 Provisionamento de Aplicações
Instalação - Windows
#4 Provisionamento de Aplicações
Instalação - Windows - Video
#4 Provisionamento de Aplicações
Contrato de Serviço de Assinatura Docker
#4 Provisionamento de Aplicações
Aqui está um resumo dos pontos principais:
#5 Provisionamento de Aplicações
docker --version
docker run hello-world#5 Provisionamento de Aplicações
docker run -d -p 80:80 --name inicio_docker docker/getting-started#5 Provisionamento de Aplicações
# Criar e acessar de modo interativo
docker run -i -t ubuntu bash
# Criar container e eliminar após execução
docker run --rm -i -t ubuntu bash
# Ativar/Parar um container parado
docker start/stop <CONTAINER ID ou NOME>
# Acessar um container em execução (Exemplo gettind started)
docker exec -it <CONTAINER ID ou NOME> sh/bash
docker exec -it inicio_docker sh#5 Provisionamento de Aplicações
# Listando imagens
docker images
# Listar containers ativos e inativos
docker container ls
docker ps -a
# Listando e filtrando containers
docker ps | grep ubuntu
#5 Provisionamento de Aplicações
# Acessando logs
docker logs <CONTAINER_ID ou NOME>
# Acompanhando logs
docker logs todo-etFPFtech --follow
# Incluindo o timestamp
docker logs todo-etFPFtech --follow --timestamps#5 Provisionamento de Aplicações
# Criação de volume
docker volume create todo-db
# Listar volumes criados
docker volume ls
# Inspecionar um volume criado
docker volume inspect <nome_volume>
# Remover volume
docker volume rm <nome_volume>#5 Provisionamento de Aplicações
# Criando volume persistente
docker run -dp 3000:3000 -v todo-db:/etc/todos meu_todocontainer
volume
Agora se criarmos registros, remover o container e recriálo, manteremos os dados que foram persistidos.
# Remover container
docker rm -f <container-id>Baixe o projeto: Link
#5 Provisionamento de Aplicações
# Compartilhando com docker
docker run -d --name meu-nginx -p 8080:80 -v $(pwd)/nginx-content:/usr/share/nginx/html nginx
# Exemplo utilizando a aplicação TO DO
docker run -dp 3000:3000 -w /app -v "$(pwd):/app" node:18-alpine sh -c "yarn install && yarn run dev"
# Verifique o log do container
docker logs -f <container-id>container
host
Agora que está com o volume refletindo o código fonte presente no host altere o título da página web conforme a imagem ao lado e veja se reflete na aplicação em execução.
#5 Provisionamento de Aplicações
# Copie um arquivo local para o contêiner
docker cp ./some_file CONTAINER:/work
# Copie os arquivos do contêiner para o caminho local
docker cp CONTAINER:/var/logs/ /tmp/app_logsAtividade 5
#5 Provisionamento de Aplicações
#5 Provisionamento de Aplicações
# Buscará imagens no Docker Hub
docker search nginx#5 Provisionamento de Aplicações
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]# Comando para construção de uma imagem padrão (Dockerfile)
docker build -t my_getting_started .
Baixe o projeto: Link
#5 Provisionamento de Aplicações
# Script shell que será executado
#!/bin/sh
echo "Iniciando o script..."
echo "Olá, Docker Compose!"# Dockerfile
FROM alpine:latest
RUN apk add --no-cache bash
COPY script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
CMD ["/usr/local/bin/script.sh"]# Comando para construção de uma imagem padrão (Dockerfile)
docker build -t script-runner .
# Criar container e eliminar após execução
docker run --rm script-runner#5 Provisionamento de Aplicações
version: '3.8'
services:
script-runner:
build:
context: .
dockerfile: Dockerfile
container_name: script-runner-container# Criar e executar compose
docker compose up --build#5 Provisionamento de Aplicações
O Docker Compose é uma ferramenta que foi desenvolvida para ajudar a definir e compartilhar aplicativos multi-contêineres. Com o Compose, podemos criar um arquivo YAML para definir os serviços e, com um único comando, podemos girar tudo para cima ou para baixo.
#5 Provisionamento de Aplicações
A grande vantagem de usar o Compose é que você pode definir sua pilha de aplicativos em um arquivo, mantê-la na raiz do repositório do seu projeto (agora é controlada por versão) e facilmente permitir que outra pessoa contribua para seu projeto. Alguém só precisaria clonar seu repositório e iniciar o aplicativo Compose.
#5 Provisionamento de Aplicações
# Exemplo Compose para subir um Postgres
version: '3.4'
services:
postgres:
image: postgres-etech
container_name: postgres-etech
ports:
- "5433:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=etech
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:Para utilizar o compose crie um arquivo "docker-compose.yml", nome padrão, na sua máquina/projeto.
Para executar faça:
# Criar os serviços em background
docker compose up -d
# Criar os serviços sem backgroud
# (neste você verá os logs dos serviços no terminal)
docker compose up
# Caso crie um docker-compose com o nome fora do padrão
# pode definir o arquivo conforme abaix:
docker compose -f docker-compose-nome-diferente.yml up #5 Provisionamento de Aplicações
Cada contêiner deve fazer uma coisa e fazê-la bem. Alguns motivos:
#5 Provisionamento de Aplicações
Case do aplicativo Todo conectando ao banco de dados MySQL
Lembre-se de que os contêineres, por padrão, são executados isoladamente e não sabem nada sobre outros processos ou contêineres na mesma máquina. Para isso teremos que criar uma network.
#5 Provisionamento de Aplicações
Criando rede e o container do banco de dados MySQL + Volume
# Criando a rede
docker network create todo-app# Criando o container do MySQL
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:8.0Perceba que existe um volume todo-mysql-data, neste caso foi declarado e o docker sabendo que não existe cria automaticamente este volume, pode realizar a checagem utilizando docker volume ls.
#5 Provisionamento de Aplicações
Testando conexão com o banco
# Conectando a base no MySQL
docker exec -it <mysql-container-id> mysql -p# Liste as bases do MySQL
mysql> SHOW DATABASES;Perceba que existe um volume todo-mysql-data, neste caso foi declarado e o docker sabendo que não existe cria automaticamente este volume, pode realizar a checagem utilizando docker volume ls.
#5 Provisionamento de Aplicações
Agora vamos executar nossa aplicação conectando ao banco
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:18-alpine \
sh -c "yarn install && yarn run dev"
# Verifique o log do container
docker logs <container-id>Perceba que a aplicação, a direita, já utiliza as variáveis de ambiente que foram definidas no container.
#5 Provisionamento de Aplicações
Agora teste se os registros serão salvos na base
# Conectando a base todos
docker exec -it <mysql-container-id> mysql -p todos# Consultando tabela com registros
mysql> select * from todo_items;#5 Provisionamento de Aplicações
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:#5 Provisionamento de Aplicações
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:#5 Provisionamento de Aplicações
# Criando um registry local
docker run -d -p 5001:5000 --name meu_registry registry:2
# Criando um registry com início automático
docker run -d -p 5001:5000 --name meu_registry --restart=always registry:2#5 Provisionamento de Aplicações
# Baixando do Docker Hub
docker pull nginx
# Criando uma tag para sua imagem baseado na imagem do Docker Hub
docker tag nginx localhost:5001/meu-nginx
# Enviando a imagem para seu registry
docker push localhost:5001/meu-nginx
# Removendo a local baixada do Docker Hub
docker rmi nginx
# Removendo a imagem local enviada para seu registry
docker rmi localhost:5001/meu-nginx
# Agora testando se o registry tem a cópia salva da imagem
docker pull localhost:5001/meu-nginx#5 Provisionamento de Aplicações
O Docker Swarm é uma ferramenta do Docker que permite criar e gerenciar clusters de contêineres:
#5 Provisionamento de Aplicações
Para utilizar o Swarm faça o primeiro passo que é:
# Certifique-se de que o Swarm está ativado no host:
docker swarm init#5 Provisionamento de Aplicações
Com o Swarm ativo agora vamos exercitar a criação dos serviços da aplicação To Do, para isso acesse a pasta do projeto e crie um arquivo chamado docker-stack.yml
version: '3.8'
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
restart: always
ports:
- 3005:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
deploy:
replicas: 1
restart_policy:
condition: any
mysql:
image: mysql:8.0
restart: always
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
deploy:
replicas: 1
restart_policy:
condition: any
volumes:
todo-mysql-data:#5 Provisionamento de Aplicações
Agora vamos criar e checar a stack de serviços
# Use o comando abaixo para implantar os serviços no Swarm:
docker stack deploy -c docker-stack.yml todo-app
# Após subir os serviços, use os comandos abaixo para monitorar:
## Listar stacks ativas:
docker stack ls
## Verificar o status dos serviços na stack:
docker stack services todo-app
## Verificar os logs dos serviços:
docker service logs todo-app_app
docker service logs todo-app_mysql
## Verificar o uso de recursos da stack
docker stats $(docker ps --filter "label=com.docker.stack.namespace=todo-app" -q)#5 Provisionamento de Aplicações
Agora vamos criar e checar a stack de serviços
## Verificar o uso de recursos da stack
docker stats $(docker ps --filter "label=com.docker.stack.namespace=todo-app" -q)#5 Provisionamento de Aplicações
Aumentando o número de réplicas
# Para aumentar as réplicas de um serviço:
docker service scale todo-app_app=3Aqui:
#5 Provisionamento de Aplicações
Outra forma de aumentar as réplicas
# Atualizar a stack conforme arquivo docker-stack.yml
docker stack deploy -c docker-stack.yml todo-appO que Acontece Durante a Atualização?
#5 Provisionamento de Aplicações
Removendo stack
# Para remover a stack:
docker stack rm <nome_da_stack>
docker stack rm todo-appAqui:
Pipeline
#5 Criação de PipelineO que é um Pipeline?
Um pipeline de software é uma sequência automatizada de etapas que transforma código-fonte em um software pronto para uso. Imagine uma linha de produção, mas para o desenvolvimento de software.
#5 Criação de PipelinePor que usar Pipelines
Pipelines automatizam tarefas repetitivas, garantem consistência nas entregas, reduzem erros e aceleram o ciclo de desenvolvimento.
#5 Criação de PipelineCriando um Pipeline no GitLab
Configurando o .gitlab-ci.yml
O arquivo .gitlab-ci.yml define as etapas do seu pipeline, como construir, testar e implantar seu código.
#5 Criação de Pipelinestages:
- lint
- test
# Job para verificar o estilo de código com flake8
flake8:
stage: lint
image: python:3.10
before_script:
- python -m pip install --upgrade pip
- pip install flake8
script:
- flake8
only:
- merge_requests
- main
# Job para rodar os testes unitários
unittest:
stage: test
image: python:3.10
before_script:
- python -m pip install --upgrade pip
- pip install -r requirements.txt
script:
- python -m unittest discover -s tests -p "*.py"
only:
- merge_requests
- mainExecutando um Pipeline no GitLab
Após criar o arquivo .gitlab-ci.yml, GitLab automaticamente detecta e executa seu pipeline.
#5 Criação de PipelineUma aplicação completa de lista de tarefas desenvolvida para demonstrar conceitos de provisionamento de aplicações, incluindo backend Django, frontend Angular, banco de dados PostgreSQL, containerização com Docker e pipeline CI/CD com GitHub Actions.
#6 Provisionando uma aplicação
Este projeto foi desenvolvido como um exemplo prático para ensino de provisionamento de aplicações modernas. A aplicação permite aos usuários:
•✅ Criar, editar e excluir tarefas
•🏷️ Organizar tarefas por categorias
•⚡ Definir prioridades (Alta, Média, Baixa)
•📅 Estabelecer datas de vencimento
•📊 Visualizar estatísticas das tarefas
•🔍 Filtrar e buscar tarefas
•👤 Sistema de autenticação de usuários
#6 Provisionando uma aplicação
•Python 3.11 - Linguagem de programação
•Django 5.2 - Framework web
•Django REST Framework - API REST
•PostgreSQL - Banco de dados
•psycopg2 - Driver PostgreSQL
•python-decouple - Gerenciamento de configurações
#6 Provisionando uma aplicação
•Angular 18 - Framework frontend
•TypeScript - Linguagem de programação
•SCSS - Pré-processador CSS
•Angular Material - Componentes UI
•RxJS - Programação reativa
•Docker - Containerização
•Docker Compose - Orquestração de containers
•Nginx - Servidor web para frontend
•GitHub Actions - CI/CD pipeline
•Make - Automação de tarefas
•Black - Formatação de código Python
•Flake8 - Linting Python
•ESLint - Linting TypeScript
•Prettier - Formatação de código frontend
•Bandit - Análise de segurança Python
•CodeQL - Análise de segurança geral
Para executar este projeto, você precisa ter instalado:
•Docker (versão 20.10 ou superior)
•Docker Compose (versão 2.0 ou superior)
•Make (opcional, para usar comandos simplificados)
•Git (para clonar o repositório)
•Python 3.11+
•Node.js 20+
•PostgreSQL 15+
#6 Provisionando uma aplicação
#6 Provisionando uma aplicação
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend │ │ Backend │ │ Database │
│ (Angular) │◄──►│ (Django) │◄──►│ (PostgreSQL) │
│ Port: 80 │ │ Port: 8000 │ │ Port: 5432 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌─────────────────┐
│ Docker │
│ Containers │
└─────────────────┘
https://br.k21.global/transformacao-organizacional/devops-o-que-e
https://www.atlassian.com/br/devops/what-is-devops/history-of-devops
https://www.redhat.com/pt-br/topics/automation/what-is-infrastructure-as-code-iac
https://sensu.io/blog/implementing-infrastructure-as-code-with-ansible
https://aprovati.com/infraestrutura-como-codigo-iac-declarativa-e-imperativa/
https://www.redhat.com/pt-br/topics/cloud-native-apps/what-is-containerization