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
○ 사전 작업
- EC2에 Docker 설치 완료.
- Local에 Docker 설치 완료.
- Docker Image로 만들 Spring Boot 프로젝트.
- Docker Hub 회원가입.(계정 필요)
○ 환경
- Spring Boot 2.7.2
- java 11
- gradle
- mac
- EC2 : Ubuntu
○ 순서
- Spring Boot 프로젝트 내부 Dockerfile 생성 및 설정.
- Jar 파일 Build.
- Docker Image 생성.
- Docker Hub에 Image push.
- EC2 Docker Image pull 및 실행.
- Server 실행 확인.
1. Spring Boot - Dockerfile 생성 및 설정
1-1. Spring Boot 프로젝트 경로에 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옵션을 같이 사용하는 것이다, 키보드의 입력을 표준입력으로 전달하는 옵션이다.
- -d : 백그라운드에서 실행.
- 해당 컨테이너를 정지 시켰다가, 다시 실행 할때는 같은 명령어를 사용하면 안된다.
---> 왜냐하면 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
'Dev Tools > Docker' 카테고리의 다른 글
[Docker] Docker Command(명령어) 정리(+옵션) (0) | 2023.02.20 |
---|---|
[Docker] GitHub Actions CI/CD - Docker Image 자동 배포, run(CD) (2) (12) | 2023.02.19 |
[Docker] GitHub Actions CI/CD - Docker Image 자동 빌드, push(CI) (1) (0) | 2023.02.18 |
[Docker] Docker로 AWS EC2 - MySQL 설치 및 테스트 (0) | 2023.02.17 |
[Docker] EC2 - Docker 설치 (0) | 2023.02.17 |
댓글