Provisionamento de Aplicações

Agenda

1

Introdução ao DevOps 

2

Infraestrutura como Código (IaC)

3

Conteinerização

4

Provisionamento de Aplicações

(Docker e Ansible)

5

 

Criação de Pipelines

#0 Apresentação

Quem sou?

  • Vanilton da Thálita 💍
  • Pai do Louie 👦🏻 e Lourenzo 👶🏻
  • Cientista da Computação 🤓
  • 🎓 Especialista  em Engenharia de Software e Gestão de Pessoas
  • 👨🏻‍💻Pessoas e Processos na @fpf.tech 😃
  • 👨🏻‍🏫 Professor na @etech
#1 Introdução ao DevOps 

Antes do DevOps - Deploy Tradicional

  • O que significa disponibilizar uma aplicação para uso em produção?

  • Arquitetura Tradicional

    • Aplicação monolítica rodando diretamente no servidor físico ou máquina virtual.
    • Dependência de ambientes de desenvolvimento/teste/produção iguais.
#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

  • Preparação servidor de aplicação

  • 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?

O que aprendemos - Atividade 0

#1 Introdução ao DevOps 
  • 1. Configuração do servidor:
    • Instalação manual do sistema operacional e pacotes básicos.
    • Configuração de firewall e rede.
  • 2. Instalação das dependências da aplicação:
    • Configuração de linguagens de runtime (ex.: Java, Python, Node.js).
    • Instalação de bibliotecas e frameworks específicos (ex.: Django, Express).
  • 3. Configuração do banco de dados:
    • Instalação e configuração de MySQL ou PostgreSQL.
    • Criação de usuários e bancos.
  • 4. Transferência de código:
    • Upload de arquivos via FTP/SCP ou integração com Git.
  • 5. Iniciar a aplicação:
    • Configuração de um servidor de aplicação (ex.: Apache, Nginx).
    • Executar o código e monitorar erros.

O que aprendemos - Atividade 0

#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

  • Acelere o tempo de resolução
  • Gerencie melhor o trabalho não planejado

Benefícios DevOps

Cultura DevOps

#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.

Cultura DevOps

#1 Introdução ao DevOps 

Cultura DevOps

#1 Introdução ao DevOps 

Cultura DevOps

O centro do DevOps

  1. Aumento da transparência
  2. Comunicação
  3. Colaboração entre equipes
  4. Aprendizado
  5. Melhoria contínua
  6. Responsáveis pelo êxito ou falha de um produto
#1 Introdução ao DevOps 

Cultura 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 

Cultura DevOps

Autonomia das equipes:

  • Tomar decisões e implementar mudanças 
  • Não exista medo de falhar
  • Utilizar processos e as ferramentas para tomar decisões
  • Atuar em níveis de risco para o cliente.
#1 Introdução ao DevOps 

Cultura DevOps - Case

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 

Cultura DevOps - Case

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 

Cultura 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 

Cultura DevOps

#1 Introdução ao DevOps 

Cultura 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 

Um 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 

Um DevOps

  1. Comunicação e colaboração
  2. Administração do sistema
  3. Experiência com ferramentas de DevOps
  4. Gerenciamento de configurações (Chef, Puppet ou Ansible)
  5. Contêineres e orquestração de contêineres
  6. Integração e implementação contínuas
  7. Arquitetura e provisionamento do sistema
  8. Familiaridade com codificação e scripts
  9. Habilidades de gestão colaborativa
#1 Introdução ao DevOps 

Como fazer DevOps?

  1. Escolha o componente (aplicação)
  2. Considere a adoção de alguma metodologia ágil como o Scrum
  3. Utilize controle do código-fonte baseado em Git
  4. Integre o controle do código-fonte ao rastreamento do trabalho
  5. Escreva testes
  6. Crie o processo de IC/CD (Integração/Implementação contínuas) para implementar o componente
  7. Adicione monitoramento, alarmes e instrumentação
#1 Introdução ao DevOps 

Como fazer DevOps - Teste

#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)
  1. Automatização: a IaC permite a automação de tarefas repetitivas e manuais, o que economiza tempo e reduz o risco de erro humano.

  2. 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.

  3. 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.

  4. 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:

    • Init - Prepare seu diretório de trabalho para outros comandos
    • Validate Verifique se a configuração é válida
    • Plan - Mostrar alterações necessárias pela configuração atual
    • Apply - Criar ou atualizar infraestrutura
    • Destroy - Destruir infraestrutura criada anteriormente
#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)
  • Terraform: Melhor escolha para ambientes multicloud e provisionamento de infraestrutura em grande escala. Ideal quando é necessário controlar estados e aplicar mudanças incrementalmente.
  • Ansible: Ótimo para automação de configurações, instalação de softwares e gerenciamento de servidores em diferentes ambientes (cloud, local, containers). Mais indicado para tarefas de configuração pós-provisionamento.
  • AWS CloudFormation: Ideal para quem usa exclusivamente o ecossistema AWS e deseja aproveitar a integração nativa e o gerenciamento simplificado dos recursos da nuvem AWS.
