[Spring] Docker을 활용한 EC2 배포
Docker을 활용한 EC2 배포
배포 Flow
1
2
3
4
1. dockerfile을 작성한 후, 빌드하여 docker image를 생성.
2. docker image 파일을 docker hub에 push.
3. 서버(AWS EC2)에서 docker hub에 있는 docker image를 pull.
4. docker run 명령어로 docker image를 실행.
[1] Spring Boot 프로젝트 생성
[2] Dockerfile 생성
[3] gradle build
- Intellij 터미널에서 다음 명령어 실행
./gradlew build -x test (-x test: 테스트 실행 X)
명령어를 통해서 build 실행- build > libs > jar 파일 생성된 것을 볼 수 있다
[4] Docker Hub > 회원가입 > 로그인
[5] Docker Hub Repository 생성
[6] Docker Image Build
- Intellij 터미널에서 다음 명령어 실행
1 2
# docker build --build-arg DEPENDENCY=build/dependency -t (도커 허브 ID)/(Repository 이름) . docker build --build-arg DEPENDENCY=build/dependency -t eunchaelyu/eroom .
트러블 슈팅 1
[7] Docker Image push
[8] EC2에 Docker 설치 및 실행
AWS EC2 인스턴스가 있다고 가정하고 진행
Ubuntu 환경 명령어 패키지 업데이트 sudo apt-get update -y 기존에 있던 도커 삭제 sudo apt-get remove docker docker-engine docker.io -y 도커 설치 sudo apt-get install docker.io -y docker 서비스 실행 sudo service docker start /var/run/docker.sock 파일의 권한을 666으로 변경하여 그룹 내 다른 사용자도 접근 가능하게 변경 sudo chmod 666 /var/run/docker.sock eunchaelyu 유저를 docker 그룹에 추가 sudo usermod -a -G docker eunchaelyu
[9] Docker image pull 및 애플리케이션 배포
1
sudo docker pull (도커 허브 ID)/(Repository 이름)
1
sudo docker run -p 8080:8080 (도커 허브 ID)/(Repository 이름)
트러블 슈팅 2
- 1) 사용자 지정 Dockerfile을 생성하여 Java를 포함하여 필요한 종속성을 갖춘 이미지를 사용해야함
- 2) 애플리케이션을 실행하는 데 필요한 실제 JAR 파일로 바꿔줘야 한다
1
2
3
4
5
6
7
8
9
10
11
12
# open jdk 17 버전의 환경을 구성
FROM openjdk:17-alpine
# build가 되는 시점에 JAR_FILE이라는 변수 명에 build/libs/Eroom-Project-BE-0.0.1-SNAPSHOT.jar 선언
# build/libs - gradle로 빌드했을 때 jar 파일이 생성되는 경로
ARG JAR_FILE=build/libs/Eroom-Project-BE-0.0.1-SNAPSHOT.jar
# JAR_FILE을 app.jar로 복사
COPY ${JAR_FILE} Eroom-Project-BE-0.0.1-SNAPSHOT.jar
# 운영 및 개발에서 사용되는 환경 설정을 분리
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/Eroom-Project-BE-0.0.1-SNAPSHOT.jar"]
Dokerfile 위와 같이 수정해서 적음 open jdk java17 버전의 환경 구성 build 되는 시점에 JAR_FILE 경로에 jar 파일 생성 JAR_FILE을 sejongmate.jar에 복사 jar 파일 실행 명령 (여기서 -Dspring.profiles.active=prod 옵션은 application.yml을 개발 환경에서 따로 분리한 것)
This post is licensed under CC BY 4.0 by the author.