Jenkins na AWS + Docker

Published: (December 3, 2025 at 03:33 PM EST)
3 min read
Source: Dev.to

Source: Dev.to

Cover image for Jenkins na AWS + Docker

Introdução

Olá, sou William, Líder de squad na InnSpire.dev. Quero começar a escrever sobre minhas experiências no mundo da tecnologia. São mais de 20 anos trabalhando nessa área e, embora seja um pouco tarde, como dizem: antes tarde do que mais tarde ainda.

Escolhi começar com uma das ferramentas que mais me deu dor de cabeça — e também as maiores vitórias: Jenkins. Já perdi dados, quebrei pipelines e passei madrugadas resolvendo builds travados… hoje, porém, tenho uma infraestrutura estável, barata e eficiente rodando na AWS.

Neste artigo mostro como estruturamos Jenkins + Docker + AWS e compartilho alguns insights para quem quiser montar algo parecido.

Infraestrutura na AWS

Atualmente nosso servidor está na região da Virgínia (us-east-1), em uma instância t3a.medium com 2 vCPU e 4 GB de memória. Dentro dela está instalado o Ubuntu 24.04 Server, que gosto de usar por ser versátil.

CPU e memória do servidor

O servidor está rodando há algum tempo sem interrupções. Apesar da memória estar bem utilizada, todos os serviços dentro da máquina funcionam bem, pois tudo está encapsulado em containers. No momento temos 21 containers em execução.

Lista de containers

Dos 21 containers, 2 são instalações do Jenkins (com jobs e propósitos diferentes), 2 são agentes de build (um para cada Jenkins) e outros dois são essenciais para o fluxo:

  • Nginx – gerencia o roteamento.
  • Portainer – monitora a saúde dos containers.

A separação em dois Jenkins permite que dois times distintos trabalhem de forma totalmente isolada e possam destruir seu ambiente sem impactar o outro. O Docker simplifica bastante esse isolamento.

Lista de containers

Configuração do Jenkins

No docker‑compose.yml mapeamos os diretórios que serão acessados pelo Jenkins e pelos agentes. Uma particularidade importante é o mapeamento do socket Docker (/var/run/docker.sock). Isso permite que, dentro de alguns jobs, possamos reiniciar containers – algo impossível sem esse acesso.

# docker-compose.yml
services:
  jenkins:
    build: .
    container_name: jenkins-innova
    restart: always
    privileged: true
    ports:
      - "3001:8080"
      - "50000:50000"
    volumes:
      - jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - innova-network

  jenkins-innova-agent:
    image: jenkins/inbound-agent
    container_name: jenkins-innova-agent
    networks:
      - innova-network
    volumes:
      - /srv/jenkins-innova:/home/jenkins/agent-workspace
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      JENKINS_URL: "http://jenkins-innova:8080"
      JENKINS_AGENT_NAME: "agent"
      JENKINS_SECRET: "chave"
    restart: unless-stopped

volumes:
  jenkins_home:

networks:
  innova-network:
    external: true

Dockerfile

# Dockerfile
FROM jenkins/jenkins:alpine3.21-jdk21

USER root

# Instalar dependências sem modificar o Java existente
RUN apk add --no-cache \
    sudo \
    docker-cli \
    git \
    bash \
    curl \
    ttf-dejavu

# Adicionar usuário Jenkins ao grupo Docker
RUN addgroup -S docker && adduser jenkins docker \
    && echo "jenkins ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/jenkins

USER jenkins

Conclusão

A partir daqui, a configuração funciona sem maiores problemas. Se quiser que eu detalhe como configuramos os jobs no Jenkins, deixe um comentário!

Back to Blog

Related posts

Read more »

Terraform Project: Simple EC2 + Security Group

Project Structure terraform-project/ │── main.tf │── variables.tf │── outputs.tf │── providers.tf │── terraform.tfvars │── modules/ │ └── ec2/ │ ├── main.tf │...