본문 바로가기
Dev Tools/Docker

[Docker] Docker - Spring Boot로 EC2 배포하기

by lucas_owner 2023. 2. 18.

Docker - Spring Boot로 EC2 배포하기

○ 목표 

- Spring Boot (server) Docker Image로 Build

- Docker Hub에 Docker Image 공유(push)

- EC2 Docker Image pull 및 설치 

-> 한마디로 Spring Boot를 Docker를 이용하여 EC2에 간편하게 배포하는것이 목적이다. 

 

* 추가 : EC2 내부의 MySQL Container 와의 연동, 아래글에서 MySQL 컨테이너 생성법 참고!

https://lucas-owner.tistory.com/47

 

[Docker] Docker로 AWS EC2 - MySQL 설치 및 테스트

Docker image 로 EC2에 MySQL 설치 및 테스트 하기 ◎ 목적 - AWS EC2 내부에 Docker Image 를 사용하여 MySQL을 손쉽게 설치하고 Test 하는것이 목적이다. 이 글에 이어서 Spring Boot 또한 Docker Image 로 Build 후에 EC2

lucas-owner.tistory.com

 

○ 사전 작업

- EC2에 Docker 설치 완료.

- Local에 Docker 설치 완료.

- Docker Image로 만들 Spring Boot 프로젝트.

- Docker Hub 회원가입.(계정 필요)

 

○ 환경

- Spring Boot 2.7.2

- java 11

- gradle

- mac 

- EC2 : Ubuntu

 

○ 순서 

  1. Spring Boot 프로젝트 내부 Dockerfile 생성 및 설정.
  2. Jar 파일 Build.
  3. Docker Image 생성.
  4. Docker Hub에 Image push.
  5. EC2 Docker Image pull 및 실행.
  6. Server 실행 확인.

 

1. Spring Boot - Dockerfile 생성 및 설정

 

1-1. Spring Boot 프로젝트 경로에 Dockerfile 생성 

Dockerfile

- 프로젝트 폴더안에 (src 내부가 아님!!!) "Dockerfile" 이라는 파일을 생성하면, IntelliJ 기준 Docker File 로 인식한다.

 

 

1-2. Docker File 내부 작성. 

 

- Maven과 Gradle에 따라서 내부 작성 내용이 다르다!!!

 

- Gradle

FROM openjdk:11-jdk
ARG JAR_FILE=builds/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"]

 

- Maven 

# Maven

FROM openjdk:11-jdk

