이전에는 AWS Elastic Beanstalk으로 배포를 해봤다가
이번엔 AWS EC2와 Docker를 사용하여 아예 다른 방식으로 배포를 하게 되어 적어본다!
나는 항상 로컬에서 Jar 파일 실행과 도커 컨테이너 실행까지 해보고 나서 문제가 없음을 확인한 후, 배포를 시작한다.
Jar 파일 생성 및 실행
- Gradle- Tasks- build
- bootJar 더블 클릭
- build- libs
- ~SNAPSHOT.jar 파일 생성 완료
- jar 파일 실행하여 확인
도커 컨테이너 실행
- Dockerfile 작성 (프로젝트 루트 위치)
-
FROM openjdk:17-jdk LABEL maintainer="yubin" ARG JAR_FILE=build/libs/*.jar ADD ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
-
- Dockerfile 빌드해서 이미지 생성
- 터미널에 docker build -t 이미지이름 . 입력하기
- 도커 컨테이너 실행
- 터미널에 docker run -p 8080:8080 이미지이름 입력하기
- 여기서 8080:8080 란?
- 호스트포트:컨테이너포트
- 도커 컨테이너의 8080 포트를 로컬의 8080 포트와 매핑하겠다 라는 뜻!
- 여기서 8080:8080 란?
- 터미널에 docker run -p 8080:8080 이미지이름 입력하기
- 어플리케이션 실행 확인
로컬에서 Jar와 도커 실행까지 완료 후 이상없으면!
이제 Docker hub에 도커 이미지를 올려보자
Docker hub에 도커 이미지 Push
- Docker Hub 로그인
- 터미널에 docker login -u 유저아이디 입력하기
- 패스워드 입력
- 도커 이미지 build
- 터미널에 docker build -t 유저아이디/이미지이름 . 입력하기
- 도커 이미지 목록 확인
- 터미널에 docker images 입력하기
- 도커 이미지 Docker Hub에 push
- 터미널에 docker push 유저아이디/이미지이름:latest 입력하기
- Docker Hub나 Docker Desktop 에서 Push 내역 확인 가능
이제 Putty를 사용하여 EC2 터미널에 접속하자.
EC2 생성은 넘어가겠다!
EC2에 Docker 사용하여 배포
- EC2 접속
- Putty 접속
- Host Name
- ec2-user@IP주소(EC2 IP주소)
- SSH- AUTH- Credentials
- ppk 파일 등록
- EC2에 도커 설치
- 터미널에 sudo yum install docker 입력하기
- 도커 실행
- 터미널에 sudo systemctl start docker 입력하기
- Docker Hub 로그인
- 터미널에 sudo docker login 입력하기
- 아이디 입력
- 비밀번호 입력
- 터미널에 sudo docker login 입력하기
- 도커 이미지 pull 해오기
- 터미널에 sudo docker pull 유저아이디/이미지이름:latest 입력하기
- 해당 도커 이미지로 배포하기
- 터미널에 sudo docker run -d -p 8080:8080 유저아이디/이미지이름:latest 입력하기
- EC2 IP 접속하여 스프링부트 실행 및 배포 확인 (Postman 등)
이제 단일 배포는 끝!
자동 배포로 넘어갑니다.
Github Action을 사용한 자동 배포 구축
- Github Secrets 생성
- Github- Settings- Secrets and variables
- New repository secret에서 IAM 권한 액세스 키 저장
- APPLICATION_YML
- DOCKER_PASSWORD
- DOCKER_USERNAME
- EC2_HOST
- AWS EC2의 퍼블릭 IPv4 DNS
- EC2_SSH_KEY
- AWS EC2의 pem 전체 복사 후 붙여넣기
- Github Action 스크립트 사용 예시
- ${{ secrets.APPLICATION_YML }}
- Github Action 스크립트 작성
- 예시 deploy.yml
-
name: CI/CD with Gradle on: push: branches: ["main"] pull_request: branches: ["main"] permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: "17" distribution: "temurin" - name: make application yml run: | mkdir -p src/main/resources echo "${{ secrets.APPLICATION_YML }}" | base64 --decode > src/main/resources/application.yml find src shell: bash - name: Build with Gradle run: | chmod +x ./gradlew ./gradlew clean build -x test - name: Docker build & push to docker repo run: | docker login -u ${{ secrets.DOCKER_USERNAME_YUB }} -p ${{ secrets.DOCKER_PASSWORD_YUB }} docker build -f Dockerfile -t "${{ secrets.DOCKER_USERNAME_YUB }}/hanafun:latest" . docker push "${{ secrets.DOCKER_USERNAME_YUB }}/hanafun:latest" - name: Deploy to server uses: appleboy/ssh-action@master with: host: ${{ secrets.EC2_HOST }} username: ec2-user key: ${{ secrets.EC2_SSH_KEY }} script: | sudo docker ps sudo docker pull "${{ secrets.DOCKER_USERNAME_YUB }}/hanafun:latest" sudo docker stop hanafun sudo docker rm hanafun sudo docker run -d -p 8080:8080 --name hanafun "${{ secrets.DOCKER_USERNAME_YUB }}/hanafun:latest" sudo docker image prune -f
-
- 예시 deploy.yml
- main 브랜치로 push 후 확인
이렇게하면 AWS EC2 + Docker + Github Actions 를 이용한 배포 및 자동 배포까지 구축 완료!
728x90
'Computer Science > CI&CD' 카테고리의 다른 글
[CI/CD] Nginx를 사용한 https 적용 방법 (0) | 2024.07.05 |
---|---|
[CI/CD] 도커 데스크탑 무한 로딩일 때 (Docker Desktop - Unexpected WSL error, Error: 0x80070002) (1) | 2024.06.30 |
[CI/CD] AWS RDS DB 생성, 설정, 접속 (0) | 2024.05.25 |
[CI/CD] AWS EC2 인스턴스 생성, 접속, 설정, 스프링부트 프로젝트 배포 (0) | 2024.05.24 |
[CI/CD] Github 레포지토리에 올라간 코드에서 한글이 깨져 나올 때 (yaml 파일) (2) | 2024.03.27 |