1. Docker Compose로 Redis, Spring Boot 한 번에 띄울 수 있게 구성하기
구성에 필요한 파일 만들기
a. Dockerfile
- 17-jdk에서 빌드한 파일을 복사해 실행시키는 Docker 이미지
FROM openjdk:17-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
b. compose.yml
- Dockerfile을 기준으로 서버를 빌드함 (포트는 8080)
- 캐시 서버(Redis)가 정상적으로 실행되고 있다는 걸 확인한 뒤에 백엔드 서버를 띄울 것임 (캐시 서버가 안 띄워져 있으면 오류 표시)
services:
api-server:
build: .
ports:
- 8080:8080
depends_on:
cache-server:
condition: service_healthy
cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10
기존에 실행되고 있는 Redis, Spring Boot 종료하기
a. Mac 기준
# Redis 중지
$ brew services stop redis
$ brew services info redis # 잘 종료됐는 지 확인
# Spring Boot 종료
$ lsof -i:8080 # 8080번 포트 실행되고 있는 프로세스 확인
$ kill {Spring Boot의 PID} # 프로세스 종료
$ lsof -i:8080 # 잘 종료됐는 지 확인
b. Windows 기준
- CMD에 아래 명령어를 입력하기
- 관리자 모드로 실행해야 taskkill 명령어 액세스가 가능함
netstat -ano | findstr "6379" # pid 확인
taskkill /f /pid {pid}
application.yml 수정하기
- spring:datasource:url의 localhost를 host.docker.internal로 수정
- localhost: Spring Boot가 띄워지는 컨테이너 안에서의 주소
- 컨테이너 안에는 MySQL이 설치가 안 돼 있기 때문에 DB랑 연결할 수 없음
- host.docker.internal: host 컴퓨터의 주소
- localhost 대신 사용해 통신을 시켜줄 수 있음
- localhost: Spring Boot가 띄워지는 컨테이너 안에서의 주소
- spring:data:redis:host의 localhost를 cache-server로 수정
- compose.yml에 적은 services:cache-server의 cache-server와 맞춰서 동일하게 적어야 함
# local 환경
spring:
profiles:
default: local
datasource:
url: jdbc:mysql://host.docker.internal:3306/mydb
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
data:
redis:
host: cache-server
port: 6379
logging:
level:
org.springframework.cache: trace
---
# prod 환경
...
Docker 컨테이너로 띄워보기
- Spring Boot 안 Terminal에서 입력
$ ./gradlew clean build -x test # 빌드
$ docker compose up --build -d # compose.yml 파일이 존재하는 경로로 들어와서 입력해야 함
$ docker ps # 잘 띄워졌는 지 확인
$ docker compose logs -f # 실시간 로그 확인하기
2. AWS EC2에서 Docker Compose를 활용해 Redis, Spring Boot 띄워보기
EC2 내에서 사용할 Dockerfile, Docker compose 파일 만들기
로컬 환경 파일과 배포 환경 파일을 다르게 구성하는 것이 좋음
a. Dockerfile-prod
FROM openjdk:17-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app.jar"]
b. compose-prod.yml
- [build: .]으로 돼있으면 현재 경로에 있는 Dockerfile을 찾아서 빌드시킴 (prod가 붙은 파일을 빌드시킬 수 있도록 수정)
services:
api-server:
build:
context: .
dockerfile: ./Dockerfile-prod
ports:
- 8080:8080
depends_on:
cache-server:
condition: service_healthy
cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10
로컬에서 구현한 내용을 GitHub에 Push하고 EC2에서 Git Pull 받기
$ git commit -m "{커밋 메시지}"
$ git push
$ cd {프로젝트 경로}
$ git pull origin main
EC2에 Docker 설치하기
$ sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
newgrp docker && \
sudo curl -L "https://github.com/docker/compose/releases/download/2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker -v # Docker 버전 확인
$ docker compose version # Docker Compose 버전 확인
기존에 실행되고 있는 Redis Spring Boot 종료하기
# Redis 중지
$ sudo systemctl stop redis
$ sudo systemctl status redis # 잘 종료됐는 지 확인
# Spring Boot 종료
$ sudo lsof -i:8080 # 8080번 포트 실행되고 있는 프로세스 확인
$ kill {Spring Boot의 PID} # 프로세스 종료
$ sudo lsof -i:8080 # 잘 종료됐는 지 확인
Docker 컨테이너로 띄워보기
$ ./gradlew clean build -x test
$ docker compose -f compose-prod.yml up --build -d
$ docker ps # 잘 띄워졌는 지 확인
$ docker compose logs -f # 실시간 로그 확인하기