📚 t3.medium 타입 이상이 필요한 이유
- 지금 여기서는 Jenkins 와 Java 를 Docker Continer 로 띄우는 것이 목적입니다.
- 일단 Docker 를 설치하고 실행하게 되면, 1GB 의 메모리는 부족합니다.
- t3.micro 또는 t3.small 타입의 메모리는 1GB 입니다.
- t3.micro 와 t3.small 타입은, Jenkins UI 가 매우 느렸으며, 수시로 서버가 죽는 현상을
경험하였습니다. 특히 Jenkins 의 경우 컨테이너로 띄우는 경우, 최소 4기가의 램이 있어야 합니다.
보안 그룹 설정
Jenkins 와 개발서버에 대해서 동일한 보안 그룹을 사용하였습니다.
필요에 따라서 보안 그룹을 나누어서 설정할 수 있습니다.
사용자 지정 TCP 8080 port *Jenkins 는 일반적으로 8080 포트 샤용
SSH 22 port * SSH 접속을 위해서
RDS 에 대한 보안 그룹 생성 후, Inbound 규칙에서 개발 서버의 보안 그룹 허용
개발 서버 보안그룹
RDS 보안그룹
개발 서버와 Jenkins 서버에 대해서 탄력적 IP(EIP) 적용하기
서버 접속 및 코드 상에서 IP 입력 부분에서 매번 변경하지 않도록, 고정 IPv4 를 생성하여, 각 인스턴스에 연결해줍니다.
📚 EIP 는 인스턴스와 연결 중일 때는 한 개 까지 무료이며, 연결되지 않은 상태로 두면 요금 부과
2️⃣ Jenkins 서버에 기본 환경 설치 (EC2 #1)
Jenkins 와 개발 서버에 대한 EC2는 Ubuntu 24 버전 이미지를 사용하여 생성하였습니다.
SSH 접속 후 Docker & Compose 설치:
3️⃣ Jenkins Dockerfile / Docker Compose 세팅
Dockerfile
jenkins-plugin.txt:
jenkins-plugin.txt 를 통해서, Java Springboot 앱의 CI/CD 에 필요한 플러그인을, 미리 설치해줍니다.
Docker compose 파일
네임드 볼륨 jenkins_home 를 생성하여 관리합니다.
📦 네임드 볼륨(named volume)을 사용하는 이유
Docker 가 직접 관리 → 성능 최적화
네임드 볼륨은 Docker 엔진이 /var/lib/docker/volumes/ 아래에서 직접 관리합니다.
로컬 디스크와 달리 OverlayFS 최적화가 적용되어 입출력(I/O) 속도가 더 빠릅니다.
Jenkins처럼 수많은 작은 파일(플러그인 캐시, 빌드 로그 등)을 다루는 경우 성능 차이가 큽니다.
# 1. 패키지 리스트 업데이트 & 보안 업데이트 적용
sudo apt update && sudo apt upgrade -y
# → 최신 보안 패치와 패키지 리스트를 갱신합니다.
# 2. 필수 패키지 설치 (HTTPS 저장소 접근, GPG 키 등록 등에 필요)
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
# 3. Docker 공식 GPG 키를 받아서 시스템에 등록
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# → Docker 패키지가 위조되지 않았음을 검증하기 위한 키 등록
# → /usr/share/keyrings/docker-archive-keyring.gpg 파일 생성됨
# 4. Docker 공식 저장소 추가
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# → apt가 Docker 공식 저장소에서 패키지를 가져올 수 있도록 등록
# 5. 패키지 리스트 다시 업데이트 (Docker 저장소 반영됨)
sudo apt update
# 6. Docker 엔진 및 CLI 설치
sudo apt install -y docker-ce docker-ce-cli containerd.io
# → docker-ce: Docker Community Edition 엔진
# → docker-ce-cli: Docker CLI (docker 명령어)
# → containerd.io: 컨테이너 런타임
# 7. 현재 사용자에게 docker 그룹 권한 부여 - 중요함
sudo usermod -aG docker $USER
# → sudo 없이 `docker ps` 같은 명령 실행 가능
# (적용하려면 로그아웃/로그인 필요 or `newgrp docker` 실행)
# 8. Docker 버전 확인
docker --version
# → Docker 엔진이 정상 설치되었는지 확인
# 9. Docker Compose v2 플러그인 설치 (공식 권장 방식)
sudo apt install -y docker-compose-plugin
# → 설치 후 `docker compose` 명령으로 사용 가능 (공백 있는 방식)
# 10. Docker Compose 버전 확인
docker compose version
# → Compose v2 버전 출력 확인
# Jenkins LTS + JDK 21 기반 이미지
FROM jenkins/jenkins:lts-jdk21
# root 권한 유지 (패키지 설치 및 플러그인 설치용)
USER root
# 기본 유틸 설치
RUN apt-get update && apt-get install -y \
git \
curl \
unzip \
&& rm -rf /var/lib/apt/lists/*
# 플러그인 목록 복사 및 설치
COPY docker-dev/jenkins-plugin.txt /usr/share/jenkins/ref/jenkins-plugin.txt
RUN jenkins-plugin-cli --plugin-file /usr/share/jenkins/ref/jenkins-plugin.txt
# jenkins 사용자로 다시 전환
USER jenkins
# 📂 프로젝트 구조 관리
cloudbees-folder
# 🔐 보안
antisamy-markup-formatter
credentials-binding
# 🔄 파이프라인 & GitHub 통합
workflow-aggregator
github-branch-source
git
# 🛠️ 빌드 도구
gradle
# 📡 원격 배포/에이전트
ssh-slaves
# 📧 알림
email-ext
# ⚙️ 운영 편의
timestamper
ws-cleanup
build-timeout
pipeline-graph-view
matrix-auth
ubuntu@ip-172-31-44-221:~/jenkins$ docker compose up -d
WARN[0000] /home/ubuntu/jenkins/docker-compose.yml: the attribute version is obsolete, it will be ignored, please remove it to avoid potential confusion
unable to get image 'jenkins/jenkins:lts-jdk21': permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.51/images/jenkins/jenkins:lts-jdk21/json": dial unix /var/run/docker.sock: connect: permission denied
permission denied while trying to connect to the Docker daemon socket
unix:///var/run/docker.sock: connect: permission denied