#2 Infraestrutura como Código (IaC)

IaC Ferramenta - Recomendações

  1. 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.

  2. 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.

  3. 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

  1. Box: Imagem base para criar a máquina virtual (ex.: Ubuntu, CentOS).
  2. Provisionamento: Automatiza a configuração da VM usando scripts Shell, Ansible, Puppet, entre outros.
  3. Sincronização de pastas: Compartilha diretórios entre o host e a VM.
  4. Portabilidade: Vagrantfiles podem ser compartilhados para replicar ambientes.
  5. Suporte a múltiplos provedores: Compatível com VirtualBox, VMware, AWS, Docker, etc.
#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

#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
  end

Atividade 1 - Vagrant

  1. Crie um VagrantFile que automatize a criação de uma máquina virtual Ubuntu que possua o servidor HTTP Nginx
  2. Além do mais deve ser copiado um index.html customizado para a máquina criada.
#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

  1. Crie um VagrantFile que automatize a criação de uma máquina virtual Ubuntu que possua o servidor banco de dados postgreSQL. 
    1. Deve existir uma base criada com o nome etech
    2. Na máquina a porta 5435 deve estar disponível para conexão com o banco de dados.
    3. Deve ser possível conectar ao banco com:
      1. usuário: professor
      2. senha: 123456
#2 Infraestrutura como Código (IaC)

DevOps

Atividade 3

  1. Em grupos de 5 discutir o que acham que DevOps pode trazer de benefícios e desafios para uma empresa.
  2. Cada grupo apresenta as conclusões ao final.

30 Minutos

#2 Infraestrutura como Código (IaC)

O que é Conteinerização?

#3 Conteinerização

O 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ção

História da Conteinerização

#3 Conteinerização

Iní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.

1970

História da Conteinerização

#3 Conteinerização

História da Conteinerização

#3 Conteinerização

Avanç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.

2000

História da Conteinerização - Jail x Chroot

#3 Conteinerização

Comparando 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ção

