본문 바로가기
개발/기타

Ubuntu 서버에 Docker로 스프링부트 Jar 배포 (feat Redis)

by hamcheeseburger 2022. 1. 6.

제가 노트북을 Mac을 이용하기 때문에 로컬서버는 Mac OS (Apple sillicon) 기준으로 설명합니다.

1.  로컬 서버와 Ubuntu 서버에 docker 설치하기

- Mac에 설치

https://docs.docker.com/desktop/mac/install/

 

Install Docker Desktop on Mac

 

docs.docker.com

- Ubuntu에 설치

https://blog.dalso.org/linux/ubuntu-20-04-lts/13118

 

Ubuntu 20.04 Docker 설치하기. - 달소씨의 하루

이번에는 Ubuntu 20.04 LTS Server 버전에서 Docker 설치를 한번 진행해보겠습니다. 설치방법은 매번 하던대로라서.. 크게 달라지지않지만 기록용으로 남겨봅니다. 설치하기전에 기본적으로 apt update & ap

blog.dalso.org

 

2. Docker Repository 생성

아래 페이지에서 repository를 생성하세요. 간단하기 때문에 따로 설명을 덧붙이진 않겠습니다.

https://hub.docker.com/repositories

 

Docker Hub

 

hub.docker.com

 

3. Ubuntu에 Redis 다운로드 및 컨테이너 실행

- Redis Image 다운로드

docker pull redis

- Redis Container 실행

6379 포트로 'redis-1'이라는 이름의 Redis Container를 생성합니다.

docker run --rm -p 6379:6379 -d --name redis-1 redis redis-server

docker ps 라는 명령어를 실행했을 때 아래와 같은 정보가 나타나야 합니다.

 

- Docker Network 생성

Redis Container와 통신을 할 수 있는 Network를 생성해야 합니다. 

'spring-redis-network' 라는 이름의 네트워크를 생성합니다.

docker network create spring-redis-network

- Network와 Redis Container 연결

위에서 생성한 'spring-redis-network'와 Redis Container인 'redis-1'를 연결합니다.

docker network connect spring-redis-network redis-1

이 과정을 행함으로써 Redis Container에 통신할 수 있는 네트워크가 생성되었습니다.

 

4. 스프링부트 프로젝트에 Redis Host명 변경하기

로컬 서버에서는 application.properties에서 redis host 명을 localhost로 지정하는 경우가 일반적인데요.

해당 설정으로 docker에 배포한다면 아래와 같이 Redis Server와 connection error가 발생할 것입니다.

.ConnectTimeoutException: connection timed out

위의 2번에서 설정한 Redis Container의 네트워크 IP주소를 알아내어 application.properties에 redis host 명을 해당 IP 주소로 변경하면 정상적으로 실행할 수 있습니다.

 

아래의 명령어를 Ubuntu에서 실행하여 IP주소를 알아냅니다.

'spring-redis-network'라는 네트워크의 정보를 알아내는 명령어 입니다.

docker inspect spring-redis-network

 

위의 명령어를 실행하면 아래와 같은 정보가 뜰 것입니다.

"Name": "redis-1",
"EndpointID": "88b100f3569bb4ed68ac8cbf84f4b5a20493e11c5e7336a052bbbd25bb5f4205",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""

위의 정보에서 IPv4Address의 IP주소를 복사하여 스프링부트 프로젝트의 application.properties 파일에 적용하세요.

spring.cache.type=redis
spring.redis.host=172.18.0.2
spring.redis.port=6379

 

5. 스프링부트 프로젝트 아래 Dockerfile 만들기

스프링부트 프로젝트를 docker로 빌드하기 위해서는 Dockerfile이 필요합니다.

스프링부트 프로젝트 바로 아래 Dockerfile 이라는 파일을 생성해주세요. 확장자는 없어도 괜찮습니다.

파일명은 무조건 'Dockerfile' 이어야 합니다. (dockerfile(x) DockerFile (x) Dockerfile (o))

 

FROM openjdk:8
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
ENV GOOGLE_APPLICATION_CREDENTIALS /resources/key.json

저의 경우는 Java version 8으로 개발을 진행했기 때문에 FROM 키워드에 openjdk:8을 작성하였습니다.

2~3번째 줄은 스프링부트 프로젝트의 target 폴더 아래 생성되는 jar파일을 app.jar라는 파일로 복사한다는 의미입니다.

ENTRY POINT는 jar 파일을 실행하는 명령어 입니다.

제일 마지막줄의 ENV는 프로젝트를 실행할 때 활용되는 환경변수를 적어주시면 되는데, 사용하지 않는다면 생략하시면 됩니다. 저의 경우는 google vision api를 사용해야 해서 환경변수 설정을 추가하였습니다.

 

6. 스프링부트 프로젝트 Jar 파일 생성

- pom.xml에서 packaging 태그를 jar로 변경하세요.

- (이클립스 기준) 프로젝트 우클릭 -> Run As -> Maven Build ... -> Goals에 package 입력 -> Apply -> Run 의 과정으로 jar 파일을 생성합니다.

- 프로젝트 아래 target 폴더에 jar 파일이 생성된 것을 확인할 수 있습니다.

 

7. 로컬에서 Docker build후 push

terminal을 이용해서 Docker build, push를 진행하겠습니다. (이미 Docker Project가 있다고 가정하겠습니다.)

 

- 스프링부트 프로젝트 아래에 있는 target 폴더로 이동합니다.

- 아래 명령어를 입력하여 프로젝트를 빌드합니다. (apple sillicon 기준 명령어입니다.)

docker build --platform amd64 -t [도커 계정이름]/[도커 레포지토리명] .

- 아래 명령어를 입력하여 Docker Hub에 Push합니다.

docker push [도커 계정명]/[도커 레포지토리명]

 

8. Ubuntu에서 Image Pull 받고 실행

- 아래의 명령어를 입력하여 6번에서 push한 Image를 pull받습니다.

sudo docker pull [도커 계정명]/[도커 레포지토리명]

- 아래의 명령어를 입력하여 container를 생성 및 실행합니다.

docker run --rm -d --net spring-redis-network -p 80:80 --name [컨테이너명] [도커 계정명]/[도커 레포지토리명]

2번에서 생성한 Redis Network 'spring-redis-network'가 포함되어있는 것이 보이시죠? 현재 생성하는 컨테이너와 Redis Container 사이에 통신을 하기 위해 추가된 키워드 입니다.

또한 80:80은 해당 컨테이너를 80포트를 활용하여 생성하겠다는 의미입니다. 저는 스프링부트 프로젝트의 application.properties에 server.port를 80으로 설정하였기 때문에 저렇게 작성을 했습니다. 다른 포트를 사용하신다면 해당 포트 번호로 적용하여 실행시켜주세요.

 

 

아래의 게시글이 문제를 해결하는데 아주 큰 도움이 되었습니다.

한 번 읽어보시는 것을 추천합니다.

출처 : https://codingfullstack.com/java/spring-boot/spring-boot-redis-cluster/

 

Spring Boot + Redis Clusters + Docker - Complete Guide

How to achieve fault tolerance in Redis network with Redis cluster and sentinels.

codingfullstack.com

이전 댓글