# Jar 파일의 위치
ARG JAR_FILE=target/*.jar

# app.jar는 경우에 따라 이름 변경
COPY ${JAR_FILE} app.jar

# 생략 가능 - 해당 컨테이너는 8080 port 를 사용한다는 의미.
EXPOSE 8080

# docker run 시 실행할 필수 명령어
ENTRYPOINT ["java", "-jar", "/app.jar"]

# 경우에 따라 java 옵션 사용.
# ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=docker", "/app.jar"]

 

*** build.gradle

- 만약 gradle을 사용 하고 있다면, build.gradle 파일 내부에 아래 설정을 추가해줘야 한다! 

- jar 파일이 2개가 생기며 Docker Image 가 생성되지 않을 수 있다.  (Boot 2.5v 이후)

// build.gradle

jar {
	enabled = false
}

 

 

1-3. Jar 파일 Build

 

- gradle의 경우 clean build로 jar 파일 생성. 

- 옵션: -x test는 test를 skip 후 build 하라는 의미이다. 

 

 

2. Docker Image 생성

 

2-1. Docker Login (Local Terminal)

- Docker Hub에 도커이미지를 올릴려면 login을 해야한다. 

- 만약 Docker Hub계정이 없다면, 만들어주자. 

$docker login -u [username]

- 해당 커맨드 실행 후 Password 입력. 

 

 

2-2. Docker Image 생성

 

- 커맨드 작성

- Docker Hub에 Push 를 위해서 [Docker Hub ID]/ 를 필수로 작성해줍니다. 

- Dockerfile의 위치로 이동 후 해당 커맨드를 사용해야 한다!!! -> 그렇지 않으면 Dockerfile 위치를 지정해줘야함.

# 기본 커맨드
# docker build -t [dockerHub ID]/[이미지명]:[태그명] [DockerFile위치]

# 태그 지정X 시 :latest 지정됨
$docker build -t [dockerHub ID]/[이미지명] .

- Use 'docker scan' to run ~ 이라는 Line이 출력되면 image 파일 생성 완료 이다. 

 

 

2-3. Docker image 확인

 

- Docker Image를 만들었으니 image가 만들어졌는지 확인 해보자. 

# Docker Image 목록 확인
$docker images

 

3. Docker Image push - To Docker Hub

 

3-1. Docker Hub push

- Docker Image 생성, 확인을 했으니 DockerHub에 image 를 올려보자. 

 

# Docker Hub Push 
#docker push [DockerHub ID]/[image 파일명]

$docker push lucaskang134/boot-prac

 

3-2 도커 푸시 확인

 

- Mac의 경우 Docker Desktop 프로그램을 통해 확인 가능하다. 

 

- Docker Desktop 프로그램이 존재 하지 않는다면.
(https://hub.docker.com/repositories) -> Docker Hub 페이지에서 이미지가 push 되었는지 확인하자. 

 

 

4. EC2 Docker 배포하기

- Docker Hub에 이미지가 올라간것을 확인 했기 때문에 EC2에서 해당 이미지를 다운로드 받고, 실행 시켜보자.

 

4-1. Docker Image 컨테이너화 

- 컨테이너: 실제로 실행되고 있는 도커 이미지. (실행되고 있는 이미지)

 

# Docker Pull + 컨테이너화(실행)

# 커맨드 기본 골조
# docker run -d -p [로컬 port]:[도커 port] [dockerHub ID]/[이미지명]

$sudo docker run -d -p 8080:8080 lucaskang134/boot-prac
  • 옵션 설명
    • -d : 백그라운드에서 실행.
      • Spring Boot 의 경우 실행되면, Console 창이 나와서 다른 작업을 할 수가 없기 때문이다.
      • 또한 백그라운드 실행 시 다른 작업을 할 수 있다. 
    • -p : 로컬의 포트로 접속시 docker의 어떤 포트와 연결 할것인지.
      • 로컬에 8080포트로 요청이 오면, 도커의 어떤 포트와 연결할것인지?(server가 1개가 아닐수도 있고, 포트번호가 다를수도 있기 때문이다.)
    • -it : i, t옵션을 같이 사용하는 것이다, 키보드의 입력을 표준입력으로 전달하는 옵션이다.

port설정은 상황에 맞게

- 해당 컨테이너를 정지 시켰다가, 다시 실행 할때는 같은 명령어를 사용하면 안된다. 

---> 왜냐하면 Docker Hub 에서 해당 이미지를 다시 가져와서 실행을 시키기 때문에 EC2 내부에 image가 쌓이기 때문이다. 

* 해당 이슈는 아래에서 이어서 설명 하도록 하겠다.

 

 

4-2. 컨테이너 실행 확인

- docker ps 명령어를 통해 확인하자. 

# Docker 실행중인 컨터이너 확인
$sudo docker ps

# Docker 정지된 컨테이너 확인(실행중인것도 출력)
$sudo docker ps -a

실행중인 컨테이너 목록

4-3 EC2 접속 해보기. 

 

- Docker 이미지가 실행 되고 있다면, EC2의 퍼블릭 IPv4 주소에 접속하여 확인해보자! 

(퍼블릭주소:8080)

- 테스트 스프링 부트 서버가 올라가는것을 확인했다! 

- MySQL 또한 컨테이너가 실행되고 있다면, DB 연결되는 API 또한 확인 해보자. 

- Spring Boot 의 콘솔을 확인하고 싶을 경우

    -> docker attach 이미지명 

 

 

5. 추가

 

5-1. MySQL 연동 (EC2 내부)

 

- 만약 이전글을 보고 왔다면, EC2에 MySQL 또한 Docker 로 실행해보았을 것이다. 

EC2 인스턴스가 재시작 되었다거나, MySQL 컨테이너를 종료(docker stop) 했다면,

4번 항목의 Spring Boot 가 실행이 안되었을 것이다. 

 

-> 이유는 간단하다..... MySQL 이미지가 실행되고 있는지 확인해보길 바란다.... DB연결 문제로 Spring Boot 가 실행이 안되는것일수도 있다.! 

 

-> MySQL 이미지 실행 : $sudo docker start [컨테이너 이름 혹은 ID]

-> 컨테이너 이름, ID 확인 : $sudo docker ps -a 

 

 

 5-2. 4-1번 항목의 이슈 

 

- 4-1 항목에서 이미 한번 이미지를 컨테이너화를 시켰을 때, docker run 명령어를 다시 사용하면 안된다고 했다. 

해당 이유는, docker run 을 사용하는 커맨드의 경우 Docker Hub에서 해당 이미지를 pull & 컨테이너화를 시키는 작업이기 때문에,

docker ps -a, 명령어를 사용해보면 같은 이미지가 여러개 생성되어 있는것을 확인 할 수 있다. 

 

-> 이미 컨테이너가 존재한다면 docker start [컨테이너명 또는 ID] 로 실행 시켜야 한다. 

 

* docker 이미지, 컨테이너 명령어의 경우 다음글에서 따로 정리 해보도록 하겠다.

 

2023/02/18 추가 - Docker 를 이용한 CI 

https://lucas-owner.tistory.com/49

 

[Docker] GitHub Actions - Docker Image 자동 빌드, push(CI)

GitHub Actions 를 사용한 Docker Image 자동 빌드, push - Info Docker를 사용하여 EC2에 배포하는 방법들을 포스팅해왔다, 실제로 해봤다면 알겠지만 해당 작업은 상당히 복잡한 프로세스를 갖고있고, 자동

lucas-owner.tistory.com

 

반응형

댓글