OpenVZ (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:

  • Namespaces: Para isolar recursos como processos, redes, e IDs de usuário.
  • Cgroups: Para controlar e limitar recursos como CPU, memória e I/O.

Esses dois componentes são a base dos containers modernos.

2004-2008

História da Conteinerização

#3 Conteinerização

O lançamento do Docker revolucionou a conteinerização:

  • Interface simplificada: Tornou a tecnologia mais acessível ao encapsular aplicações e suas dependências em unidades portáteis e replicáveis.
  • Base em LXC: Inicialmente, o Docker usava Linux Containers (LXC), mas logo desenvolveu seu próprio mecanismo de runtime.
  • Imagens e registries: Introduziu o conceito de imagens versionadas e armazenadas em registries como o Docker Hub.

2013

História da Conteinerização -

Virtualização x Containers

#3 Conteinerização
  • A virtualização permite que seus sistemas operacionais (Windows ou Linux ) sejam executados simultaneamente em um único sistema de hardware.
  • Os contêineres compartilham o mesmo kernel do sistema operacional e isolam os processos do aplicativo do resto do sistema. Por exemplo: sistemas ARM Linux executam contêineres ARM Linux, sistemas x86 Linux executam contêineres x86 Linux, sistemas x86 Windows executam contêineres x86 Windows. Os contêineres Linux são extremamente portáteis, mas devem ser compatíveis com o sistema subjacente.

História da Conteinerização

#3 Conteinerização
  • OCI (Open Container Initiative, 2015): Criada para padronizar runtimes e formatos de imagens de containers, promovendo interoperabilidade entre ferramentas.
    • Runtimes alternativos:
      • runc: Uma implementação de referência de containers compatível com OCI.
      • Podman e CRI-O: Alternativas ao Docker, projetadas para Kubernetes.
  • Kubernetes (2015): Popularizou a orquestração de containers, estabelecendo-se como o padrão para gestão de aplicações em larga escala.

2015

História da Conteinerização - Hoje

#3 Conteinerização
  • Containers são amplamente usados para:
    • Desenvolvimento ágil: Isolamento de ambientes.
    • DevOps e CI/CD: Integração contínua e entrega contínua.
    • Computação em nuvem: Escalabilidade e portabilidade em ambientes heterogêneos.

A 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

  • 2013
    • Lançado como código aberto
    • Colaboração Red Hat (Fedora, RHEL, OpenShift)
  • 2014
    • 34º projeto GitHub mais discutido
    • Tecnologia aberta mais inovadora
    • A DotCloud foi renomeada para Docker Inc., focando exclusivamente na tecnologia de containers.
  • 2015 - Docker Compose (ambientes multi-containers) e o Docker Swarm (orquestração nativa) começaram a ser desenvolvidas, expandindo as possibilidades do Docker.
  • 2017+ - Docker e Kubernetes
#4 Provisionamento de Aplicações 

O que é container

  • Container <> VM
  • Isolado
  • SO Compartilhado e Libs
#4 Provisionamento de Aplicações 

Container Docker

  • Embalagem padronizada para software e dependências
  • Isolamento de aplicativos uns dos outros
  • Compartilha o mesmo kernel do sistema operacional
  • Funciona para todas as principais distribuições Linux e também
    no Windows
#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 
  • Docker Engine: É o núcleo do Docker que é responsável por construir, executar e gerenciar contêineres. Ele inclui um servidor, uma REST API e uma interface de linha de comando (CLI) que facilita a comunicação com o daemon do Docker.
  • Docker Compose: é uma ferramenta para definir e executar aplicativos Docker multi-container. Ele usa um arquivo YAML para configurar os serviços, redes e volumes do aplicativo, permitindo o gerenciamento fácil de configurações complexas de multi-container.
  • Docker Daemon (dockerd): escuta solicitações da API do Docker e gerencia objetos do Docker, como imagens, contêineres, redes e volumes. Um daemon também pode se comunicar com outros daemons para gerenciar serviços do Docker e é executado no sistema operacional host.

Componentes do Docker

#4 Provisionamento de Aplicações 
  • Docker Client (docker): é a principal maneira pela qual muitos usuários do Docker interagem com o Docker. Quando você usa comandos como docker run, o cliente envia esses comandos para dockerd, que os executa. O comando docker usa a API do Docker. O cliente Docker pode se comunicar com mais de um daemon.
  • Docker Host: é usado para fornecer um ambiente para executar aplicativos. Ele contém o daemon do docker, imagens, contêineres, redes e armazenamentos.
  • Docker Networking: O Docker fornece uma gama de opções de rede para conectar contêineres, permitindo que eles se comuniquem entre si ou com redes externas. O Docker cria redes de ponte padrão, mas os usuários podem definir redes personalizadas conforme necessário.

Componentes do Docker

#4 Provisionamento de Aplicações 
  • Docker Volume: Os volumes do Docker fornecem armazenamento persistente para contêineres. Eles permitem que os dados sejam compartilhados entre o host e o contêiner, bem como entre contêineres diferentes. Os volumes são uma maneira de gerenciar e persistir dados gerados por contêineres do Docker.
  • Docker Hub / Registry:
    • O registry Docker gerencia e armazena a imagem do Docker.
    • Existem dois tipos de registros no Docker:
      • Registro público: também chamado de hub do Docker.
      • Registro privado: é usado para compartilhar imagens na empresa.

Dockerfile

#4 Provisionamento de Aplicações 
  1. Crie imagens automaticamente usando um script de compilação: «Dockerfile»
  2. Pode ser versionado em um sistema de controle de versão como Git, junto com todas as dependências
  3. O Docker Hub pode criar imagens automaticamente com base em dockerfiles no Github

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:

  1. O Docker Desktop é gratuito para pequenas empresas (menos de 250 funcionários e menos de US$ 10 milhões em receita anual), uso pessoal, educação e projetos de código aberto não comerciais.
  2. Caso contrário, é necessária uma assinatura paga para uso profissional.
  3. Assinaturas pagas também são necessárias para entidades governamentais.
  4. As assinaturas Docker Pro, Team e Business incluem o uso comercial do Docker Desktop.
#5 Provisionamento de Aplicações 

Verificando docker instalado

docker --version

docker run hello-world
#5 Provisionamento de Aplicações 

Teste agora com este container

docker run -d -p 80:80 --name inicio_docker docker/getting-started
#5 Provisionamento de Aplicações 

Criando/Acessando um container

# 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 containers e images

# 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 

Logs de containers

# 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 

Volume Docker

#  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 container com Volume

# Criando volume persistente

docker run -dp 3000:3000 -v todo-db:/etc/todos meu_todo

container

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 

Criando container com Volume

# 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 

Copiando conteúdo de/para container

# 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_logs

Atividade 5

#5 Provisionamento de Aplicações 
  1. Crie um container nginx que seja capaz de executar a aplicação angular no link
  2. A porta de acesso deve ser 8888
#5 Provisionamento de Aplicações 

Buscando imagens

# Buscará imagens no Docker Hub

docker search nginx
#5 Provisionamento de Aplicações 

Docker criando imagem

# 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 

Outro exemplo de criação de imagem

# 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 

Criando imagem com Docker compose

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 

Docker compose

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 

Docker compose - vantagem

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 de compose Postgres

# 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 

Multi-containeres

Cada contêiner deve fazer uma coisa e fazê-la bem.  Alguns motivos:

  1. Há uma boa chance de você ter que dimensionar APIs e front-ends de forma diferente dos bancos de dados.
  2. Contêineres separados permitem que você controle e atualize versões isoladamente.
  3. Embora você possa usar um contêiner para o banco de dados localmente, você pode querer usar um serviço gerenciado para o banco de dados em produção. Você não quer enviar seu mecanismo de banco de dados com seu aplicativo então.
  4. Executar vários processos exigirá um gerenciador de processos (o contêiner inicia apenas um processo), o que adiciona complexidade à inicialização/desligamento do contêiner.
#5 Provisionamento de Aplicações 

Multi-containeres

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 

Multi-containeres

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.0

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 

Multi-containeres

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 

Multi-containeres

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 

Multi-containeres

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 

Multi-containeres com Compose

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 

Exemplo compose Wordpress

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

# 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 

Testando seu registry

# 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 

Docker Swarm

O Docker Swarm é uma ferramenta do Docker que permite criar e gerenciar clusters de contêineres:

  • Organizar vários hosts Docker em um único cluster
  • Escalar e gerenciar contêineres de forma mais simples
  • Oferecer funcionalidades como balanceamento de carga, descoberta de serviços e escalabilidade automática 
#5 Provisionamento de Aplicações 

Docker Swarm

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 

Docker Swarm

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 

Docker Swarm

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 

Docker Swarm

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 

Docker Swarm

Aumentando o número de réplicas

# Para aumentar as réplicas de um serviço:

docker service scale todo-app_app=3

Aqui:

  • todo-app_app é o nome do serviço no formato stack_name_service_name.
  • 3 é o número desejado de réplicas.
#5 Provisionamento de Aplicações 

Docker Swarm

Outra forma de aumentar as réplicas

# Atualizar a stack conforme arquivo docker-stack.yml

docker stack deploy -c docker-stack.yml todo-app

O que Acontece Durante a Atualização?

  • Apenas as partes alteradas no arquivo serão modificadas.
  • Containers podem ser recriados para refletir as alterações (por exemplo, novos comandos, variáveis de ambiente ou imagens).
  • O Swarm tentará manter o maior tempo de disponibilidade possível durante o processo de atualização.
#5 Provisionamento de Aplicações 

Docker Swarm

Removendo stack

# Para remover a stack:

docker stack rm <nome_da_stack>

docker stack rm todo-app

Aqui:

  • todo-app_app é o nome do serviço no formato stack_name_service_name.
  • 3 é o número desejado de réplicas.

Pipeline

#5 Criação de Pipeline

O 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 Pipeline

Por que usar Pipelines

Pipelines automatizam tarefas repetitivas, garantem consistência nas entregas, reduzem erros e aceleram o ciclo de desenvolvimento.

#5 Criação de Pipeline

Criando 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 Pipeline
stages:
  - 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
    - main

Executando um Pipeline no GitLab

Após criar o arquivo .gitlab-ci.yml, GitLab automaticamente detecta e executa seu pipeline.

#5 Criação de Pipeline

Todo List - Aplicação Completa para Provisionamento

Uma 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

Visão Geral

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

🛠️ Tecnologias Utilizadas

Backend

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

Frontend

Angular 18 - Framework frontend

TypeScript - Linguagem de programação

SCSS - Pré-processador CSS

Angular Material - Componentes UI

RxJS - Programação reativa

 

DevOps e Infraestrutura

Docker - Containerização

Docker Compose - Orquestração de containers

Nginx - Servidor web para frontend

GitHub Actions - CI/CD pipeline

Make - Automação de tarefas

Ferramentas de Qualidade

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

 

📋 Pré-requisitos

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)

 

Para desenvolvimento local (opcional):

Python 3.11+

Node.js 20+

PostgreSQL 15+

 

#6 Provisionando uma aplicação
#6 Provisionando uma aplicação

Arquitetura da solução

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   Frontend      │    │    Backend      │    │   Database      │
│   (Angular)     │◄──►│   (Django)      │◄──►│  (PostgreSQL)   │
│   Port: 80      │    │   Port: 8000    │    │   Port: 5432    │
└─────────────────┘    └─────────────────┘    └─────────────────┘
         │                       │                       │
         └───────────────────────┼───────────────────────┘
                                 │
                    ┌─────────────────┐
                    │     Docker      │
                    │   Containers    │
                    └─────────────────┘




Referências

Referências

eTech - Provisionamento de Aplicações

By Vanilton Pinheiro

eTech - Provisionamento de Aplicações

Compreender e desenvolver a capacidade de aplicar os conceitos, técnicas, métodos e ferramentas para a manutenção dos artefatos relacionados ao desenvolvimento de software.

  • 931