λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
DevOps

[Docker] Spring Boot + Docker + AWS EC2 λ°°ν¬ν•˜κΈ°(MacOS M1)

by 주발2 2021. 7. 19.
λ°˜μ‘ν˜•

πŸ“Ž  Spring Boot + Docker + AWS EC2 λ°°ν¬ν•˜κΈ°(Mac M1)

 

μ•ˆλ…•ν•˜μ„Έμš”, 이번 μ‹œκ°„μ—λŠ” μŠ€ν”„λ§ λΆ€νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ AWS EC2에 도컀λ₯Ό 톡해 배포해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

β€» ν‹€λ¦° λ‚΄μš©μ΄ μ‘΄μž¬ν•  수 μžˆμœΌλ‹ˆ μ°Έκ³ ν•΄μ„œ λ΄μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€ :) 

 

μž‘μ„±ν•œ μ½”λ“œλŠ” κΉƒν—ˆλΈŒ μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€ :)

 

 

μ €μ˜ ν™˜κ²½ 섀정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • Mac OS(M1), μΈν…”λ¦¬μ œμ΄, Spring Boot, Java 8, Gradle

λ˜ν•œ μ΄λ²ˆμ— M1μ—μ„œ 배포λ₯Ό ν•  λ•Œ, κΈ°μ‘΄ λΈ”λ‘œκ·Έ λ‚΄μš©λŒ€λ‘œ μž‘μ—…μ„ ν•˜λ˜ 도쀑 μ—λŸ¬κ°€ λ°œμƒν–ˆκ³  μ•½κ°„μ˜ μ‚½μ§ˆμ΄ μžˆμ—ˆλŠ”λ°μš” .. 😭

κ°„λž΅νžˆ 정리해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

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

 

λŒ€λž΅μ μΈ 과정은 μœ„μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • Dockerfile 을 build ν•΄μ„œ docker image νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.
  • docker image νŒŒμΌμ„ dockerhub에 push ν•©λ‹ˆλ‹€.
  • μ„œλ²„(AWS EC2)μ—μ„œ dockerhub에 μ‘΄μž¬ν•˜λŠ” docker image νŒŒμΌμ„ pull둜 λ°›μ•„μ˜΅λ‹ˆλ‹€.
  • docker run λͺ…λ Ήμ–΄λ₯Ό 톡해 docker image νŒŒμΌμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.

 

 

 

 

 

🎯  μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈ 생성

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜κ³ , κ°„λ‹¨ν•˜κ²Œ Controller μƒμ„±ν•œ λ’€ μœ„μ™€ 같이 μž‘μ„±ν•©λ‹ˆλ‹€.

(μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ˜ 생성 방법에 λŒ€ν•΄μ„œλŠ” μƒλž΅ν•˜κ² μŠ΅λ‹ˆλ‹€.)

 

 

 

 

🎯  Dockerfile 생성

μœ„ 사진과 같이 ν”„λ‘œμ νŠΈ ν•˜μœ„μ— 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 λΉŒλ“œ

./gradlew build -x test (-x test: ν…ŒμŠ€νŠΈ μ‹€ν–‰ X)

 

μœ„ λͺ…λ Ήμ–΄λ₯Ό 톡해 λΉŒλ“œν•˜λ©΄ μ•„λž˜μ™€ 같이 build/libs κ²½λ‘œμ— jar 파일이 μƒμ„±λ©λ‹ˆλ‹€.

 

 

 

 

🎯  Docker Hub

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

μœ„ μ‚¬μ΄νŠΈμ— λ“€μ–΄κ°€μ„œ νšŒμ›κ°€μž…μ„ ν•˜κ³  λ‘œκ·ΈμΈμ„ ν•©λ‹ˆλ‹€.

 

 

κ·Έ ν›„ Repositories > Create Repository 둜 λ“€μ–΄κ°€μ„œ 도컀 λ ˆν¬μ§€ν† λ¦¬λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

 

 

Repository 이름과 Public으둜 μ„€μ •ν•˜κ³  Create λ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€.

 

 

 

 

🎯  Docker Image build

호μ˜₯μ‹œ 도컀가 μ„€μΉ˜λ˜μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ μ•„λž˜ μ‚¬μ΄νŠΈλ₯Ό 톡해 λ¨Όμ € 도컀λ₯Ό μ„€μΉ˜ν•΄μ£Όμ„Έμš” :)

https://itkoo.tistory.com/10

 

MAC M1 Docker μ„€μΉ˜ 방법

1. 도컀(Docker)λž€? μ»¨ν…Œμ΄λ„ˆ 기반의 μ˜€ν”ˆμ†ŒμŠ€ 가상화 ν”Œλž«νΌ μ»¨ν…Œμ΄λ„ˆλΌκ³  ν•˜λ©΄ 화물을 μˆ˜μ†‘ν•˜λŠ” λ°•μŠ€κ°€ λ– μ˜€λ¦…λ‹ˆλ‹€. 그런 μ»¨ν…Œμ΄λ„ˆμ—λŠ” 옷, 과일, μ œν’ˆ λ“± λ‹€μ–‘ν•œ 화물을 넣을 수 있고, κ·œκ²©ν™”λ˜

itkoo.tistory.com

 

 

 

μœ„ λͺ…λ Ήμ–΄λ₯Ό 톡해 dockerfile -> docker 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 μ˜΅μ…˜μ„ μΆ”κ°€ν•˜μ§€ μ•Šκ³  λΉŒλ“œλ₯Ό ν•˜λ©΄ μ•„λž˜μ™€ 같은 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€. 😭

 

 

 

μœ„ λ¬Έμ œλŠ” κΉƒν—ˆλΈŒμ— μžμ„Ένžˆ λ‚˜μ™€μžˆμŠ΅λ‹ˆλ‹€.

μ• ν”Œ M1의 경우 도컀 μ΄λ―Έμ§€λ‘œ λΉŒλ“œν•  λ•Œ --platform μ˜΅μ…˜μ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

 

🎯  Docker Image push

μœ„μ—μ„œ μƒμ„±ν•œ docker image νŒŒμΌμ„ Docker Hub에 pushλ₯Ό ν•΄μ€λ‹ˆλ‹€.

push λͺ…λ Ήμ–΄λŠ” docker hub의 Repository에 보면 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ§Œμ•½ μœ„μ™€ 같이 denied: requested access to the resource is denied λΌλŠ” 문ꡬ가 λ‚˜μ˜€λ©΄ λ‘œκ·ΈμΈμ„ ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

 

docker login λͺ…λ Ήμ–΄λ₯Ό 톡해 λ‘œκ·ΈμΈμ„ ν•œ λ’€ λ‹€μ‹œ pushν•˜λ©΄ μ •μƒμ μœΌλ‘œ pushκ°€ 되고, docker hub의 Repository에 

μƒˆλ‘œμš΄ TAG(latest)κ°€ μƒμ„±λœ κ±Έ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

ν˜„μž¬ μƒνƒœλŠ” μœ„μ™€ 같이 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

 

 

도컀 이미지λ₯Ό 톡해 μŠ€ν”„λ§ λΆ€νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ 싀행이 λ©λ‹ˆλ‹€.

 

 

 

μ΅œμ’…μ μœΌλ‘œ AWS의 IP둜 접속해보면 μœ„μ™€ 같이 μ •μƒμ μœΌλ‘œ 배포가 된 κ±Έ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

 

 

 

 


References

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€