docker를 이용해서 spring boot, redis, mysql을 배포해보겠습니다.
먼저 만들어진 스프링부트앱을 jar 파일로 빌드하겠습니다.
$ ./gradlew bootJar
위와 같이 진행하면, "build/libs"에 jar파일이 생성되어있습니다.
이제 Dockerfile을 작성해주겠습니다.
FROM openjdk:11-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} springbootapp.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "/springbootapp.jar"]
"-Dspring.profiles.active=prod"은 설정 파일에서 "application-prod.yml"을 실행하게 만드는 옵션입니다.
현재 스프링부트 앱 설정파일은 다음과 같습니다.
# application.yml
spring:
profiles:
active: local
# application-local.yml
spring:
config:
activate:
on-profile: local
datasource:
url: jdbc:h2:tcp://localhost/~/springbootapp
username: sa
password:
driver-class-name: org.h2.Driver
redis:
host: 192.168.99.100
port: 6379
# application-prod.yml
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://mysql:3306/springbootapp?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: redis
port: 6379
docker-compose를 이용하면, 컨테이너 명으로 해당 컨테이너에 접근할 수 있습니다.
따라서 호스트에 컨테이너 명을 적어준 것입니다.
이제 docker-compose.yml을 작성해줍니다.
version: "3"
services:
mysql:
image: mysql
environment:
MYSQL_DATABASE: springbootapp
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
ports:
- 3306:3306
redis:
image: redis
ports:
- 6379:6379
springbootapp:
build: .
ports:
- 8080:8080
depends_on:
- mysql
- redis
image : 가져올 이미지 명을 지정
build: Dockerfile의 경로를 지정
ports : 컨테이너 내부의 포트와 외부로 노출되는 포트를 매핑
depends_on : 해당 컨테이너가 올라오면, springbootapp이 실행됩니다.
$ docker-compose up --build -d
docker-compose로 해당 컨테이너들을 실행해줍니다.
-d 옵션을 통해 백그라운드로 실행할 수 있습니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1bfd7b10d3c ... "java -Dspring.profi…" 25 seconds ago Up 25 seconds 0.0.0.0:8080->8080/tcp ...
9c23feaeeeaf redis "docker-entrypoint.s…" About a minute ago Up 25 seconds 0.0.0.0:6379->6379/tcp ...
15b4dd0bc7f7 mysql "docker-entrypoint.s…" About a minute ago Up 25 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp ...
컨테이너가 잘 올라와있습니다. 8080포트로 접속하면 됩니다.
이를 클라우드를 이용하여 배포해보기 위해 GCP의 compute engine을 사용해보았습니다.
vm engine을 생성하고 브라우저로 실행하면, 손쉽게 파일을 전송할 수 있습니다.
우측 상단에 설정 버튼을 클릭하면, 파일 업로드가 있습니다.
해당 프로젝트 파일을 업로드 해준 뒤, 위 과정을 진행하시면 됩니다.
초기에는 포트가 닫혀있기 때문에,
https://cloud.google.com/vpc/docs/using-firewalls?hl=ko
위 페이지에서 방화벽 페이지로 이동하신 뒤, 방화벽 규칙을 만들어서 포트(80)를 열어주시면 됩니다.
만약 바로 80포트로 매핑시킬거라면, "docker-compose.yml"의 "ports"를 아래와 같이 수정하면 됩니다.
springbootapp:
build: .
ports:
- 80:8080
depends_on:
- mysql
- redis
'Spring' 카테고리의 다른 글
Argument(s) are different! Wanted: Actual invocations have different arguments: (0) | 2021.11.09 |
---|---|
Spring Boot jwt 사용하기 access token, refresh token 발급 (4) | 2021.11.09 |
스프링부트 웹소켓 stomp를 이용한 실시간 알림 구현 (0) | 2021.11.09 |
스프링부트 Redis로 캐시 적용하기 (0) | 2021.11.09 |
스프링부트 JPA 무한스크롤 구현 (0) | 2021.11.09 |