Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20210719] Spring Boot + docker 배포(MacOS M1) #180

Open
JuHyun419 opened this issue Jul 19, 2021 · 0 comments
Open

[20210719] Spring Boot + docker 배포(MacOS M1) #180

JuHyun419 opened this issue Jul 19, 2021 · 0 comments

Comments

@JuHyun419
Copy link
Owner

📎 Spring Boot + Docker + AWS EC2 배포하기(Mac M1)

안녕하세요, 이번 시간에는 스프링 부트 애플리케이션을 AWS EC2에 도커를 통해 배포해보도록 하겠습니다.

※ 틀린 내용이 존재할 수 있으니 참고해서 봐주시면 감사하겠습니다 :)

저의 환경 설정은 다음과 같습니다.

  • Mac OS(M1), 인텔리제이, Spring Boot, Java 8, Gradle

또한 이번에 M1에서 배포를 할 때, 기존 블로그 내용대로 작업을 하던 도중 에러가 발생했고 약간의 삽질이 있었는데요 .. 😭

간략히 정리해보도록 하겠습니다.

image
https://class101.net/products/5fc4a3b4fc231b000d85661b

대략적인 과정은 위와 같습니다.

  • Dockerfile 을 build 해서 docker image 파일을 생성합니다.
  • docker image 파일을 dockerhub에 push 합니다.
  • 서버(AWS EC2)에서 dockerhub에 존재하는 docker image 파일을 pull로 받아옵니다.
  • docker run 명령어를 통해 docker image 파일을 실행합니다.

🎯 스프링 부트 프로젝트 생성

image

스프링 부트 프로젝트를 생성하고, 간단하게 Controller 생성한 뒤 위와 같이 작성합니다.
(스프링 부트 프로젝트의 생성 방법에 대해서는 생략하겠습니다.)


🎯 Dockerfile 생성

image

위 사진과 같이 프로젝트 하위에 Dockerfile 이라는 파일을 생성하고 아래 내용을 작성합니다.

FROM openjdk:8-jdk-alpine
// FROM amazoncorretto:11 ==> amazon corretto 11 사용할 경우
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
// ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","/app.jar"]
// => 설정파일을 분리해서 사용할 때
// java -jar -Dspring.profiles.active=prod app.jar
위 코드에 대한 설명을 간략히 나타내면 다음과 같습니다.

FROM openjdk:8-jdk-alpine

  • open jdk java8 버전의 환경을 구성합니다.
  • Amazon의 corretto 버전을 사용할 경우, 주석처리 한 부분으로 사용하면 됩니다.

ARG JAR_FILE=build/libs/*.jar

  • build가 되는 시점에 JAR_FILE 이라는 변수명에 build/libs/*.jar 표현식을 선언했다는 의미입니다.
  • build/libs 경로는 gradle로 빌드했을 때 jar 파일이 생성되는 경로입니다.
  • Maven의 경우 target/*.jar 로 설정해주시면 됩니다.

COPY ${JAR_FILE} app.jar

  • 위에 선언한 JAR_FILE 을 app.jar 로 복사합니다.

ENTRYPOINT ["java","-jar","/app.jar"]

  • jar 파일을 실행하는 명령어(java -jar jar파일) 입니다.

ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","/app.jar"]

  • 운영 및 개발에서 사용되는 환경 설정을 분리해서 사용할 경우, 위와 같이 ENTRYPOINT를 설정할 수 있습니다.

🎯 gradle 빌드

image

./gradlew build -x test (-x test: 테스트 실행 X)

위 명령어를 통해 빌드하면 아래와 같이 build/libs 경로에 jar 파일이 생성됩니다.

image


🎯 Docker Hub

https://hub.docker.com/

위 사이트에 들어가서 회원가입을 하고 로그인을 합니다.

image
그 후 Repositories > Create Repository 로 들어가서 도커 레포지토리를 생성합니다.

image
Repository 이름과 Public으로 설정하고 Create 를 클릭합니다.


🎯 Docker Image build

호옥시 도커가 설치되어있지 않다면 아래 사이트를 통해 먼저 도커를 설치해주세요 :)

https://itkoo.tistory.com/10

위 명령어를 통해 dockerfile -> docker image 로 빌드를 진행합니다.

image

// gradle
docker build --build-arg DEPENDENCY=build/dependency -t 도커허브 ID/Repository --platform linux/amd64 .

// maven
docker build -t 도커허브 ID/Repository --platform linux/amd64 .
  • 가장 마지막 점(.) 도 포함해야 합니다.
  • 맥북 M1의 경우 --platform linux/amd64 옵션을 마지막에 추가해주어야 합니다.

만약 --platform linux/amd64 옵션을 추가하지 않고 빌드를 하면 아래와 같은 에러가 발생합니다. 😭

image

위 문제는 깃허브 에 자세히 나와있습니다.
image
애플 M1의 경우 도커 이미지로 빌드할 때 --platform 옵션을 사용해야 합니다.


🎯 Docker Image push

위에서 생성한 docker image 파일을 Docker Hub에 push를 해줍니다.
image
push 명령어는 docker hub의 Repository에 보면 확인할 수 있습니다.

image
만약 위와 같이 denied: requested access to the resource is denied 라는 문구가 나오면 로그인을 해주어야 합니다.


image

image

image

docker login 명령어를 통해 로그인을 한 뒤 다시 push하면 정상적으로 push가 되고, docker hub의 Repository에

새로운 TAG(latest)가 생성된 걸 확인할 수 있습니다.

image
현재 상태는 위와 같이 Dockerfile 을 통해 docker image로 빌드하고, docker hub에 push한 상태입니다.

이제 서버(AWS EC2)에서 도커를 설치하고, 애플리케이션을 배포하면 끝입니다 !


🎯 AWS EC2

아래 링크를 통해 AWS EC2 인스턴스를 생성하고, 도커를 설치한 후 애플리케이션을 배포해보도록 하겠습니다.
AWS EC2 인스턴스 생성하기

도커 설치

  • $ sudo yum install docker

도커 실행

  • $ sudo systemctl start docker

도커 허브에 존재하는 이미지 파일 pull

  • $ sudo docker pull juhyun419/sample

도커 이미지를 통해 스프링 부트 애플리케이션 배포(실행)

  • $ sudo docker run -p 8080:8080 juhyun419/sample

image
도커 이미지를 통해 스프링 부트 애플리케이션이 정상적으로 실행이 됩니다.

image
최종적으로 AWS의 IP로 접속해보면 위와 같이 정상적으로 배포가 된 걸 확인할 수 있습니다.



image

References

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant