Jenkins 在 AWS + Docker
Source: Dev.to

简介
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.
翻译
大家好,我是 William,InnSpire.dev 的小组负责人。我想开始写下自己在技术领域的经验。我已经在这个行业工作了超过 20 年,虽然有点晚,但正如人们所说:迟做总比更迟好。
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.
翻译
我选择从最让我头疼——也是收获最大胜利的工具开始:Jenkins。我曾经丢失数据、破坏流水线,甚至熬夜解决卡住的构建……但今天,我已经在 AWS 上拥有了一套稳定、低成本且高效的基础设施。
Neste artigo mostro como estruturamos Jenkins + Docker + AWS e compartilho alguns insights para quem quiser montar algo parecido.
翻译
本文将展示 我们是如何搭建 Jenkins + Docker + AWS 的,并分享一些想要构建类似系统的人的经验。
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.
翻译
目前我们的服务器位于弗吉尼亚地区(us-east-1),使用 t3a.medium 实例,配备 2 vCPU 和 4 GB 内存。服务器上安装了 Ubuntu 24.04 Server,我喜欢它的通用性。

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.
翻译
服务器已经连续运行了一段时间,没有出现中断。虽然内存使用率较高,但机器内的所有服务都运行良好,因为所有内容都被封装在容器中。目前我们运行着 21 个容器。
容器列表
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.
翻译
在这 21 个容器中,有 2 个 Jenkins 实例(各自拥有不同的任务和目的),2 个构建代理(每个 Jenkins 各一个),另外还有两个对工作流至关重要的容器:
- Nginx – 负责路由管理。
- Portainer – 监控容器健康状态。
将 Jenkins 拆分为两个实例,使得两个团队可以完全隔离地工作,并且可以在不影响对方的情况下销毁自己的环境。Docker 极大地简化了这种隔离。

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 中,我们映射了 Jenkins 与代理需要访问的目录。一个重要的细节是映射 Docker 套接字 (/var/run/docker.sock)。这使得某些任务能够重启容器——如果没有此访问权限,这是不可能的。
# 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
结论
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!
翻译
从此以后,整个配置可以平稳运行。如果你想了解我们是如何在 Jenkins 中配置任务的,欢迎留言!