우선, 나는 AWS, Docker, Jenkins를 사용해서 배포 및 CI/CD를 적용해 줄 것이다. 우선, AWS는 클라우드 인프라를 위해서, Docker는 애플리케이션 컨테이너화를 위해서, Jenkins는 CI/CD를 위해서 사용하기로 하였다.
Jenkins
- 지속적 통합 및 배포 자동화
- 코드 변경 사항 자동 감지 및 빌드
- 배포 프로세스 자동화
Docker
- 애플리케이션과 그 종속성을 컨테이너로 패키징
- 일관된 환경에서 애플리케이션 실행 가능
- Dockerfile이 이미지를 만들고, docker 이미지가 jar파일을 가지고 있음. 그리고 컨테이너는 이 이미지들(프론트, 백)을 모아서 실행되도록 하는 것
AWS
- 확장성과 유연성이 높은 인프라 환경 제공
- Docker 컨테이너는 AWS의 가상 머신(EC2)
1. EC2 인스턴스 생성
ubuntu로 생성해 주었다. 이후 콘솔에 접속해 준다.
2. Docker 설치
- ubuntu에서 패키지를 다운받을 때 사용하는 apt 업데이트
sudo apt update
- Docker 설치
sudo apt install docker.io
sudo apt install docker-compose
- git 설치(기본적으로 설치되어 있어서 없는 경우만 설치)
3. Git Repository Clone
- 사용하려는 브랜치로 가서 clone
sudo git clone {git 경로} --branch {브랜치명} --single-branch
single-branch 옵션을 지정하면 지정한 브랜치만 클론 할 수 있다.
4. Docker 컨테이너 실행
Docker를 사용하여 컨테이너 기반으로 앱을 실행시켜야 함
1. jar파일 생성 : 우측 Gradle -> Tasks -> build -> bootJar 클릭
- 프로젝트 경로로 들어가서 jar파일 확인 : 프로젝트명/build/libs(필수 과정 아님. 잘 되는지 확인한것)
- EC2에서 jar파일 생성 : git clone을 받아온 root directory로 이동해서 JAR 파일 빌드
- test code를 제외하고 gradle build
./gradlew clean build -x test
이후 cd build/libs로 확인해보면 jar파일이 생성된 것을 알 수 있다.
- EC2에서 jar파일이 있는 디렉토리로 이동한 후 Dockerfile 생성(백엔드)
- JAVA 애플리케이션을 컨테이너에서 쉽게 실행할 수 있도록 필요한 환경을 설정하고, 애플리케이션 코드를 복사한 후 실행하는 과정을 자동화함
- Jenkins에서 Docker명령어를 추가하고, 그럼 코드의 변경이 감지되었을 때 Dockerfile이 실행되는 것
- dockerfile은 docker 이미지를 생성하는 것
# 1. 베이스 이미지 설정
FROM openjdk:17-jdk-slim
# 2. 작업 디렉토리 설정.만들면 여기로 들어옴
WORKDIR /app
# 3. JAR 파일 복사
COPY build/libs/프로젝트 파일.jar app.jar
# 4. 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
베이스 이미지 설정
- Docker의 기반이 될 이미지를 지정하는 것
- Java 애플리케이션을 실행하기 위해 OpenJDK 17사용
작업 디렉토리 설정
- 컨테이너 내에서 작업할 디렉토리를 /app으로 설정
- 이후의 명령은 이 디렉토리 내에서 실행됨
- 일반적으로 /app 이라는 디렉토리를 사용하는 것이 관례
JAR 파일 복사
- JAR 파일을 컨테이너의 /app 디렉토리로 복사
애플리케이션 실행
- 컨테이너가 시작될 때 실행할 명령 지정
- 위의 코드에서는 java -jar app.jar라는 명령어가 실행됨
- 도커 로그인 및 현재 사용자를 Docker 그룹에 추가
sudo usermod -aG docker 현재사용자
- 로그인(추가 후 재부팅 한 다음에 로그인 해야 함)
docker login
- Docker 이미지 빌드
docker build -t <이미지_이름>:<태그> .
- 태그를 지정해 주지 않으면 latest라는 이름이 자동으로 할당되지만, 명시적으로 태그를 지정하는 것이 좋음
- 도커 이미지 확인
docker images
- MySQL 연동
docker run --name mysql_container -e MYSQL_ROOT_PASSWORD=비밀번호 -e MYSQL_DATABASE=데이터베이스명 -p 3306:3306 -d mysql:latest
- Docker 컨테이너 실행
docker run -d -p 호스트 포트:컨테이너 포트 --name <컨테이너_이름> <이미지_이름>:<태그>
- 호스트 포트 : 도커가 실행되고 있는 컴퓨터의 포트. 호스트의 8080포트를 외부에서 접근할 수 있게 설정
- 컨테이너 포트 : 컨테이너에서 실행 중인 애플리케이션이 사용하는 포트. 호스트의 포트에 접속하면 컨테이너의 포트로 요청이 전달되어 애플리케이션이 응답
mysql설정해주기. localhost는 안됨. 그리고 비번 설정도 해 주어야 함(현재는 비번이 설정돼있지 않는데 properties 파일에는 설정돼있어서 그럼)