EC2 인스턴스 생성 방법은 이전 포스팅을 참고해주세요!
로컬에서 Docker 설정
Jar 파일 빌드하기
보통 빌드를 할 때 ./graldew clean build 를 많이 봤을텐데
이번에는 ./gradlew clean bootJar를 통해 Spring Boot 애플리케이션을 위한 실행 가능한 JAR파일만 생성했음
./gradlew build는 bootJar를 포함하여 내부 동작이 더 길다
반면, bootJar의 경우 단순히 프로젝트의 jar파일을 만드는 목적으로 빌드 속도가 빠르다
(clean 작업은 build/ 와 같은 빌드 산출물 디렉토리를 삭제하여 이전 빌드 결과물을 모두 제거함)
Dockerfile 생성하기
# Dockerfile
# jdk17 Image Start
FROM openjdk:17
# jar 파일 복제
COPY build/libs/*.jar app.jar
# 실행 명령어
ENTRYPOINT["java", "-jar", "app.jar"]
Docker 이미지 생성
우선 도커 허브에 도커 이미지를 올릴것이기 때문에 로그인을 해주어야 함!
(아이디가 없다면 docker 홈페이지에서 회원가입 후 진행)
docker login -u [username]
이렇게 하고 password를 입력해주면 됨
docker build -t hjungyo/berich .
# docker build -t [DokerHub ID]/[이미지명]:[태그명] [Dockerfile 위치]
# 태그 지정 X시 latest 지정됨
=> Dockerfile이 있는 위치에서 실행해야 . 을 사용할 수 있고 아니라면 경로를 직접 지정해줘야 함!
Docker Image push 하기
docker push hjungyo/berich:latest
# docker push [DockerHub ID]/[image 파일명]
AWS EC2에서 Docker 설정하기
Docker 설치하기
Docker 공식 홈페이지에 있는 Ubuntu 설치를 따라하면 됨!
(https://docs.docker.com/engine/install/ubuntu)
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker 이미지 다운로드
Docker 이미지 다운로드의 경우 sudo docker pull hjungyo/berich 와 같은 명령어로 실행할텐데
해당 도커 이미지가 local 환경에 없을 경우 자동으로 hub에서 다운로드하므로 생략해도 됨!
Docker 컨테이너 실행하기
sudo docker run -d -p 8080:8080 hjungyo/berich
# docker run -d -p [로컬 port]:[로컬 port] [DockerHub ID]/[이미지명]
옵선 설명
-d : 백그라운드 실행
-p : 실행할 포트 설정
(-p 1111:2222 라면 pc에서는 1111 포트로 실행되고, docker에서는 2222 포트에서 실행된다고 보면 됨)
=> 도커 내부에도 따로 포트번호가 존재함
Trouble Shooting
이 경고는 이미지가 ARM64 아키텍처용으로 빌드된 반면, 호스트 시스템이 AMD64 아키텍처이기 때문에 발생하는 문제입니다..
(맥북 m1 사용중...)
docker buildx build --platform linux/amd64,linux/arm64 -t hjungyo/berich:latest --push .
이렇게 buildx 를 사용하여 멀티 아키텍처 이미지 빌드를 진행하면 된다!
=> --platform linux/amd64,linux/arm64 옵션을 통해 두 가지 플랫폼(AMD64와 ARM64)을 모두 지원하는 이미지를 빌드!
하지만 그래도 같은 에러가 발생했는데
sudo docker run --platform linux/amd64 -d -p 8080:8080 hjungyo/berich
이렇게 run할 때 아키텍처를 지정해주고 run을 하니까 해결됨!
만약 컨테이너를 실행해도 에러가 발생한다면
sudo docker ps -a 로 exit 된 컨테이너 id를 확인하고
sudo docker logs [컨테이너 id] 로 로그를 확인할 수 있다!
확인했는데 datasource 설정 관련 에러가 발생한다면
https://hanjungyo.tistory.com/75
먼저 EC2에서 MySQL 컨테이너를 실행 후
Spring Boot의 application.properties에서 해당 주소로 db를 연결한 후 다시 빌드해서 실행해보자!
(RDS나 다른 방법을 사용하고 싶으면 EC2에 MySQL을 띄울 필요는 X)
만약 Out of Memory 같이 메모리 관련 에러가 뜨면
https://hanjungyo.tistory.com/76
Swap 공간을 이용하면 해결할 수 있다!
'Backend > Spring' 카테고리의 다른 글
[Spring Boot] Custom Exception 설정 (0) | 2024.08.19 |
---|---|
[Spring Boot] MySQL JPA 연동 (3) | 2024.07.22 |