저번 포스팅에서 AWS EC2에 Docker 및 Docker-Compose를 설치했습니다. 이번에는 실제 SpringBoot 프로젝트를 EC2 위에 올리겠습니다. 과정을 간단하게 요약하면, 다음과 같습니다.
1. Docker 이미지로 build
2. Docker 이미지 Dockerhub에 push
3. docker-compose.yml 파일 정의 및 git push
4. EC2 서버에서 해당 Github Repository Clone 및 실행
이번 포스팅에서는 간단하게 EC2에서 서버를 실행하는 정도만 구현하고, 이후에 추가로 CI/CD를 고려하여 리팩토링할 예정입니다.
build를 수행하기 전, build folder를 한번 제거하여 빌드 이전 상태로 만들어줍니다.
$ ./gradlew clean

그 다음으로 프로젝트를 build 해줍니다.
$ ./gradlew build

위 과정에서 오류가 발생했었으며, 관련 내용은 아래의 링크를 참조 바랍니다.
⚠️ Trouble-Shooting
Dockerfile을 정의해줍니다.
FROM openjdk:17-jdk-slim
COPY build/libs/graduationgoodbye-0.0.1-SNAPSHOT.jar ggb.jar
ENTRYPOINT ["java", "-jar", "ggb.jar"]
FROM : 베이스 이미지를 지정합니다., OpenJDK17 버전의 경량화된(slim) 이미지입니다.COPY : jar 파일을 Docker image에 복사 후 포함시킵니다. 이 때, 이름을 "ggb.jar" 이름으로 복사합니다.ENTRYPOINT : 컨테이너 시작 시 실행할 명령어를 지정합니다. 즉, 컨테이너 시작 시마다 실행되는 명령어를 정의합니다.마지막으로, .jar 파일을 docker 이미지로 빌드해줍니다.
$ docker build -t 계정명/이미지명:버전명
-t : 이미지 이름을 붙여주는 옵션dockerhub에 이미지를 push하기 위해서는 다음과 같은 명령어를 입력해주면 됩니다.
docker push 계정명/레포지토리명:버전명
위에서 레포지토리명 입력 시 계정명으로 넣어주지 않으면, dockerhub로 접근이 불가능하게 됩니다. 따라서 Docker 이미지 빌드 시 잘 확인해줘야 합니다.
version: '3'
services:
db:
container_name: mysql
image: mysql:8.4
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=test
ports:
- "13306:3306"
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- ./data/test:/var/lib/mysql
app:
container_name: ggb
image: kimhyensu/ggb:1.0
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/test?useSSL=false
- SPRING_DATASOURCE_USERNAME=root
depends_on:
- db
healthcheck:
test: if netstat -ltn | grep -c "8080"; then echo 0; else echo 1; fi
interval: 10s
timeout: 5s
retries: 2
version : Docker Compose 버전을 정의합니다.sevices : 실행할 서비스를 정의합니다.{서비스명} : 사용할 서비스 명을 정의합니다.image : base 이미지를 정의합니다.ports : git clone을 사용하여 필요한 프로젝트를 github 레포지토리로 부터 가져옵니다.
그 다음 docker-compose -d up 명령어를 통해서 서버를 실행시켜줍니다.
정상적으로 서버가 기동된 것을 확인할 수 있습니다.

이번 포스팅을 끝으로 EC2에 SpringBoot 프로젝트를 올려 배포하는 과정에 대해서 정리하였습니다. 처음 AWS EC2와 Docker 및 Docker-Compose를 사용하여 배포를 경험해봤습니다. 추후 Jenkins를 사용하여 CI/CD 구축 후 개발 과정에 들어갈 예정이므로, 관련된 구현 과정들도 기록하도록 하겠습니다.