0️⃣ 들어가기 전
Git + Jenkins + Docker로 서버와 CI/CD구축하기 에서는 만들어진 Spring boot Docker 이미지를 바탕으로 CI/CD 할 수 있도록 Jenkins 서버를 구축해보았습니다.
이번에는 이 CI/CD를 적용할 Spring boot 프로젝트를 Docker 이미지로 빌드하는 과정을 기록해보겠습니다.
✔️ 서버 구성
1️⃣ EC2 서버 설정
1. 필요 패키지 설치
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install build-essential
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
2. docker 설치
$ sudo wget -qO- <https://get.docker.com/> | sh
$ sudo systemctl start docker
$ sudo systemctl enable docker
✔️docker group 설정
sudo를 사용하지 않고 docker 명령어를 사용하기 위해서는 현재 사용자계정을 docker group에 포함시켜주면 됩니다. sudo는 관리자의 권한을 사용하기 위한 명령어이므로, 꼭 필요한 계정에만 docker group을 설정해주어야 합니다.
$ sudo usermod -aG docker ${USER}
$ id -nG
3. 서버 설정 - swap 설정
EC2 프리티어를 사용하는 경우, swapfile을 설정해주어야 spring project를 build하는 과정에서 서버가 뻗지 않습니다.
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -s
$ sudo vi /etc/fstab
# 입력값
/swapfile swap swap defaults 0 0
$ free -m
2️⃣ docker에 network + mysql 설정
제 프로젝트의 경우 Spring boot가 정상적으로 작동하기 위해서 다음의 컨테이너가 필요합니다.
- spring boot (jar)
- mysql
- swagger : 스웨거 사용 → 컨테이너 분리
✔️ docker network
도커 컨테이너는 기본적으로 격리된 환경에서 돌아가기 때문에, 다른 컨테이너와 통신이 불가능합니다. 이 때 컨테이너들을 같은 docker network에 연결하면 서로 통신이 가능해집니다.
즉, docker network는 같은 호스트 내에서 실행중인 컨테이너 간 연결할 수 있도록 돕는 논리적 네트워크입니다.
이 때, 컨테이너를 하나하나 직접 run하는 방법보다 docker-compose를 사용하면 더 상세하고 보기 쉽게 컨테이너 설정한 뒤 여러 컨테이너들을 간단한 명령어로 띄울 수 있습니다.
또한 docker-compose에서 설정한 services(컨테이너)들은 설정이 없을 때 같은 docker network에서 작동합니다.
✔️ docker run 명령어
$ docker run --name {컨테이너 이름} -p 3306:3306 --network {네트워크 이름} -e MYSQL_ROOT_PASSWORD={root 팩스워드} -e MYSQL_DATABASE={db 명} -e MYSQL_USER={username} -e MYSQL_PASSWORD={password} -d {mysql 이미지}
✔️ docker compose 명령어
$ docker compose up -d —build
2️⃣ Spring Boot 프로젝트 도커 이미지 생성
아래의 작업들은 local에서 진행합니다.
1. docker hub 로그인
$ docker login --username {도커허브username}
2. 프로젝트 사전 설정
✔️ application.yml
spring:
datasource:
url: jdbc:mysql://{docker mysql container이름}:3306/{db 이름}
username: {mysql username}
password: {mysql password}
driver-class-name: com.mysql.cj.jdbc.Driver
다른 컨테이너간 통신이 필요할 경우, Docker의 DNS가 동적으로 매핑해주기 때문에 컨테이너의 이름을 IP로 사용할 수 있습니다. 직접 mysql-container의 IP 주소를 입력해도 됩니다.
✔️ Dockerfile
# jdk17 image start
FROM openjdk:17
# 변수 선언 - JAR_FILE
ARG JAR_FILE=build/libs/*.jar
# 호스트 파일/디렉토리를 도커이미지로 복사 - 로컬의 JAR_FILE 디렉토리를 도커이미지의 app.jar로 복사
COPY ${JAR_FILE} app.jar
# 컨테이너 시작 시 스크립트 실행 -> 아래의 자바파일 실행
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-Dspring.config.location=file:/config/application-prod.yml", "-jar", "app.jar"]
Dockerfile은 해당 프로젝트를 docker 이미지로 빌드할 때 사용하는 파일입니다.
- "-Dspring.profiles.active=prod" 원하는 profile(application.yml)만 동작할 수 있도록 설정할 수 있습니다.
- "-Dspring.config.location=file:/config/application-prod.yml" yml 파일의 위치를 지정해줄 수 있습니다.
3. 프로젝트를 도커 이미지로 빌드
✔️ gradlew (jar파일) 빌드
$ ./gradlew clean build -x test
✔️ docker image 생성
$ docker build -t {이미지명} .
✔️ docker hub에 이미지 push
$ docker image push {이미지명}
4️⃣ Spring 이미지 다운로드 및 컨테이너 생성
3️⃣ 까지의 과정을 거치면, Spring 프로젝트의 이미지를 docker hub에서 확인할 수 있습니다.
✔️ docker hub에서 만들어진 이미지 확인 및 pull
$ docker pull {이미지명}
✔️ 이미지로 docker 컨테이너 생성
$ docker run -p 8080:8080 --name {컨테이너명} --network {네트워크명} -d {이미지명}
컨테이너가 동작하면 이제 spring boot 서버가 빌드됩니다.
✔️ 로그 확인
빌드 과정을 확인하고 싶다면 아래의 명령어로 로그를 확인할 수 있습니다.
$ docker logs {컨테이너명}
'백엔드 Backend > 서버 Server' 카테고리의 다른 글
Spring Cloud Config - 분산 시스템 설정 관리 (0) | 2025.01.14 |
---|---|
Eureka + Spring Cloud Gateway 구현하기 (0) | 2025.01.07 |
API 게이트웨이 서비스 - (2) Spring Cloud Gateway (0) | 2025.01.06 |
API 게이트웨이 서비스 - (1) Netfilx Zuul (1) | 2025.01.06 |
Git + Jenkins + Docker로 서버와 CI/CD구축하기 (0) | 2024.08.02 |