Jenkins na AWS + Docker
Source: Dev.to

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.

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.

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!