[Docker] 스프링부트를 docker 이미지를 통해서 AWS EC2에 배포하기(DockerHub)

안녕하세요.

 

오늘은 간단한 스프링부트 애플리케이션을 Docker 라는 시스템을 이용하여 배포해보는 프로세스를 경험해보겠습니다.

 

일단 Docker는 특정 파일을 빌드하여 Docker Image라는 특수한 파일형태를 만들고 이를 Docker Hub라는 공간에 배포하여 Github처럼 push/pull 을 활용하여 이미지를 가져오고 넣고 하는 활동을 통해 어플리케이션의 배포 또한 가능하도록 합니다.

 

대부분의 활용도가 어플리케이션의 배포용으로 활용하는 것은 아니지만 오늘은 그러한 목적으로 스프링 부트 어플리케이션을 Docker를 활용하여 AWS EC2 인스턴스인 Amazon Linux 2 에 배포해보도록 하겠습니다.

 


 

스프링부트 어플리케이션

 

우선 간단한 스프링부트 어플리케이션부터 준비해보도록 하겠습니다.

 

start.spring.io/

인텔리제이나 혹은 이클립스에서 스프링부트 어플리케이션 생성이 가능하시다면 거기서 생성해주시고 인텔리제이 커뮤니티 버전이나 다른 IDE를 사용하고 계시다면 위의 URL에서 스프링부트 어플리케이션을 다운받고 IDE에 import 해주시기 바랍니다.

 

별다른 의존성은 필요없이 web 정도만 추가하면 될것 같습니다.

 

또한 컨트롤러를 하나 추가하여 Http 통신할 수 있는 API를 만들어보겠습니다.

 

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}

- 단지 hello 라는 문자열을 반환하는 API를 만들어주기만 하고 넘어가도록 하겠습니다.

 

* application.properties 파일의 server.port=80 설정을 해주시기 바립니다.

server.port=80

 

Dockerfile 생성

스프링부트 프로젝트 루트를 잡고 File을 하나 생성해줍니다.

 

New File로 생성해주시고 이름을 Dockerfile로 설정해줍니다. 이름이 중요합니다. 오타없이 입력해주세요.

 

그리고 안의 내용을 다음과 같이 기입해주세요.

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

내용을 잠시 들여다보자면 open jdk java 8버전의 환경을 구성할 것이고 ARG는 build 시점에 활용되는 변수선언문으로 JAR_FILE이라는 변수에 target/*.jar라는 표현식을 담았다고 보시면 될것 같습니다.

또한 이를 카피하여 app.jar 로 복사하고, ENTRYPOINT 명령어로 기존 jar 파일을 단순 실행하듯이 java -jar /app.jar 라는 jar 파일을 실행하는 명령어를 실행하면서 스프링부트가 올라갑니다.

 

* target 폴더의 jar파일을 바라볼 것이기 때문에 target에 스프링부트의 jar 파일이 떨어지도록 설정해주시기 바랍니다. maven의 경우는 mvn package 명령어를 활용해주세요.(target 폴더 아래에 아래와 같이 jar 파일이 떨어져 있으면 성공입니다.)

 

 

 

Docker Hub 가입

hub.docker.com/

Docker Hub

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your teams' container applications.

hub.docker.com

도커 허브에 가입해줍니다. Github 처럼 remote 저장소를 활용할 수 있어 편리합니다.

 

가입을 했다면 로그인을 해주시고 Create Repository를 클릭하여 Repository를 하나 생성해줍니다.

 

 

 

 

그리고 간단히 repository명만 설정해주시고 public을 유지한채 create를 눌러주세요.

 

 

 


 

Dockerfile 빌드

이제 우리가 생성했던 도커파일을 빌드해보도록 하겠습니다.

 

도커파일 빌드 명령어는 maven을 활용하냐 gradle를 활용하냐에 따라 달라지게 됩니다.

 

Gradle

docker build --build-arg DEPENDENCY=build/dependency -t 도커허브아이디/도커허브 Repository 명 . (끝에 .까지가 명령어입니다.)

 

Maven

docker build -t 도커허브아이디/도커허브 Repository 명 . (끝에 .까지가 명령어입니다.)

 

저는 maven 으로 진행하기 때문에 Maven 명령어로 build 하겠습니다.

 

 

도커파일을 빌드하였고 이미지를 생성했습니다. 이제 이것을 도커허브 Repository 공간에 push 하겠습니다.

 

push 명령어는 docker hub 레포지토리에서도 확인이 가능합니다.

 

 

tagname은 제외하고 빨간 네모부분만 실행해줍니다.

 

 

이제 도커허브에 잘 올라갔는지 확인해줍니다.

 

 

방금 올린 이미지가 잘 push 된 것을 확인하였습니다. 이제 이 이미지를 AWS EC2 서버에서 pull 받아서 docker run 명령어로 이미지를 실행하면 컨테이너가 올라가고 내부에 스프링부트 어플리케이션과 포트연동만 시켜주면 보통 스프링부트 어플리케이션이 실행되듯이 서버를 구축할 수 있습니다.

 


 

AWS EC2

sas-study.tistory.com/398

해당 방법을 통해 각각 OS에 맞는 방법으로 EC2 서버에 접속을 해주시기 바랍니다. 우선 접속이 완료되었다는 시점부터 시작하여 포스팅을 진행하겠습니다.

 

우선 docker를 ec2 서버에 설치해줍니다.

 

Docker 설치

$ sudo yum install docker

 - 위 명령어를 통해 도커를 설치해주시고 중간에 y를 눌러줍니다.

 

$ sudo systemctl start docker 

 - 위 명령어를 통해 도커를 실행시킵니다.

 

$ sudo docker pull doqndnf/simple-spring-boot

 - 위 명령어를 통해 도커허브에 올라간 스프링부트 도커 이미지를 pull 받습니다.

 

$ sudo sudo docker run -p 80:80 doqndnf/simple-spring-boot

 - 해당 명령어로 80번 포트에 스프링부트를 실행합니다. 아래와 같이 스프링부트가 올라가면 성공입니다.

 

 

 

최종확인

이제 서버 퍼블릭 IP주소로 /hello를 접속하면 다음과 같이 hello 라는 문자열이 잘 떨어집니다.

 

 

 

도커 정말 좋은것 같습니다.!

 


 

 

* 포스팅에 사용된 서버는 모두 삭제되었습니다.

* 해당 포스팅은 아래의 출처를 토대로 재구성한 형태입니다.

spring.io/guides/gs/spring-boot-docker/

Spring Boot with Docker

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

 

댓글

Designed by JB FACTORY