일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- HTTP
- Container
- virtualization
- spring cloud
- CI/CD
- 배포
- computer science
- JPA
- CS
- 도커
- Java
- mysql
- web server
- ORM
- 스프링 배치
- spring batch
- 스프링 부트
- 스프링
- 데이터베이스
- 스프링 시큐리티
- 컨테이너
- 영속성 컨텍스트
- 자바
- spring boot
- 웹 서버
- Spring
- 가상화
- 백엔드
- Spring Security
- vm
- Today
- Total
개발 일기
[Docker] 스프링 부트 Dockerfile 작성부터 EC2 환경에 배포까지 본문
도커 파일 작성
동기들과 주식 관련 솔루션 서비스를 제작하면서 스프링 부트로 백엔드를 맡아 하는 과정에 Dockerfile을 직접 작성해봤다.
FROM에서 베이스 이미지를 OpenJDK 21로 지정했습니다. 제 Spring Boot가 Java21 버전을 사용하고있어서 선택했고
ARG는 Docker 빌드 시 사용할 변수(JAR_FILE)를 정의한다. 이 변수는 빌드된 JAR 파일의 경로를 가리키며
앞에서 정의한 ARG의 JAR_FILE 변수를 사용하여 JAR 파일을 이미지 안으로 'app.jar'라는 이름으로 복사해 온다.
.env 파일은 OPEN AI의 Assistant API를 사용할 때 필요한 OPENAI API 키를 저장해뒀다. build 시에 포함되지 않아 따로 COPY를 했다. 마지막으로 ENTRYPOINT는 컨테이너가 시작될 때 반드시 실행되는 명령으로 Java 실행 명령어를 통해 JVM이 시작되고 app.jar라는 JAR파일을 실행시킨다.
./gradlew clean build -x test 명령을 통해 생성된 build/libs/InvestiMate-0.0.1-SNAPSHOT.jar 파일을 Dockerfile을 통해 이미지에 복사하여 app.jar로 이름을 바꾸고 저장하는 과정에서 쓰이는 것이다.
docker buile 커맨드
위와 같은 Dockerfile Instruction을 통해 도커파일을 작성한 뒤 이를 실행하기 위해서 docker build 커맨드를 사용
docker build ${option} ${dockerfile directory}
docker build -t back-server --platform linux/amd64 .
- 우선 -t 옵션을 살펴보자. -t 옵션은 --tag 옵션과 동일하다.
docker build -t back-server --platform linux/amd64 .
docker build -t back-server:0.0.1 --platform linux/amd64 .
그래서 해당 옵션은 Docker 이미지의 이름 및 태그를 지정해주는데 사용된다. 첫번째 커맨드와 같이 태그 지정은 Optional이며 아래와 같이 지정도 가능하다.
- 두번째로 살표볼 옵션은 --platform 이다.
docker build -t back-server --platform linux/amd64 .
이 옵션은 별로 중요하다 생각하지 않았지만 꽤나 중요한 옵션인 것 같다. 내가 사용하고 있는 노트북은 Mac m2 OS라서 arm기반 아키텍처이다. 따라서 그냥 docker build를 하게되면 platform이 linux/arm64으로 생성된다.
그러나 내가 배포하고자하는 AWS EC2 ubuntu OS에서는 linux/arm64가 아닌 linux/amd64를 호환하기 때문에 해당 옵션을 통해 빌드될 이미지가 돌아갈 아키텍처를 지정해줘야 한다.
위와 같은 과정을 거치면 내가 개발한 스프링 서버의 도커 이미지가 생성된다.
docker push [이미지명]을 통해 docker hub로 push 한 후
AWS EC2와 같은 배포 환경에서 docker pull [이미지명]로 이미지를 다운 받은 후
docker run -d -p 8080:8080 [이미지명]과 같은 run 커맨드를 통해 컨테이너를 실행하여
배포환경에서도 나의 스프링 서버가 동작하도록 할 수 있다!
‼️‼️ 주의할점
이때 배포환경에서도 동작하게 하기 위해서는 application.yml파일을 image로 뽑아내기 전에 수정해야한다.
OAuth2.0의 callback 및 base url주소를 배포 환경 EC2의 IP 주소로 수정해야하며
나는 AWS RDS를 사용했기 때문에 datasource.url. 또한 RDS의 엔드포인트로 지정해줘야지 배포환경에서도 정상적으로 동작한다.!
이 점을 주의하자.
'DevOps > Docker Kubernetes' 카테고리의 다른 글
[Docker] 컨테이너 런타임(Container Runtime) (0) | 2024.05.21 |
---|---|
[Kubernetes] 쿠버네티스(Kubernetes) 교양 쌓기 (0) | 2024.05.21 |
[Docker] 도커파일(Dockerfile) 작성하기 (0) | 2024.05.15 |
[Docker] 도커 명령어 정리 (0) | 2024.05.14 |
[Docker] 도커란? - 도커 개념과 구조 (0) | 2024.05.14 |