반응형

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

 

반응형

+ Recent posts