AWS와 Docker에서 Jenkins

발행: (2025년 12월 4일 오전 05:33 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Jenkins와 AWS + Docker 커버 이미지

소개

안녕하세요, 저는 InnSpire.dev의 스쿼드 리더 William입니다. 기술 분야에서의 경험을 기록하기 시작하려 합니다. 이 분야에서 20년 넘게 일했으며, 비록 시작이 다소 늦었지만, 흔히 말하듯 늦게 시작하는 것이 영원히 시작하지 않는 것보다 낫다는 생각으로 글을 씁니다.

제가 가장 두통을 겪었던 도구 중 하나이자 가장 큰 성공을 거둔 도구인 Jenkins부터 시작하려 합니다. 데이터를 잃어버리고, 파이프라인을 깨뜨리며, 빌드가 멈춰 있는 상황을 새벽까지 해결한 적도 있습니다… 하지만 이제는 AWS에서 안정적이고 저렴하며 효율적인 인프라를 운영하고 있습니다.

이 글에서는 Jenkins + Docker + AWS를 어떻게 구성했는지 보여주고, 비슷한 환경을 만들고 싶은 분들을 위해 몇 가지 인사이트를 공유합니다.

AWS 인프라

현재 저희 서버는 버지니아(us-east-1) 리전의 t3a.medium 인스턴스에 위치하고 있으며, 2 vCPU와 4 GB 메모리를 가지고 있습니다. 이 인스턴스에는 Ubuntu 24.04 Server가 설치되어 있는데, 다목적이라서 즐겨 사용합니다.

서버의 CPU와 메모리

서버는 오랜 기간 중단 없이 운영되고 있습니다. 메모리 사용량이 높은 편이지만, 모든 서비스가 컨테이너 안에 캡슐화돼 있기 때문에 문제없이 동작합니다. 현재 21개의 컨테이너가 실행 중입니다.

컨테이너 목록

21개의 컨테이너 중 2개는 서로 다른 작업과 목적을 가진 Jenkins 인스턴스이며, 2개는 각각의 Jenkins를 위한 빌드 에이전트입니다. 나머지 두 개는 흐름에 필수적인 역할을 합니다:

  • Nginx – 라우팅을 관리합니다.
  • Portainer – 컨테이너 상태를 모니터링합니다.

두 개의 Jenkins를 분리함으로써 서로 다른 팀이 완전히 격리된 환경에서 작업할 수 있고, 서로의 환경을 파괴해도 영향을 주지 않게 됩니다. Docker가 이러한 격리를 크게 단순화해 줍니다.

컨테이너 목록

Jenkins 설정

docker‑compose.yml 파일에서는 Jenkins와 에이전트가 접근할 디렉터리를 매핑합니다. 중요한 점은 Docker 소켓( /var/run/docker.sock)을 매핑한다는 것입니다. 이를 통해 일부 잡(job) 안에서 컨테이너를 재시작할 수 있게 되며, 소켓 접근이 없으면 불가능한 작업입니다.

# 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

# 기존 Java를 건드리지 않고 의존성 설치
RUN apk add --no-cache \
    sudo \
    docker-cli \
    git \
    bash \
    curl \
    ttf-dejavu

# Jenkins 사용자를 Docker 그룹에 추가
RUN addgroup -S docker && adduser jenkins docker \
    && echo "jenkins ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/jenkins

USER jenkins

결론

이 시점부터는 별다른 문제 없이 설정이 동작합니다. Jenkins 잡(job) 설정 방법을 자세히 알고 싶으시면 댓글을 남겨 주세요!

Back to Blog

관련 글

더 보기 »